Gdb ile hata ayıklama yaptığım bir x86 assembler programı var. Gdb içinde taşıma bayrağı durumunu yazdırmak için "print $ cf" gibi bir yol var mı?Montajlı gdb: Taşıma bayrağı yazdırma durumu
cevap
Sen kullanabilirsiniz:
info registers eflags
bayrakları kümesinin tamamını alır. eflags
sicil taşıma ile 0x41
ayarlı ve sıfır bayrakları ayarlandığı anlamına gelir
eflags 0x41 [ CF ZF ]
: Sen gibi bir satır göreceksiniz.
Ayrıca, '$ eflags' yazdırabilirsiniz, '' print/x $ eflags '' –
çok teşekkürler! Bu sayfadaki "yanıtı kabul et" onay kutusunu bulmama yardımcı olabilir misiniz? EDIT AH tamam sadece büyük onay işareti – Hinton
@Employed Rusça: Eğer bunu bir cevap olarak gönderiyorsanız, ben de size oy vereceğim – Hinton
Ben EFLAGS, "p" "baskı" komutu için sadece kısa olduğu
(gdb) p $eflags
$3 = [ PF ZF IF ]
kullanarak kayıt edin.
Ayrıca "/ t" (ayrıca onaltılık için onaltılık/x için) kullanarak bitleri görmeye yardımcı olur.
(gdb) p/t $eflags
$4 = 1001000110
Ardından EFLAGS kayıt için chart ile karşılaştırabilirsiniz.
gdb ile başka güzel bir seçenek de eflags üzerinde bir izleme noktası eklemektir. TutorialPoint assembly tutorial
[email protected]:~/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)
watchpoint eflags olmuştur kaydolması Carry Bayrağı ve Bayrak ayarlayın o yakalar: tutorialspoint iyi bir öğretici bulunduğu haliyle
GDB Examining the Symbol Table
Bu program 12345 ve 23456 toplanmasından ibarettir program '6' ve '5' eklendiğinde değiştirildi
Eğer 'layout reg' kullanırsanız, kayıt değerleriyle (EFLAGS dahil) bir bölünmüş ekran elde edersiniz. Son tek adımla değiştirilen kayıtlar vurgulanır, bu yüzden hata ayıklama için gerçekten harika. Kısa bir açıklama için http://stackoverflow.com/tags/x86/info adresine bakın. –
'Düzenleme reg' oldukça açıkçası korkunç. – Sunspawn