[Assembly] 程序的机器级表示(二):数据传输指令
2017-05-30 20:51
267 查看
数据传输指令的形式
指令 | 效果 | 描述 |
---|---|---|
mov S, D | D ← S | 传送 |
movb | 传送字节 | |
movw | 传送字 | |
movl | 传送双字 | |
movq | 传送四字 | |
movabsq I, R | D ← S | 传送绝对的四字 |
需要注意的点
传送指令的两操作数不可均为内存位置。movl在以寄存器作为目的时,会把寄存器的高位设为0
例子:分别执行
movabsq $0xABCDEF0123456789, %r8和
movl $0xFFFFFFFF, %r8d,此时
%r8寄存器的值为
00000000FFFFFFFF
movq仅可以操作32位补码的立即数,而movabsq仅可以以寄存器为目的地
符号扩展/零扩展
零扩展
指令 | 效果 | 描述 |
---|---|---|
movz S, R | R ← (零扩展)S | 以零扩展进行传送 |
movzbw | 将做了零扩展的字节传送到字 | |
movzbl | 将做了零扩展的字节传送到双字 | |
movzwl | 将做了零扩展的字传送到双字 | |
movzbq | 将做了零扩展的字节传送到四字 | |
movzwq | 将做了零扩展的字传送到四字 |
符号扩展
指令 | 效果 | 描述 |
---|---|---|
movs S, R | R ← (符号扩展)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
相关文章推荐
- [Assembly] 程序的机器级表示(三):栈指令、算术和逻辑指令
- 写一个程序判断机器的的数据表示采用的是大端还是小端?
- 程序的机器级表示(数据格式,操作数格式)
- [Assembly] 程序的机器级表示(一)
- 数据在机器里的存储问题(c程序)
- 深入研究数据在机器内的存储表示
- 数据传输指令
- 字符串处理是许多程序中非常重要的一部分,它们可以用于文本显示,数据表示,查找键和很多目的.在Unix下,用户可以使用正则表达式的强健功能实现这些 目的,从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础
- 六星经典CSAPP-笔记(3)程序的机器级表示
- 程序的机器级表示
- C基础----Unix指令、程序步骤、关键字、数据
- 第一章——数据的机器层次表示
- CSAPP读书笔记——程序的机器级表示之栈帧结构
- 实验 3.1.5 查看代码中各数据存储位置 示例程序: mem_add.c 1. 在自己的机器上运行示例程序。 2. 分析实验结果,图示程序运行时各数据位置。
- 程序的机器级表示(IA32,AT&T,一)
- 程序的机器级表示
- SAP 中主要业务对象表的标准数据传输程序...
- 汇编语言三 设数组ARRAY存储多个8位无符号数据,其中第一个字用于存放数据个数,试编写程序求数组元素之和,将结果存放在AX中,若计算的和超过16位数表示的范围,则给出溢出标志DX=-1,否则D
- 程序的机器级表示·三
- 如何做一个最完美的实时数据传输程序