registros registro lenguaje instrucciones ensamblador ejemplos corchetes carry banderas gdb assembly carryflag

gdb - lenguaje - registro flags



gdb con ensamblador: estado de impresiĆ³n de bandera de acarreo (3)

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

GDB examinando la tabla de símbolos

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

El puesto de observación detecta que la Bandera de transporte y la Bandera de ajuste en el registro de eflags se han modificado cuando el programa agrega ''6'' y ''5''

Tengo un programa ensamblador x86 que estoy depurando con gdb. ¿Hay alguna manera de imprimir el estado del indicador de acarreo dentro de gdb con, como, "print $ cf"?


Puedes usar:

info registers eflags

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

eflags 0x41 [ CF ZF ]

lo que significa que el registro de eflags se establece en 0x41 , con las banderas de acarreo y cero establecidas.


Reviso el registro de EFLAGS utilizando

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

donde "p" es solo la abreviatura del comando "imprimir".

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

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

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