Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Вниз

Ругается на (asm) Mov result,SE:   Найти похожие ветки 

 
Донской   (2003-11-17 19:27) [0]

День добрый!
В строке с восклицательными знаками компилятор Delphi выдает сообщение "Operand Size Mismatch"
Я уже какие только типы переменых не задавал....

function GetBaseAddress(Num:byte):Word;
var b:word;
d:word;
begin
num:=(num-1)*2;
b:=$400;
asm
push edx
push eax
MOV AX,0 //ES указывает на область данных в BIOS
MOV ES,AX
!!! mov result,ES:[b+num] //получаем базовый адрес COM
pop eax
pop edx
end;
end;


 
VMcL   (2003-11-17 19:32) [1]

В ОРЕШНИК!


 
Донской   (2003-11-17 19:33) [2]

Содержательно.
А поподробнее?


 
Владислав   (2003-11-17 19:34) [3]

Меня бы смутило то, что адрес 4 байта, а WORD всего 2, но это твои "проблемы".

push edx
push eax


Это излешне...

Юзай word ptr.


 
Донской   (2003-11-17 19:38) [4]

И так ругается

function TDirectPort.GetBaseAddress(Num:byte):dWord;
var b:word;
d:word;
begin
num:=(num-1)*2;
b:=$400;
//result:=$3f8;
asm
push edx
push eax
MOV AX,0
MOV ES,AX
mov word ptr result,ES:[b+num]
pop eax
pop edx
end;
end;


 
Владислав   (2003-11-17 19:54) [5]

> Донской © (17.11.03 19:38) [4]

Прикалываешься? :)
Если результат DWORD, то юзай dword ptr :)


 
Донской   (2003-11-17 20:00) [6]

А ну да...
...Все равно то же самое:

function GetBaseAddress(Num:byte):dWord;
var b:dword;
//d:word;
begin
num:=(num-1)*2;
b:=$400;
//result:=$3f8;
asm
push edx
push eax
MOV AX,0
MOV ES,AX
mov dword ptr result,ES:[b+num]
pop eax
pop edx
end;
end;

тут уж не до приколов... :)


 
Владислав   (2003-11-17 20:13) [7]

Фиг знает, чего сделать хочешь, но следующее поможет.

MOV EDX, dword ptr ES:[b+num]
mov result, EDX


 
Донской   (2003-11-17 20:19) [8]

Фуух...
Заработало
Спасибо, Владислав!!!


 
Владислав   (2003-11-17 20:22) [9]

:)

Пожалуйста :)


 
VMcL   (2003-11-17 20:36) [10]

Не, ну мне просто интересно, КАК оно заработало, если результат, который должен вернуться в AX затирается командой POP EAX?


 
VMcL   (2003-11-17 20:43) [11]

-> Донской © (17.11.03 20:19) [8]

Замечание 1:
- так ( Донской © (17.11.03 19:27)) обращаться к памяти в Win2K, боюсь не получится

Замечание 2:
- прежде, чем пытаться что-либо такое вымутить (имеется в виду built-in asm), не мешало быть раз надцать ткнуть F1 или что-нибуть типа этого и почитать про BASM и про ВАП процесса.


 
Донской   (2003-11-17 20:43) [12]

ДА вот так...
С точки зрения компилятора заработало...
Значит push и pop убираем...
Хотя result - то раньше записывается чем происходит pop,
или я не прав?


 
Владислав   (2003-11-17 21:22) [13]

Раньше-то раньше... Но POP то его "перетирает". Потом, задумайся над VMcL © (17.11.03 20:43) [11].

"... КАК оно заработало..." Оно скомпилировалось. Остальное, думаю, далеко еще до работы.


 
VMcL   (2003-11-17 21:22) [14]

С точки зрения формальной логики нужно написать что-нить вроде этого (но: см. VMcL c (17.11.03 20:43) [11])

function GetBaseAddress(Num: Byte): Word; {register;}
asm
push es
push bx
xor dx, dx
mov es, dx
mov bx, $0400
mov ah, 0
dec ax
shl ax, 1
add bx, ax
mov ax, es:[bx]
pop bx
pop es
end;


Но в Win32-приложении это работать не должно.


 
Владислав   (2003-11-17 21:30) [15]

> Донской © (17.11.03 19:27)

Советов уже "море". Чего хотели получить-то?


 
Донской   (2003-11-17 21:36) [16]

Я читаю адрес COM порта, номер которого задается в Num
из ячейки с адресом 0000:040х
где х = (num-1)*2
Еще там по-моему нужно поменять старшее и младшее слово местами,
если не ошибаюсь...


 
Донской   (2003-11-17 21:37) [17]

кстати в win32 работает но только под правами админа (или опытного пользователя - не проверял), чтобы иметь права для запуска giveio.sys


 
Владислав   (2003-11-17 21:40) [18]

"Я читаю адрес COM порта"
Ну в этом я не силен... Сдаюсь.


 
Донской   (2003-11-17 21:42) [19]

Ну типа из тех же ячеек памяти, из которых читает BIOS при загрузке компа...
Базовый адрес порта, по крайней мере в моей доке применяется именно такая формулировка :))


 
Владислав   (2003-11-17 21:45) [20]

Может тогда лучше воспользоваться возможностями, которые для этого предоставляет WIN32?


 
Донской   (2003-11-17 21:48) [21]

Неа, в том-то и дело.
Тут девайс дурацкий, который связывается с машиной через rs485
У него отвратительная привычка - он как только получает пакет, сразу пуляет ответ. А комп должен снять сигнал RTS, так как иначе пакет не придет, а будет задавлен этим сигналом. Так вот если делать это средствами Windows то получается, что система не успевает снять сигнал и портит начало пакета данных.


 
Донской   (2003-11-17 21:50) [22]

Приходится вручную, в отдельтном потоке проверять - как только ушел последний байт, сразу писать в базовый адрес порта + сдвиг = 4 маску $9, чтобы снять уровень в ноль.


 
Владислав   (2003-11-17 21:59) [23]

> Донской © (17.11.03 21:48) [21]

Ну в этом не помогу... Не знаю...

Донской © (17.11.03 21:50) [22]

"Приходится вручную, в отдельтном потоке проверять - как только ушел последний байт, сразу писать в базовый адрес порта..."

Тут есть маленькая проблемка... Система сама решает, какой поток "достоин" процессорного времени...


 
Донской   (2003-11-17 22:02) [24]

Един ответ, другого пока не знаю
SetThreadPriority


 
Владислав   (2003-11-17 22:29) [25]

Ню-ню... При таком подходе могу посоветовать только везения.



Страницы: 1 вся ветка

Форум: "Система";
Текущий архив: 2004.02.06;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.026 c
1-16349
Vitalik
2004-01-24 15:59
2004.02.06
Классы


14-16732
Baloo
2004-01-16 11:54
2004.02.06
Картинка про Дельфи


1-16434
Oleg_
2004-01-21 18:08
2004.02.06
Русские названия в intallshield


3-16098
Veetyok
2004-01-11 00:05
2004.02.06
SQL возможности


4-16789
mRodion
2003-12-02 10:24
2004.02.06
Сделать элемент TlistView в фокусе





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский