首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用汇编程序的gdb :打印进位标志的状态

使用汇编程序的gdb :打印进位标志的状态
EN

Stack Overflow用户
提问于 2011-03-06 20:05:14
回答 3查看 36.8K关注 0票数 36

我有一个正在用gdb调试的x86汇编程序。有没有办法在gdb中打印进位标志的状态,比如"print $cf"?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-06 20:16:49

您可以使用:

代码语言:javascript
复制
info registers eflags

来获取整个标志集。您将看到如下所示的行:

代码语言:javascript
复制
eflags  0x41  [ CF ZF ]

这意味着将eflags寄存器设置为0x41,并设置进位和零标志。

票数 42
EN

Stack Overflow用户

发布于 2015-12-08 05:03:47

我使用以下命令检查EFLAGS寄存器

代码语言:javascript
复制
(gdb) p $eflags
$3 = [ PF ZF IF ]

其中"p“只是"print”命令的缩写。

我还发现使用"/t“( /x表示十六进制,/d表示十进制)查看比特也很有帮助。

代码语言:javascript
复制
(gdb) p/t $eflags
$4 = 1001000110

然后,可以与EFLAGS寄存器的chart进行比较。

票数 9
EN

Stack Overflow用户

发布于 2017-04-06 03:45:31

使用gdb的另一个很好的选择是在eflag上添加一个观察点。

GDB Examining the Symbol Table

这是一个12345和23456的程序,可以在tutorialspoint中找到一个很好的教程:TutorialPoint assembly tutorial

代码语言:javascript
复制
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) 

当程序添加'6‘和'5’时,观察点捕捉到eflags寄存器中的进位标志和调整标志已被更改

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5210354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档