IMHO.WS

IMHO.WS (https://www.imho.ws/index.php)
-   Программирование (https://www.imho.ws/forumdisplay.php?f=40)
-   -   ASM + Delphi - передача и изменение var параметра. (https://www.imho.ws/showthread.php?t=70361)

/7y3uK 07.10.2004 01:09

ASM + Delphi - передача и изменение var параметра.
 
Пишу на дельфе ридер кой-какого типа файлов. Данные там рассчитаны для MAC и PC - различие в порядке чтения байтов для 16-битных и 32-битных целых. Столкнулся с тем,
что в дельфе нет встроенной функции свопа длинного целого, зато такой оператор есть во встроенном асме. Вопрос - как правильно и коротко написать процедуру свопа длинного целого в данном случае на асме. Вот мой вариант, но ИМХО можно по другому.

procedure Swp(var v: LongWord);

function SW(Value: LongWord):LongWord;
asm
BSWAP EAX
end;

begin

v:=SW(v);

end;

Gem Single 08.10.2004 23:53

procedure swp(var Value: LongWord); assembler;
asm
bswap [eax]
end;

/7y3uK 09.10.2004 00:38

Цитата:

Gem Single:
procedure swp(var Value: LongWord); assembler;
asm
bswap [eax]
end;
[Error] MainUnit.pas(81): Invalid combination of opcode and operands

не так...
ИМХО локальная переменная один хрен в EAX у тебя, а ты собираешься по адресу ее свопить, тады хоть пропиши так BSWAP LONGWORD PTR [EAX], но это тоже самое, если даже ввести дополнительную локальную переменную. Суть вопроса, как в ASM встаке присвоить результат именно var переменной Value, которая лежит в EAX как параметр.

Gem Single 09.10.2004 23:20

гкхм... не посмотрел, что BSWAP воспринимает только значение в регистре... сорри.

procedure swp(var Value: LongWord);
asm
mov edx, [Value]
bswap edx
mov [Value], edx
end;

p.s.: никакой локальной переменной здесь нет, не надо наезжать.
в eax у меня -- АДРЕС фактического аргумента, и при помощи [eax] я обращаюсь именно к фактическому аргументу.

/7y3uK 10.10.2004 15:11

О, точно, ты прям глаза мне открыл....
Держи в репу, т.е. в весы.


Часовой пояс GMT +4, время: 00:13.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.