Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ругается на (asm) Mov result,SE: [2] - беру адрес COM порта [D5, Win2k]


Страницы:   1 2

Донской ©   (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;

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо