![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ругается на (asm) Mov result,SE: [2] - беру адрес COM порта [D5, Win2k]
Донской © (2003-11-17 19:27:00)
День добрый!
В строке с восклицательными знаками компилятор 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;
Владислав (2003-11-17 22:29:00) [1]
Ню-ню... При таком подходе могу посоветовать только везения.
Донской (2003-11-17 22:02:00) [2]
Един ответ, другого пока не знаю
SetThreadPriority
Владислав (2003-11-17 21:59:00) [3]
> Донской © (17.11.03 21:48) [21]
Ну в этом не помогу... Не знаю...
Донской © (17.11.03 21:50) [22]
"Приходится вручную, в отдельтном потоке проверять - как только ушел последний байт, сразу писать в базовый адрес порта..."
Тут есть маленькая проблемка... Система сама решает, какой поток "достоин" процессорного времени...
Донской (2003-11-17 21:50:00) [4]
Приходится вручную, в отдельтном потоке проверять - как только ушел последний байт, сразу писать в базовый адрес порта + сдвиг = 4 маску $9, чтобы снять уровень в ноль.
Донской (2003-11-17 21:48:00) [5]
Неа, в том-то и дело.
Тут девайс дурацкий, который связывается с машиной через rs485
У него отвратительная привычка - он как только получает пакет, сразу пуляет ответ. А комп должен снять сигнал RTS, так как иначе пакет не придет, а будет задавлен этим сигналом. Так вот если делать это средствами Windows то получается, что система не успевает снять сигнал и портит начало пакета данных.
Владислав (2003-11-17 21:45:00) [6]
Может тогда лучше воспользоваться возможностями, которые для этого предоставляет WIN32?
Донской (2003-11-17 21:42:00) [7]
Ну типа из тех же ячеек памяти, из которых читает BIOS при загрузке компа...
Базовый адрес порта, по крайней мере в моей доке применяется именно такая формулировка :))
Владислав (2003-11-17 21:40:00) [8]
"Я читаю адрес COM порта"
Ну в этом я не силен... Сдаюсь.
Донской (2003-11-17 21:37:00) [9]
кстати в win32 работает но только под правами админа (или опытного пользователя - не проверял), чтобы иметь права для запуска giveio.sys
Донской (2003-11-17 21:36:00) [10]
Я читаю адрес COM порта, номер которого задается в Num
из ячейки с адресом 0000:040х
где х = (num-1)*2
Еще там по-моему нужно поменять старшее и младшее слово местами,
если не ошибаюсь...
Владислав (2003-11-17 21:30:00) [11]
> Донской © (17.11.03 19:27)
Советов уже "море". Чего хотели получить-то?
Владислав (2003-11-17 21:22:00) [12]
Раньше-то раньше... Но POP то его "перетирает". Потом, задумайся над VMcL © (17.11.03 20:43) [11].
"... КАК оно заработало..." Оно скомпилировалось. Остальное, думаю, далеко еще до работы.
VMcL (2003-11-17 21:22:00) [13]
С точки зрения формальной логики нужно написать что-нить вроде этого (но: см. 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 20:43:00) [14]
ДА вот так...
С точки зрения компилятора заработало...
Значит push и pop убираем...
Хотя result - то раньше записывается чем происходит pop,
или я не прав?
VMcL (2003-11-17 20:43:00) [15]
-> Донской © (17.11.03 20:19) [8]
Замечание 1:
- так ( Донской © (17.11.03 19:27)) обращаться к памяти в Win2K, боюсь не получится
Замечание 2:
- прежде, чем пытаться что-либо такое вымутить (имеется в виду built-in asm), не мешало быть раз надцать ткнуть F1 или что-нибуть типа этого и почитать про BASM и про ВАП процесса.
VMcL (2003-11-17 20:36:00) [16]
Не, ну мне просто интересно, КАКоно заработало, если результат, который должен вернуться в AX затирается командой POP EAX?
Владислав (2003-11-17 20:22:00) [17]
:)
Пожалуйста :)
Донской (2003-11-17 20:19:00) [18]
Фуух...
Заработало
Спасибо, Владислав!!!
Владислав (2003-11-17 20:13:00) [19]
Фиг знает, чего сделать хочешь, но следующее поможет.
MOV EDX, dword ptr ES:[b+num]
mov result, EDX
Донской (2003-11-17 20:00:00) [20]
А ну да...
...Все равно то же самое:
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;
тут уж не до приколов... :)