Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.02.06;
Скачать: CL | DM;

Вниз

Ругается на (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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.037 c
1-16439
Blade
2004-01-28 12:31
2004.02.06
Потоки


1-16367
Кен
2004-01-16 06:03
2004.02.06
Как подружить тритичную систему с двоичной ?


1-16431
siriusP
2004-01-22 10:23
2004.02.06
Где ошибка при вызове ф-ции DLL?


1-16332
Andrey_Shalin
2004-01-25 05:44
2004.02.06
Потоки


3-16097
qwe
2004-01-16 09:57
2004.02.06
select FB 1.5 RC8