x86汇编movsbq指令执行后%rax结果与预期不符疑问
结果产生原因
核心问题是你对%dl中存储的0xAA的符号位判断错误,同时忽略了movsbq会覆盖整个目标寄存器的特性:
- 8位寄存器
%dl存储的0xAA,换算为二进制是10101010,8位有符号数的符号位为最高位(第7位),这里值为1,属于有符号数范畴里的负数。 movsbq的作用是将8位有符号数符号扩展为64位有符号数,规则就是用源操作数的符号位填充所有高位空位,这里就会用1填充%rax除低8位之外的56位,最终得到0xFFFFFFFFFFFFFFAA。- 额外注意:
movsbq的目标操作数是64位寄存器%rax,执行时会直接覆盖整个寄存器的所有位,和第3行执行完的%rax旧值没有关联。
如果你想把
%dl的值做无符号扩展得到0x00000000000000AA,应该使用零扩展指令movzbq %dl, %rax,该指令会统一用0填充所有高位。
内容的提问来源于stack exchange,提问作者user14596364
相关产品推荐
相关产品推荐

