gpt4 book ai didi

assembly - 在 DDD 中解释 eFlags

转载 作者:行者123 更新时间:2023-12-02 17:47:53 25 4
gpt4 key购买 nike

我正在尝试学习如何编写和理解 x86 Assembly 以及如何有效地使用 GDB 和相关工具。为此,我使用 DDD 作为 GDB 的前端。

我无法理解给出的条件标志(eflags?)是什么,它们似乎都存储在同一个寄存器中。我将发布寄存器、汇编代码和相关的 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.

最佳答案

eflags 寄存器由单个位组成,每个位都是一个标志。

显示标志时,它们可以组合成一个更大的数字实体(例如您示例中的 0x293),或者每个都可以有自己的符号(例如“[CF AF SF IF]”中带有进位标志 CF ,调整标志AF,标志标志SF和中断标志IF。

Intel 64 and IA 32 Architecture Software Developer's Manual Vol. 1在第 3.4.3 章中详细描述了这些标志。

最重要的(对于应用程序开发人员)是:

bit | sym | name------------------  0 |  CF | carry  1 |  -- | (always 1)  2 |  PF | parity  3 |  -- | (always 0)  4 |  AF | adjust  5 |  -- | (always 0)  6 |  ZF | zero  7 |  SF | sign  8 |  TF | trap  9 |  IF | interrupt 10 |  DF | direction 11 |  OF | overflow

结合您的示例中的那些 (CF AF SF IF) 给出二进制值 1010010011,其中最右边的数字是进位标志,最左边的数字是中断标志。转换为十六进制它正好给出 0x293。

关于assembly - 在 DDD 中解释 eFlags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395477/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com