setcc指令是否会对寄存器进行零扩展?以setnl cl为例
setcc指令是否会对寄存器进行零扩展?
问题说明
setcc指令仅会写入目标寄存器的低字节,比如执行指令setnl cl时,不少开发者会疑惑:对应的32位寄存器ecx或64位寄存器rcx是否会被自动零扩展?
结论
setcc指令不会对寄存器进行零扩展。它仅修改目标寄存器的低8位(例如cl对应ecx的低8位),寄存器的高位部分(32位模式下为高24位,64位模式下为高56位)会保持指令执行前的原有值,不会被清零或修改。
示例
假设在32位模式下,执行setnl cl前ecx的值为0x12345678:
- 如果条件满足(无小于,即CF=0且ZF=0),cl会被设置为
0x01,此时ecx的值变为0x12345601 - 如果条件不满足,cl会被设置为
0x00,此时ecx的值变为0x12345600
可见ecx的高24位0x123456始终保持不变,并未被零扩展。
内容的提问来源于stack exchange,提问作者RTC222
相关产品推荐
相关产品推荐

