2011-03-06 5 views
18

Tengo un programa de ensamblador x86 que estoy depurando con gdb. ¿Hay alguna manera de imprimir el estado de la bandera de acarreo dentro de gdb con, como, "print $ cf"?gdb con ensamblador: estado de impresión de la marca de transporte

+0

Si usa 'layout reg', obtendrá una pantalla dividida con valores de registro (incluya EFLAGS). Los registros modificados por el último paso simple están resaltados, por lo que es realmente genial para la depuración. Vea http://stackoverflow.com/tags/x86/info para una descripción rápida. –

+0

'layout reg' es bastante franco. – Sunspawn

Respuesta

27

Se puede utilizar:

info registers eflags 

para obtener todo el conjunto de banderas. Verá una línea como:

eflags 0x41 [ CF ZF ] 

lo que significa que el registro se establece en eflags0x41, con el acarreo y de ajuste a cero banderas.

+6

También puede ''imprimir $ eflags'', o'' print/x $ eflags'' –

+0

¡muchas gracias! ¿podría ayudarme a encontrar la casilla de verificación "aceptar respuesta" en esta página ^^? EDITAR AH ok solo la gran marca de verificación – Hinton

+0

@Employed Russian: Si publica esto como respuesta, también lo votaré – Hinton

4

puedo comprobar el registro EFLAGS usando

(gdb) p $eflags 
$3 = [ PF ZF IF ] 

donde "p" es la abreviatura de la orden de "imprimir".

También me parece útil ver los bits usando "/ t" (también/x para hex,/d para decimal).

(gdb) p/t $eflags 
$4 = 1001000110 

continuación, puede comparar con el chart para el registro EFLAGS.

0

Otra buena opción con gdb es agregar un punto de observación en eflags.

GDB Examining the Symbol Table

Este es el programa para resumir 12345 y 23456 como se encuentra en un buen tutorial de tutorialspoint: 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) 

El punto de observación capta que el indicador de acarreo y ajustar bandera en el registro EFLAGS han sido alterado cuando el programa agrega '6' y '5'

Cuestiones relacionadas