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
Respuesta
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 eflags
0x41
, con el acarreo y de ajuste a cero banderas.
También puede ''imprimir $ eflags'', o'' print/x $ eflags'' –
¡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
@Employed Russian: Si publica esto como respuesta, también lo votaré – Hinton
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.
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'
- 1. Bonito aumento de impresión :: unordered_map en gdb
- 2. Cómo obtener el estado del trabajo de impresión con C#
- 3. Pregunta de GDB: ¿impresión bonita de una matriz 2D?
- 4. gdb impresión bonita con llamadas a funciones directas
- 5. ¿Cómo uso el tiempo local de Perl con impresión para obtener la marca de tiempo?
- 6. Cadena de impresión apuntada desde Registrarse en GDB
- 7. Depuración de bibliotecas desmontadas con gdb
- 8. Transporte de JMS v/s Transporte de MQ
- 9. nuevas líneas de impresión con la impresión() en I
- 10. Webkit Guía de transporte
- 11. problema de gdb con la redirección stdin
- 12. Conversor de ensamblador de Microsoft a ensamblador GNU
- 13. - Ayuda con la impresión de una tabla
- 14. protocolo de transporte en WCF
- 15. Usando ZeroMQ con C# con inproc transporte
- 16. plantillas de depuración con GDB
- 17. Depurar qemu con gdb
- 18. ¿Cómo puedo arreglar este diseño de impresión con Float (en la hoja de estilo de impresión)?
- 19. espacios de impresión con String.Format()
- 20. Marca de agua con PDFBox
- 21. Algoritmo de transporte público de bus
- 22. de impresión de la ejecución
- 23. Ejecutando código ensamblador con python
- 24. Banderas de desbordamiento y transporte en Z80
- 25. WCF no puede leer datos de la conexión de transporte
- 26. Conversión de un ensamblador en línea GCC para Delphi ensamblador
- 27. Rails created_at orden de la marca de tiempo no concuerda con la orden de identificación
- 28. Hora de la última actualización marca de tiempo con JPA
- 29. Desarrollo de aplicaciones de Android con lenguaje ensamblador
- 30. Estado de la llamada saliente
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. –
'layout reg' es bastante franco. – Sunspawn