2011-03-06 16 views
18

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

+0

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. –

+0

'Düzenleme reg' oldukça açıkçası korkunç. – Sunspawn

cevap

27

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.

+6

Ayrıca, '$ eflags' yazdırabilirsiniz, '' print/x $ eflags '' –

+0

ç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

+0

@Employed Rusça: Eğer bunu bir cevap olarak gönderiyorsanız, ben de size oy vereceğim – Hinton

4

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.

0

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