Assembly 为什么不设置AF和SF?

Assembly 为什么不设置AF和SF?,assembly,x86,nasm,x86-64,Assembly,X86,Nasm,X86 64,我正在读Duntemann的书(第三版),刚刚开始学习x86汇编。我使用的是Fedora23(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 exp

我正在读Duntemann的书(第三版),刚刚开始学习x86汇编。我使用的是Fedora23(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
指令之前,
AF
SF
标志的设置与书中所声称的不一致。在
insight
中运行程序会显示32位寄存器,进一步确保可执行文件为32位。以下是
gdb
dec 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
(gdb)信息注册
eax 0xffffffff-1
ecx 0x0 0
edx 0x0 0
ebx 0x2d 45
esp 0xffffce80 0xffffce80
ebp 0x0 0x0
esi 0x0 0
电子数据交换0x0
eip 0x804806b 0x804806b
eflags 0x202[如果]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x0 0

Duntemann在217页的版本显示设置了
AF
SF
标志。我的代码有什么问题

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

这在中有记录,但如果你像我一样,你就是懒惰。幸运的是,我们很幸运。一些好心人已经将部分官方文档上传到他们的网站上,只需在谷歌上搜索“x86”和指令助记符的名称,就可以轻松找到这些文档。例如,我对“x86 mov”的最高结果是。请注意以下部分:

受影响的标志
没有

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

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

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

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

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



我没有你参考的那本书,所以我不知道它实际上写了什么。如果它只是在代码执行的那一点上显示寄存器/标志状态的转储,那么标志只是垃圾值,并不重要。您应该关注寄存器中的值是如何由于
mov
指令而改变的。如果这实际上意味着
mov
指令设置了标志,那么这本书就有一个bug:-)

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

这在中有记录,但如果你像我一样,你就是懒惰。幸运的是,我们很幸运。一些好心人已经将部分官方文档上传到他们的网站上,只需在谷歌上搜索“x86”和指令助记符的名称,就可以轻松找到这些文档。例如,我对“x86 mov”的最高结果是。请注意以下部分:

受影响的标志
没有

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

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

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

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

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


我没有你参考的那本书,所以我不知道它实际上写了什么。如果它只是在代码执行的那一点上显示寄存器/标志状态的转储,那么标志只是垃圾值,并不重要。您应该关注寄存器中的值是如何由于
mov
instru而改变的