![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Ламерский вопрос по встроенному Assembler у [D6, WinME]
YY © (2002-04-30 18:51:00)Знатоки встроенного Ассемблера, ответьте, пожалуйста, бедному начинающему, в чём же здесь дело:
var
MPass:array [0..10] of Byte;
pos:Word;
begin
asm
.
.
mov BX,pos
mov AH,byte ptr MPass[BX]
.
.
end;
end;
На строкеmov AH,byte ptr MPass[BX]выдаётся ошибка "Operand size mismatch". То же самое, если писатьmov AH,MPass[BX].
Самое главное, что это прекрасно компилировалось и правильно работало в Turbo Pascal 7.0, а будучи скопированнымв Delphi, работать не хочет ни в какую.
YY (2002-05-01 13:25:00) [1]Большое спасибо всем за советы. Всё работает.
Я перевёл свой код с Pascal на Delphi.
Anatoly Podgoretsky (2002-05-01 10:24:00) [2]Это с времен 8086, но не принципиально, важно, что бы регистры были сохранены согласно спецификации конкретной версии Паскаля
PushA/PopA хороши если не нвдо возвращать знвчения.
Vovchik (2002-05-01 00:14:00) [3]>Anatoly Podgoretsky © (30.04.02 23:47)
Ну и ладно, сохраним. Просто как-то принято сохранять указатели в esi и edi.
Anatoly Podgoretsky (2002-04-30 23:47:00) [4]По твоему примеру надо ESI сохранять, а по его EBX
Vovchik (2002-04-30 23:31:00) [5]Приведённый мной пример работал в дельфи - я проверил. Чтобы не было проблем, можно добавить pusha, popa, но компилер спасает сам некоторые регистры. В хелпе написано какие.
Anatoly Podgoretsky (2002-04-30 22:39:00) [6]32 битная модель памяти
EBX
Но у тебя явно будут и другие проблемы, для началя прочитай хотя тему callng convention в части регистров
Vovchik (2002-04-30 22:18:00) [7]Надо так:
var
MPass:array [0..10] of Byte;
pos:Word;
begin
asm
.
.
//первый элемент
lea esi, MPass
mov ah, byte ptr [esi]
//шестой элемент
add esi, 5
mov ah, byte ptr [esi]
.
.
end;
end;
И опять же я это писал недавно.