数据传送指令
指令 | 效果 | 描述 |
---|---|---|
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