Форум: "Система";
Текущий архив: 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