- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试学习如何编写和理解 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/
我们都知道,在查看源代码时,可以安全地假设方向标志是明确的。方向标志的概率很低。 我想了解其他标志的概率。这就是为什么我编写了一个测试程序来单步执行我现有的一些软件,为前 12 个 EFLAGS 位中
我正在尝试学习如何编写和理解 x86 Assembly 以及如何有效地使用 GDB 和相关工具。为此,我使用 DDD 作为 GDB 的前端。 我无法理解给出的条件标志(eflags?)是什么,它们似乎
我正在尝试学习如何编写和理解 x86 Assembly 以及如何有效地使用 GDB 和相关工具。为此,我使用 DDD 作为 GDB 的前端。 我无法理解给出的条件标志(eflags?)是什么,它们似乎
我想知道为什么EFLAGS寄存器未定义的第二位默认设置为1。所有其他未定义/保留位都设置为 0。这是否有特殊含义? 最佳答案 它是“保留”,而不是“未定义”。据推测,它反射(reflect)了一些根本
对于我学校的任务,我需要编写一个 C 程序,该程序使用汇编程序执行 16 位加法。除了结果外,还应返回 EFLAGS。 这是我的 C 程序: int add(int a, int b, unsigne
这个问题已经有答案了: Problem switching to v8086 mode from 32-bit protected mode by setting EFLAGS.VM to 1 (2
我正在使用 Win32 API 来停止/启动/检查/更改线程状态。一般来说效果很好。有时它会失败,我试图找出原因。 我有一个线程通过以下方式强制在其他线程上进行上下文切换: thread stop f
这是对 What is "=qm" in extended assembler 的跟进. 使用时 RDRAND ,它设置(或取消设置)进位标志( CF ): char rc; unsigned int
我处于以当前权限级别 (CPL=0) 运行的 32 位保护模式。我试图通过将 EFLAGS.VM(位 17)标志设置为 1(并将 IOPL 设置为 0)并对我的 16 位实模式代码执行 FAR JMP
我读到,如果可以修改 eflags 位 18(AC - 对齐检查),您就知道 CPU 是 486 或更新版本。在 386 上,该位无法修改。 我从 this site 中提取了以下汇编代码并添加了详尽
我是一名优秀的程序员,十分优秀!