если след. утверждение не верное, значит всё таки нужно ещё наложить ряд условий, которые я сформулирую позже ))) пока ограничемся простым:
Free Pascal при компиляции из Linux НЕВЕРНО вставляет ассемблерную вставку
mov ax,word ptr [50h]
заменяя её
mov eax, [0x50] (машинный код - a150000000)
что не одно и тоже! и естестно читает он не WORD а DWORD из памяти, хотя указанно именно PTR WORD!
ДОСовский делает верно:
MOV AX,WORD PTR DS:[50] (машинный код - 66a150000000)
как в виндусе я пока не знаю )
прошу проверить это утверждение, если это так, то следует написать об этом разработчикам, аналогично не мешает проверить на другие регистры (кроме ax) и память ([mem]) или возможно компилятор все делает верно, а исправляет какой-нить постоптимизатор... так как понятно, что команда меньше по объёму и 32-битные исполняются быстрее... но ведь я не просто набиваю руку, когда пишу PTR WORD(!) и потом не хочу искать в куче ассемблерного кода что же не правильно..
если это не так - тогда я займусь поиском условий, при которых это так ) потому что у меня именно так - проверил минуту назад несколько раз.
вот накорябал простенькую программку, сейчас нет под рукой Linux, но вроде приблизительно так должно быть:
- Код: Выделить всё
var
a:dword;
adr:pointer;
b:dword;
begin
adr:=@a; //адрес на A
asm
mov eax,07c0001h //пишем большое число
mov a,eax //в переменную A
mov ebx,adr
xor eax,eax //обнуляем eax вчистую
mov ax,word ptr [ebx] //читаем из адреса A ТОЛЬКО младшую часть (единице равна)
mov b,eax
end;
if b=1 then writeln('Ok') //Проверем так ли это )
else writeln('You are using Linux ? )');
Readln;
end.
хотя может быть надо использовать только статичную память а не через ebx...
компилировать с опциеей -Rintel