неверная интерпретация - похоже баг fpc :(

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

неверная интерпретация - похоже баг fpc :(

Сообщение Рождённый_в_СССР » 27.08.2008 00:48:46

разработчиков ОС на fpc волнует вопрос )

если след. утверждение не верное, значит всё таки нужно ещё наложить ряд условий, которые я сформулирую позже ))) пока ограничемся простым:

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
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Re: неверная интерпретация - похоже баг fpc :(

Сообщение Sergei I. Gorelkin » 28.08.2008 00:44:22

Проверил в Windows - работает корректно.
Правильность кода удобно проверять по ассемблерному листингу, который получается при компиляции с ключами -a -s -al (опционально еще -Amasm)

Вообще говоря, оптимизатор ассемблерные вставки не трогает, ему это категорически запрещено :)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: неверная интерпретация - похоже баг fpc :(

Сообщение bw » 28.08.2008 02:04:33

fpc 2.2.0, Debian GNU/Linux Etch, все нормально.
Пришлось добавить директиву {$asmmode intel}.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: неверная интерпретация - похоже баг fpc :(

Сообщение Рождённый_в_СССР » 28.08.2008 10:44:08

похоже это работает только со статичной памятью.
Вот пример:

Код: Выделить всё
begin
asm
    xor eax,eax
// db $66
    mov ax,word ptr [$b80000]
end;
end.


ассемблерный листинг, генерируемый fpc дает корректный код:
Код: Выделить всё
   call   FPC_INITIALIZEUNITS
   xorl   %eax,%eax
   movw   12058624,%ax
   call   FPC_DO_EXIT
   leave
   ret


Оба дизаcсемблера, которые стоят у меня (udcli и ollydbg) дают: (изучался .o)
Код: Выделить всё
0000000000000040 55               push ebp
0000000000000041 89e5             mov ebp, esp
0000000000000043 e8fcffffff       call 0x44
0000000000000048 31c0             xor eax, eax
000000000000004a a10000b800       mov eax, [0xb80000] (???)
000000000000004f e8fcffffff       call 0x50
0000000000000054 c9               leave
0000000000000055 c3               ret

где виден четко баг

аналогично bochs в дампе регистров при исполнении такого кода с брейком на call 0x50 в регистре rax (64-битный) дает 0x00000000ffffffff (в видеопамяти предварительно все было забито ff)
при этом все ПРЕКРАСНО работает, если искусственно изменить команду, добавив $66 (расскоментировать db $66):
Код: Выделить всё
0000000000000040 55               push ebp
0000000000000041 89e5             mov ebp, esp
0000000000000043 e8fcffffff       call 0x44
0000000000000048 31c0             xor eax, eax
000000000000004a 66a10000b800     mov ax, [0xb80000]
0000000000000050 e8fcffffff       call 0x51
0000000000000055 c9               leave
0000000000000056 c3               ret


прикрепил в архиве .pas, .o и .s

p.s. fpc 2.2.0, SuSE Linux 11.0
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Re: неверная интерпретация - похоже баг fpc :(

Сообщение bw » 28.08.2008 19:09:45

Объектник в архиве впорядке.
При комнипялции - код нормальный. Опять пришлось добавлять {$asmmode intel}.
Использую дизассемблер Dissy (ему нужны отладочные символы). Так же смотрел Biew.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: неверная интерпретация - похоже баг fpc :(

Сообщение Рождённый_в_СССР » 28.08.2008 21:33:23

Здесь объектник с раскоментированным db $66 ))) я перепутал файлы, простите, поторопился - меня всегда охватывает подобное, когда я нервничаю :(
завтра выложу нужный... я пробывал скомпилировать 4-мя различными компиляторами fpc (правда с svn не качал), завтра попробую так же svn 2.2 и 2.3
но если вы уверяете, что у вас все нормально после компиляции - то действительно, пора обновить компилятор ) хоть надежда есть
к сожалению весь проект сейчас на работе и проверить не могу, но надежда - радует
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Re: неверная интерпретация - похоже баг fpc :(

Сообщение bw » 28.08.2008 23:03:34

Неа. Проблема все же существует.
Заключается она в кривости встроенного ELF-ассемблера (вероятно PECOFF работает нормально). Если компилятору передать флаг -Aas и тем самым принудить его использовать GNU Assembler вместо встроенного, то код получается корректным. Такого же эффекта можно достигнуть передав флаг -a, видимо в этом случае так же используется внешний компилятор.

p.s. Первый пример компилируется нормально.

..bw
Аватара пользователя
bw
постоялец
 
Сообщения: 359
Зарегистрирован: 01.12.2005 11:36:23
Откуда: Усть-Илимск

Re: неверная интерпретация - похоже баг fpc :(

Сообщение Рождённый_в_СССР » 07.11.2008 19:49:06

а баг как был так и остался во всех версиях fpc) в понедельник глядел r 2.2.2 со снепшота... я лично решил его заменив
Код: Выделить всё
add ebx,eax
          add ebx,eax

на
Код: Выделить всё
add bx,ax
          add bx,ax


тогда хоть и mov ax,word ptr [50h] путем каких то махинаций в линуксе заменяется на mov eax, [0x50]... старшая часть регистра eax (которая не нулевая, так как в памяти там по соседству другие параметры хранятся) не некапливается в bx и все прекрасно работает...
но в ощем обидно будет если кто-то наткнется на него и так же мучаться будет с ассемблерными листингами... хотя описание проблемы и место где она - я явно указал ещё черти когда... третий месяц пошел... но до сих пор никто не исправил...
Аватара пользователя
Рождённый_в_СССР
новенький
 
Сообщения: 65
Зарегистрирован: 08.08.2007 01:03:26
Откуда: Саратов

Re: неверная интерпретация - похоже баг fpc :(

Сообщение Sergei I. Gorelkin » 09.11.2008 15:19:07

Исправлено в ревизии 12041.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 67

Рейтинг@Mail.ru