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