私はgdbでデバッグしているx86アセンブラープログラムを持っています。 「print $ cf」のように、gdb内のキャリーフラグのステータスを出力する方法はありますか?
以下を使用できます。
info registers eflags
フラグのセット全体を取得します。次のような行が表示されます。
eflags 0x41 [ CF ZF ]
つまり、キャリーフラグとゼロフラグが設定されたeflags
レジスターが0x41
に設定されます。
私はEFLAGSレジスタを使用してチェックします
(gdb) p $eflags
$3 = [ PF ZF IF ]
ここで、「p」は「print」コマンドの略です。
また、 "/ t"を使用してビットを確認することも役立ちます(16進数の場合は/ x、10進数の場合は/ d)。
(gdb) p/t $eflags
$4 = 1001000110
次に、EFLAGSレジスタの chart と比較できます。
Gdbのもう1つの素晴らしいオプションは、eflagsにウォッチポイントを追加することです。
これは、tutorialspointの優れたチュートリアルにある12345と23456を合計するプログラムです。 TutorialPoint Assembly tutorial
unroot@unroot-VirtualBox:~/NASM$ gdb -q add5Dig
Reading symbols from add5Dig...done.
(gdb) set listsize 100
(gdb) list 0
1 section .text
2 global _start
3
4 _start:
5 mov ecx,5 ;number of digits in each number to be added
6 mov esi,4 ;used to move the esi pointer to point at the rightmost digits to be summed
7 clc ;clear carry flag
8
9 add_loop: ;iterates through add_loop, decrementing ecx after each iteration until ecx equals 0
10 mov al,[num1+esi] ;mov
11 adc al,[num2+esi] ;add with carry, nicely sets carry to 0 if there is no carry and to 1 if there is a carry
12 aaa ;ascii adjust after addition
13 pushf ;Push flags onto stack
14 or al,30h ;OR value with 0b0001 1110. (essentially adds 0x30 to the ascii adjusted value, ascii 0x30 is '0', which converts the number to its ascii representation for proper display)
15 popf ;pop flags from stack
16
17 mov [sum+esi],al ;moves sum of the two digits into the correct space in memory
18 dec esi ;point esi at the next digit to the left
19 loop add_loop ;checks if exc==0, loops if not, continues if yes
20 ;printing message
21 mov edx,len
22 mov ecx,msg
23 mov ebx,1
24 mov eax,4
25 int 0x80
26 ;printing sum
27 mov edx,5
28 mov ecx,sum
29 mov ebx,1
30 mov eax,4
31 int 0x80
32 ;exiting
33 mov eax,1
34 int 0x80
35
36 section .data
37 msg db 'The sum is:',0xa
38 len equ $ - msg
39 num1 db '12345'
40 num2 db '23456'
41 sum db ' ' ;reserves 5 spaces in memory for sum
(gdb) break _start
Breakpoint 1 at 0x8048080
(gdb) break add_loop
Breakpoint 2 at 0x804808b
(gdb) run
Starting program: /home/unroot/NASM/add5Dig
Breakpoint 1, 0x08048080 in _start ()
(gdb) watch $eflags
Watchpoint 3: $eflags
(gdb) info registers
eax 0x0 0
ecx 0x0 0
edx 0x0 0
ebx 0x0 0
esp 0xbffff0b0 0xbffff0b0
ebp 0x0 0x0
esi 0x0 0
edi 0x0 0
eip 0x8048080 0x8048080 <_start>
eflags 0x202 [ IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb) cont
Continuing.
Breakpoint 2, 0x0804808b in add_loop ()
(gdb) info registers
eax 0x0 0
ecx 0x5 5
edx 0x0 0
ebx 0x0 0
esp 0xbffff0b0 0xbffff0b0
ebp 0x0 0x0
esi 0x4 4
edi 0x0 0
eip 0x804808b 0x804808b <add_loop>
eflags 0x202 [ IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb) cont
Continuing.
Watchpoint 3: $eflags
Old value = [ IF ]
New value = [ CF AF IF ]
0x08048098 in add_loop ()
(gdb) info registers
eax 0x101 257
ecx 0x5 5
edx 0x0 0
ebx 0x0 0
esp 0xbffff0b0 0xbffff0b0
ebp 0x0 0x0
esi 0x4 4
edi 0x0 0
eip 0x8048098 0x8048098 <add_loop+13>
eflags 0x213 [ CF AF IF ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x0 0
(gdb)
ウォッチポイントは、プログラムが「6」と「5」を追加すると、eflagsレジスタのキャリーフラグと調整フラグが変更されたことをキャッチします。