您的位置:首页 > 其它

[Assembly] 程序的机器级表示(二):数据传输指令

2017-05-30 20:51 267 查看

数据传输指令的形式

指令效果描述
mov S, DD ← S传送
movb传送字节
movw传送字
movl传送双字
movq传送四字
movabsq I, RD ← S传送绝对的四字

需要注意的点

传送指令的两操作数不可均为内存位置。

movl在以寄存器作为目的时,会把寄存器的高位设为0

例子:分别执行
movabsq $0xABCDEF0123456789, %r8
movl $0xFFFFFFFF, %r8d
,此时
%r8
寄存器的值为
00000000FFFFFFFF


movq仅可以操作32位补码的立即数,而movabsq仅可以以寄存器为目的地

符号扩展/零扩展

零扩展

指令效果描述
movz S, RR ← (零扩展)S以零扩展进行传送
movzbw将做了零扩展的字节传送到字
movzbl将做了零扩展的字节传送到双字
movzwl将做了零扩展的字传送到双字
movzbq将做了零扩展的字节传送到四字
movzwq将做了零扩展的字传送到四字

符号扩展

指令效果描述
movs S, RR ← (符号扩展)S以符号扩展进行传送
movsbw将做了符号扩展的字节传送到字
movsbl将做了符号扩展的字节传送到双字
movswl将做了符号扩展的字传送到双字
movsbq将做了符号扩展的字节传送到四字
movswq将做了符号扩展的字传送到四字
movslq将做了符号扩展的双字传送到四字
cltq%rax ← (符号扩展)%eax把%eax符号扩展到%rax

需要注意的点

不存在movzlq指令,想要实现将零扩展的双字传送到四字的操作,直接使用movl即可以实现,movl会将高位置0。

cltq指令没有操作数,会将
%eax
寄存器的内容做符号扩展到
%rax
寄存器。

示例

对于以下的C代码:

long exchange(long *xp, long y) {
long x = *xp;
*xp = y;
return x;
}


GCC将生成以下汇编代码:

; long exchange(long *xp, long y)
; xp in %rdi, y in %rsi
exchange:
movq   (%rdi), %rax
movq   %rsi, (%rdi)
ret
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐