数据传送指令与栈操作

数据传送指令

指令 效果 描述
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

猜你喜欢

转载自blog.csdn.net/wareric/article/details/80025262
今日推荐