我正在尝试学习如何编写和理解x86 Assembly,以及如何有效地使用GDB和相关工具。为此,我使用DDD作为GDB的前端。
我很难理解条件标记的是什么(eflag?)它们看起来都存储在同一个寄存器中。我将发布寄存器、汇编代码和相关的C代码。谢谢你的帮助。
在给定的断点处,寄存器显示如下:0x293 [CF AF SF IF]
以下是正在运行的C代码。(这不是我的编码风格的一个例子。我正在尝试强制GCC使用compl操作。)
int main( int argc, char* argv[] )
{
int a = 0;
int b = 2;
if( a == b ) // There is a breakpoint here!
goto EQUAL;
else
goto NEQUAL;
EQUAL:
return 3;
NEQUAL:
return 1;
}以下是我的机器将其分解成的程序集:
Dump of assembler code for function main:
0x0000000000400474 <+0>: push %rbp
0x0000000000400475 <+1>: mov %rsp,%rbp
0x0000000000400478 <+4>: mov %edi,-0x14(%rbp)
0x000000000040047b <+7>: mov %rsi,-0x20(%rbp)
0x000000000040047f <+11>: movl $0x0,-0x8(%rbp)
0x0000000000400486 <+18>: movl $0x2,-0x4(%rbp)
0x000000000040048d <+25>: mov -0x8(%rbp),%eax
0x0000000000400490 <+28>: cmp -0x4(%rbp),%eax
0x0000000000400493 <+31>: jne 0x40049d <main+41> # Break point here
0x0000000000400495 <+33>: nop
0x0000000000400496 <+34>: mov $0x3,%eax
0x000000000040049b <+39>: jmp 0x4004a3 <main+47>
0x000000000040049d <+41>: nop
0x000000000040049e <+42>: mov $0x1,%eax
0x00000000004004a3 <+47>: leaveq
0x00000000004004a4 <+48>: retq
End of assembler dump.发布于 2012-09-13 04:53:23
(R/E)FLAGS寄存器包含以下条件标志:
溢出标志( of )-用于确定有符号操作数上的整数算术操作(例如ADD、ADC、SUB、SBB指令)的溢出。条件分支/跳转( Jcc指令)可以直接检查此标志。
SF (符号标志)-它用于确定最后一次整数算术运算的结果是否为负值,SF基本上是结果的符号位(=最高有效位)的副本。同样,条件分支/跳转可以直接检查它。
ZF (零标志)-它用于确定最后一次整数算术或逻辑运算的结果是否为0。条件分支/跳转也可以直接检查它。
CF (进位标志)-与溢出标志( of )类似,它可用于确定对无符号操作数执行的整数算术操作的溢出。注意区别:CF表示未签名,为表示已签名。还要注意的是,CPU经常计算CF和OF,程序员有责任检查正确的标志。在大多数情况下,CPU不能也不能区分有符号和无符号操作数,因为结果是以相同的方式计算的,并且都是CPU的数据。程序员有责任将值解释为有符号或无符号,而不是CPU的。条件分支/跳转也可以直接检查CF。
编辑:还有使用CF的rotate through carry指令(RCL和RCR)。
整数比较(使用CMP指令)将导致上述四个标志的设置。如果要比较无符号整数,请检查ZF和/或CF。对于有符号整数比较,您需要检查ZF和/或对的SF +。参见条件转移/跳转指令(Jcc:JB、JNC、JE、JNGE等)。
奇偶校验标志PF和辅助进位标志AF是其他条件标志,但它们很少使用。
(R/E)FLAGS中的其余位是系统标志或控制标志。你可能只想知道其中的两个:
DF (方向标志)-它用于设置字符串指令的方向。字符串指令用于顺序访问内存,如块内存复制、块内存比较、块内存搜索、块内存填充(参见MOVSB/W/D/Q、CMPSB/W/D/Q、SCASB/W/D/Q、STOSB/W/D/Q、LODSB/W/D/Q)。此标志的值指示内存操作数地址在每次迭代后应递增还是递减。
如果为(中断标志),则为-它用于启用或禁用硬件中断处理。如果你开始进行非常低级的编程(驱动程序、操作系统内核等等),你将不得不使用这个标志。
事情就是这样。所有细节都可以在英特尔和AMD的官方CPU文档中找到。去下载CPU手册。
了解以下内容也很有用:
https://stackoverflow.com/questions/12395477
复制相似问题