Vdaka za clanok.
Velmi dobra vec pri breakpointoch je moznost sputenia preddefinovanych prikazov ak bol breakpoint hitnuty (pripadne dat breakpointu podmienku). Tj. napriklad vypise comment, pripadne cez display zobrazi obsah registra apod.
(gdb) disass $pc, $pc+8
Dump of assembler code from 0x8048074 to 0x804807c:
=> 0x08048074: pop eax
0x08048075: pop edx
0x08048076: mov edx,DWORD PTR [edx]
0x08048078: sub esp,0x1000
End of assembler dump.
(gdb)
(gdb) b *0x08048078
Breakpoint 2 at 0x8048078
(gdb)
(gdb) command
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>print "about to mess up the stack"
>end
(gdb)
(gdb) c
Continuing.
Breakpoint 2, 0x08048078 in ?? ()
=> 0x08048078: 81 ec 00 10 00 00 sub esp,0x1000
$1 = "about to mess up the stack"
(gdb)
Btw tuší někdo, proč se kdysi zvolila zrovna ta prapodivná AT&T syntaxe? Jako chápu, že GNU nevznikl na Intelí platformě, ale AT&T je divná snad pro všechny typy procesorů - na každém je jiný znak pro komentář (například), někde se velikost operandů nemusí do instrukce psát, někde jo, je to dost zmatek. Navíc pokud vím, tak Intel tu svoji syntaxi a instrukční soubor taktéž někde už získal, takže to bylo známé minimálně někdy v roce 1972-73, spíš dřív.
Pro mě to byl kdysi docela blocker, jsem byl zvyklý na TASM, ten byl hrozně fajn :-) A samozřejmě Atari Macro Assembler, pěknej ale snad nejpomalejší na světě :.p
Ovsem v naprostem minumu pripadu, assembler to jinak pozna z druheho operandu. Asi nejcisteji to ma vyreseny NASM, ten jasne odlisuje praci s adresou od prace s obsahem adresy, GAS si pomaha slovem offset, coz je trosku nesikovne (a navic je to nekonzistentni).
Mluvim o tom, ze puvodne AT&T vyzadoval urceni velikosti vsude:
movw %bx, %ax (mov ax, bx)
xorl %eax, %eax (xor eax, eax)
movw $1, %ax (mov ax,1)
movb X, %ah (mov ah, byte ptr X)
movw X, %ax (mov ax, word ptr X)
movl X, %eax (mov eax, X)
Ted je to volnejsi, takze tam, kde je druhej operand registr a tudiz je jasna sirka, nemusime to psat.