Assembly 了解x86中的EFL寄存器,从1到0再到-1再返回

Assembly 了解x86中的EFL寄存器,从1到0再到-1再返回,assembly,x86,flags,Assembly,X86,Flags,我的书和大多数资料都显示,当进位标志从0更改为1时,我不明白为什么EFL寄存器会以更大的增量更改值,如下所示:我在注释中显示了寄存器值的更改。就像从0移动到1再返回到0到-1一样 mov eax , 0FFFFFFFFh add eax , 1 ;flag from A12 to 257 inc eax ; flag to 203 neg eax ; flag to 297 inc eax ; flag to

我的书和大多数资料都显示,当进位标志从0更改为1时,我不明白为什么EFL寄存器会以更大的增量更改值,如下所示:我在注释中显示了寄存器值的更改。就像从0移动到1再返回到0到-1一样

mov eax , 0FFFFFFFFh
add eax , 1         ;flag from A12 to 257
inc eax             ; flag to 203
neg eax             ; flag to 297
inc eax             ; flag to 257
dec eax             ; flag to 297

inc eax             ; flag to 257
dec eax             ; flag to 297

mov ebx , 0         ;flag doesnt move
sub ebx , 1         ;flag doesnt move

inc ebx             ; flag move to 257
dec ebx             ; flag move to 297


dec eax             ; flag to 283

mov ebx , 0         ;flag doesnt move
sub ebx , 1         ;flag to 297

mov eax , 00FFFFFFFh    ;flag doesnt move
add eax , 1         ;flag to 216

mov ebx , 0Fh           ;flag doesnt move
sub ebx , 1         ;flag to 202

正如注释中提到的@prl,将标志视为单个值是没有意义的。标志寄存器中的位是单独的标志,除IOPL外,还应视为不同的实体


条目有解释和引用,可以作为准确了解其工作原理的良好起点。

以十进制形式查看标志寄存器是没有意义的。它是一个位的集合,所以你应该用二进制(或者八进制或十六进制,如果你能在你的头脑中看到这些位的话,它们是等价的)来查看它。在标志寄存器中查找每个标志的位位置,并记下每个指令改变的标志,而且我想你会明白的。在这里没有
EFL
registerx86@phuclv将EFLAGS缩写为EFL并不少见。
EFLAGS
包含一组标志,
CF
只是其中之一。算术指令根据结果(如
ZF
SF
)和更改(如
CF
OF
)更新多个标志。因此,您需要查看各个位以了解每个标志。示例中有趣的是,
INC
DEC
实际上不更新
CF