Ani*_*nha 3 x86 assembly integer-overflow cpu-registers ctf
请告诉我以下汇编(伪)代码的结果是什么?
我们已经设置寄存器的所有位EAX为0,这样反过来我们也有AH,AL和AX为0。但是,当我减去最低位AL,我们将采取补和补充,给我们一堆1秒,随后一0。
XOR eax, eax
SUB al 0x01
Run Code Online (Sandbox Code Playgroud)
因此,总而言之,我的问题是在执行上述代码时,将仅AL充满1,或者也将延续到AX和EAX。
从加/减进位到CFLA,EFLAGS中的进位标志。
的操作数sub al, 1是AL,而不是EAX。 具有8位操作数大小的指令不会影响EAX的高24位。
如果您想将整个EAX翻转为全一,则需要使用sub eax, 1。(或not eax或dec eax)。 sub al, 1是一条不同的指令,不同之处在于它仅影响AL(和EFLAGS),而不影响AL之外的任何位。
给我们一堆1,然后是0。
编号。以2的补码形式,-1用一个数字表示,其所有位均已设置。例如,在8位0xFF中为32位0xFFFFFFFF。随着0位在底部,这将代表-2。
AL将全为1,或者也将延续到AX和EAX。
刚刚 您可以自己尝试一下(如果仍然感到困惑,然后要求对结果进行解释)。