【问题标题】:Why AF and SF not set?为什么没有设置AF和SF?
【发布时间】:2017-05-12 18:24:44
【问题描述】:

我正在阅读 Duntemann 的书(第 3 版)并且刚刚开始学习 x86 汇编。我正在使用 Fedora 23(64 位)的变体。以下是代码:

section .data
section .text
    global  _start
_start:
    nop
; Put your experiments between the two nops...
    mov eax,0FFFFFFFFh
    mov ebx,02Dh
    dec ebx
    inc eax 
; Put your experiments between the two nops...
    nop

我的makefile如下:

sandbox: sandbox.o
    ld -o sandbox sandbox.o -melf_i386
sandbox.o: sandbox.asm
    nasm -f elf -g -F stabs sandbox.asm -l sandbox.lst

所以你可以看到我已经小心地组装了一个 32 位的可执行文件,而不是 64 位的。然而,问题在于,在dec ebx 指令之前,AFSF 标志的设置并未与书中声称的相反。在insight 中运行程序会显示 32 位寄存器,这进一步确保了可执行文件是 32 位的。以下是gdbdec ebx 指令之前显示的状态。

(gdb) info reg
eax            0xffffffff   -1
ecx            0x0  0
edx            0x0  0
ebx            0x2d 45
esp            0xffffce80   0xffffce80
ebp            0x0  0x0
esi            0x0  0
edi            0x0  0
eip            0x804806b    0x804806b <_start+11>
eflags         0x202    [ IF ]
cs             0x23 35
ss             0x2b 43
ds             0x2b 43
es             0x2b 43
fs             0x0  0
gs             0x0  0

Pg 217 中的 Duntemann 版本显示设置了 AFSF 标志。我的代码有什么问题?

【问题讨论】:

  • movs 不设置标志。谷歌“intel manual 2”的官方文档,其中包含受它们影响的说明和标志

标签: assembly x86 nasm x86-64


【解决方案1】:

正如 Margaret Bloom 评论的那样,mov 指令没有设置标志!事实上,它对标志绝对没有任何影响,这在您想要设置寄存器或内存的内容而不破坏标志的当前状态的情况下非常有用。

这在the official Intel IA-32 ISA reference manual 中有记录,但如果你像我一样,你就是懒惰的。幸运的是,我们很幸运。好几位好心人已将官方文档的部分内容上传到他们的网站,只需在谷歌上搜索“x86”加上指令助记符的名称即可轻松找到这些内容。例如,“x86 mov”的最佳结果是this page。请注意以下部分:

标记受到影响
没有。

当然,其他说明会在那里说不同的东西。 add 指令几乎设置了所有标志,如您所见 here

因此,查看您的代码,执行将从设置为无意义的垃圾值的标志开始。从技术上讲,它们将包含它们最后设置的任何值,但这在您的程序上下文中是没有意义的,因为您没有将它们设置为任何值,因此不能依赖它们被设置为有意义的值!

nopmov 指令都不会影响标志的值,因此它们将继续包含垃圾值。

在执行dec 指令之前,标志不会包含有意义的值。然后,根据the documentation,将根据减量操作的结果设置溢出、符号、零、调整和奇偶校验标志。进位标志不受dec 影响,因此将继续包含垃圾值。

inc instruction 设置标志的方式与dec 完全相同,因此溢出、符号、零、调整和奇偶校验标志会改变,但进位标志不会(并且会继续包含垃圾)值)。


我没有你引用的那本书的副本,所以我不知道它到底在说什么。如果它只是在代码执行时显示寄存器/标志状态的转储,那么这些标志只是垃圾值,并不重要——你应该关注寄存器中的值是如何变化的mov 指令的结果。如果它实际上暗示mov 指令设置了标志,那么这本书有一个错误。 :-)

【讨论】:

  • 我什至不知道标志可以有垃圾值。是的,作者从来没有说过为什么首先设置 AF 和 SF 标志。更令人惊讶的是,我无法理解如何设置 AF 标志。
  • 好吧,它们对你来说是垃圾。在你之前执行的任何代码都不会认为它们是垃圾。没有指令实际上将它们设置为垃圾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 2012-05-23
  • 2013-01-21
  • 2021-03-05
  • 2016-04-06
  • 1970-01-01
  • 2015-03-06
相关资源
最近更新 更多