数据传送指令与栈操作
程序员文章站
2022-06-08 22:10:27
...
数据传送指令
指令 | 效果 | 描述 |
---|---|---|
MOV S,D | D<—S | 传送 |
movb | 传送字节 | |
movw | 传送字 | |
movl | 传送双字 | |
movq | 传送四字 | |
movabsq I,R | R<—I | 传送绝对的四字 |
简单的数据传送指令,注意两个操作数不能都是内存
指令 | 效果 | 描述 |
---|---|---|
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 |
符号扩展数据传送指令。MOVS指令以寄存器或内存地址作为源,以寄存器作为目的。cltq指令只作用于寄存器%eax和%rax
栈操作
x86-64中栈向下增长
寄存器%rsp用来对栈进行操作
指令 | 效果 | 描述 |
---|---|---|
push S | R[%rsp]<—R[%rsp]-8; | 将四字压入栈 |
M[R[%rsp]]<—S | ||
popq D | D<—M[R[%rsp]]; | 将四字弹出栈 |
R[%rsp]<—R[%rsp]+8 |
入栈是先将栈指针下移8位,然后赋值
- pushq %rbp 的行为等价于下面两条指令:
subq $8, %rsp Decrement stack pointer
movq %rbp, (%rsp) Store %rbp on stack
- popq %rax 等价于下面两条指令
movq (%rsp), %rax Read %rax from stack
addq $8, %rsp Increment stack pointer
上一篇: 进程栈与线程栈的关系
下一篇: ARM编程——ARM架构及汇编
推荐阅读
-
用SQL语句添加删除修改字段、一些表与字段的基本操作、数据库备份等
-
JavaScript数据结构学习之数组、栈与队列
-
Android设备与外接U盘实现数据读取操作的示例
-
Android之采用execSQL与rawQuery方法完成数据的添删改查操作详解
-
C#与SQL连接:GridView控件对数据库的操作
-
JavaScript数据结构与算法之栈与队列
-
php封装的pdo数据库操作工具类与用法示例
-
PHP封装类似thinkphp连贯操作数据库Db类与简单应用示例
-
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
-
Python3.5 Json与pickle实现数据序列化与反序列化操作示例