В Delphi это
1. точка останова
2. F8
3. Ctrl + Alt + C
А в FPC как?
Я так понимаю что
1. fpc -g filename.pp
2. gdb filename.exe
3. gdb break MYFUNC
а как дальше?
Как посмотереть асм листинг функции?
Модератор: Модераторы
- Иван Шихалев
- энтузиаст
- Сообщения: 1138
- Зарегистрирован: 15.05.2006 11:26:13
- Откуда: Екатеринбург
- Контактная информация:
Если нужен именно листинг — лучше скомпилировать с опцией -a (или -al) (см. <a href='http://freepascal.ru/wiki/index.php/%D0%9A%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D1%8F_%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80%D0%B0#.D0.9E.D0.BF.D1.86.D0.B8.D0.B8_.D0.BA.D0.BE.D0.BD.D1.82.D1.80.D0.BE.D0.BB.D1.8F_.D0.B2.D1.8B.D1.85.D0.BE.D0.B4.D0.BD.D1.8B.D1.85_.D1.84.D0.B0.D0.B9.D0.BB.D0.BE.D0.B2' target='_blank'>«Опции»</a>). Как в GDB — не знаю.
На выходе получаются файлы *.s где содержится ассемблерный код в синтаксисе AT&T несмотря даже на то что я указываю -Rintel
А так как я не сильно разбираюсь в АСМ'е то не умею определять где заканчивается одна функция и начинается другая... =)
Delphi даже показывает строчки на Pascal между асмовыми в CPU окне... а во FPC этого похоже нет? =(
А так как я не сильно разбираюсь в АСМ'е то не умею определять где заканчивается одна функция и начинается другая... =)
Delphi даже показывает строчки на Pascal между асмовыми в CPU окне... а во FPC этого похоже нет? =(
Вот к стати, с успешно скомпиленного примера по ммх--единственное, какой-то урод там всесто d1 необявленную переменную d2 использовать пытался--достаточно было вернуть на d1 |D
Опции--Options-->Compiler-->Assembler Tab-->List Options [x], Assembler Output =Use Masm. Дальше выбираешь просто компилировать
.386p
DGROUP GROUP _BSS,_DATA
ASSUME CS:_CODE,ES:DGROUP,DS:DGROUP,SS:DGROUP
EXTRN MMX_EMMS: NEAR
EXTRN FPC_DO_EXIT: NEAR
EXTRN THREADVARLIST_CPU: NEAR
EXTRN FPC_INITIALIZEUNITS: NEAR
EXTRN INIT$_SYSTEM: NEAR
EXTRN FINALIZE$_SYSTEM: NEAR
EXTRN INIT$_OBJPAS: NEAR
EXTRN FINALIZE$_OBJPAS: NEAR
EXTRN INIT$_MMX: NEAR
EXTRN THREADVARLIST_OBJPAS: NEAR
EXTRN THREADVARLIST_MMX: NEAR
EXTRN THREADVARLIST_SYSTEM: NEAR
_CODE SEGMENT PARA PUBLIC USE32 'CODE'
_CODE ENDS
_CODE SEGMENT PARA PUBLIC USE32 'CODE'
ALIGN 4
ALIGN 4
; [testmmx.pas]
; [7] begin
PUBLIC PASCALMAIN
PASCALMAIN:
PUBLIC _main
_main:
; Temps allocated between ebp+0 and ebp+0
push ebp
mov ebp,esp
call FPC_INITIALIZEUNITS
; [8] d1:=1.0;
fld1
fstp qword ptr [U_P$TESTMMX_D1]
fwait
; [11] for i:=0 to 10000 do
mov dword ptr [U_P$TESTMMX_I],0
dec dword ptr [U_P$TESTMMX_I]
ALIGN 4
@@8:
inc dword ptr [U_P$TESTMMX_I]
; [12] a[i]:=d1; { this is done with 64 bit moves }
mov edx,dword ptr [U_P$TESTMMX_I]
mov eax,dword ptr [U_P$TESTMMX_D1]
mov dword ptr [U_P$TESTMMX_A+edx*8],eax
mov eax,dword ptr [U_P$TESTMMX_D1+4]
mov dword ptr [U_P$TESTMMX_A+edx*8+4],eax
cmp dword ptr [U_P$TESTMMX_I],10000
jl @@8
; [14] emms; { clear fpu }
call MMX_EMMS
; [16] end.
call FPC_DO_EXIT
leave
ret
ALIGN 4
_CODE ENDS
_DATA SEGMENT PARA PUBLIC USE32 'DATA'
DB "FPC 2.0.0 [2005/05/08] for i386 - Win32"
ALIGN 4
ALIGN 4
PUBLIC THREADVARLIST_P$TESTMMX
THREADVARLIST_P$TESTMMX:
DD 0
ALIGN 4
PUBLIC FPC_THREADVARTABLES
FPC_THREADVARTABLES DD 5
DD THREADVARLIST_SYSTEM,THREADVARLIST_OBJPAS,THREADVARLIST_CPU,THREADVARLIST_MMX,THREADVARLIST_P$TESTMMX
ALIGN 4
PUBLIC FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES DD 0
ALIGN 4
PUBLIC INITFINAL
INITFINAL DD 3,0
DD INIT$_SYSTEM,FINALIZE$_SYSTEM,INIT$_OBJPAS,FINALIZE$_OBJPAS,INIT$_MMX,0
ALIGN 4
PUBLIC __stklen
__stklen DD 131072
PUBLIC __heapsize
__heapsize DD 2097152
_DATA ENDS
_DATA SEGMENT PARA PUBLIC USE32 'DATA'
_DATA ENDS
_DATA SEGMENT PARA PUBLIC USE32 'DATA'
_DATA ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
_BSS ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
ALIGN 4
U_P$TESTMMX_D1 DB 8 DUP(?)
_BSS ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
ALIGN 4
U_P$TESTMMX_A DB 80008 DUP(?)
_BSS ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
ALIGN 4
U_P$TESTMMX_I DB 4 DUP(?)
END

Опции--Options-->Compiler-->Assembler Tab-->List Options [x], Assembler Output =Use Masm. Дальше выбираешь просто компилировать
.386p
DGROUP GROUP _BSS,_DATA
ASSUME CS:_CODE,ES:DGROUP,DS:DGROUP,SS:DGROUP
EXTRN MMX_EMMS: NEAR
EXTRN FPC_DO_EXIT: NEAR
EXTRN THREADVARLIST_CPU: NEAR
EXTRN FPC_INITIALIZEUNITS: NEAR
EXTRN INIT$_SYSTEM: NEAR
EXTRN FINALIZE$_SYSTEM: NEAR
EXTRN INIT$_OBJPAS: NEAR
EXTRN FINALIZE$_OBJPAS: NEAR
EXTRN INIT$_MMX: NEAR
EXTRN THREADVARLIST_OBJPAS: NEAR
EXTRN THREADVARLIST_MMX: NEAR
EXTRN THREADVARLIST_SYSTEM: NEAR
_CODE SEGMENT PARA PUBLIC USE32 'CODE'
_CODE ENDS
_CODE SEGMENT PARA PUBLIC USE32 'CODE'
ALIGN 4
ALIGN 4
; [testmmx.pas]
; [7] begin
PUBLIC PASCALMAIN
PASCALMAIN:
PUBLIC _main
_main:
; Temps allocated between ebp+0 and ebp+0
push ebp
mov ebp,esp
call FPC_INITIALIZEUNITS
; [8] d1:=1.0;
fld1
fstp qword ptr [U_P$TESTMMX_D1]
fwait
; [11] for i:=0 to 10000 do
mov dword ptr [U_P$TESTMMX_I],0
dec dword ptr [U_P$TESTMMX_I]
ALIGN 4
@@8:
inc dword ptr [U_P$TESTMMX_I]
; [12] a[i]:=d1; { this is done with 64 bit moves }
mov edx,dword ptr [U_P$TESTMMX_I]
mov eax,dword ptr [U_P$TESTMMX_D1]
mov dword ptr [U_P$TESTMMX_A+edx*8],eax
mov eax,dword ptr [U_P$TESTMMX_D1+4]
mov dword ptr [U_P$TESTMMX_A+edx*8+4],eax
cmp dword ptr [U_P$TESTMMX_I],10000
jl @@8
; [14] emms; { clear fpu }
call MMX_EMMS
; [16] end.
call FPC_DO_EXIT
leave
ret
ALIGN 4
_CODE ENDS
_DATA SEGMENT PARA PUBLIC USE32 'DATA'
DB "FPC 2.0.0 [2005/05/08] for i386 - Win32"
ALIGN 4
ALIGN 4
PUBLIC THREADVARLIST_P$TESTMMX
THREADVARLIST_P$TESTMMX:
DD 0
ALIGN 4
PUBLIC FPC_THREADVARTABLES
FPC_THREADVARTABLES DD 5
DD THREADVARLIST_SYSTEM,THREADVARLIST_OBJPAS,THREADVARLIST_CPU,THREADVARLIST_MMX,THREADVARLIST_P$TESTMMX
ALIGN 4
PUBLIC FPC_RESOURCESTRINGTABLES
FPC_RESOURCESTRINGTABLES DD 0
ALIGN 4
PUBLIC INITFINAL
INITFINAL DD 3,0
DD INIT$_SYSTEM,FINALIZE$_SYSTEM,INIT$_OBJPAS,FINALIZE$_OBJPAS,INIT$_MMX,0
ALIGN 4
PUBLIC __stklen
__stklen DD 131072
PUBLIC __heapsize
__heapsize DD 2097152
_DATA ENDS
_DATA SEGMENT PARA PUBLIC USE32 'DATA'
_DATA ENDS
_DATA SEGMENT PARA PUBLIC USE32 'DATA'
_DATA ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
_BSS ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
ALIGN 4
U_P$TESTMMX_D1 DB 8 DUP(?)
_BSS ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
ALIGN 4
U_P$TESTMMX_A DB 80008 DUP(?)
_BSS ENDS
_BSS SEGMENT PARA PUBLIC USE32 'BSS'
ALIGN 4
U_P$TESTMMX_I DB 4 DUP(?)
END
