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.