CSAPP_3e

数据移动指令MOV示例

2020-07-03  本文已影响0人  橡树人
long exchange(long *xp, long y)
{
    long x = *xp;
    *xp = y;
    return x;
}

执行指令

gcc -Og -S exchange.c
cat exchange.s

输出

        .file   "exchange.c"
        .text
        .globl  exchange
        .type   exchange, @function
exchange:
.LFB0:
        .cfi_startproc
        movq    (%rdi), %rax
        movq    %rsi, (%rdi)
        ret
        .cfi_endproc
.LFE0:
        .size   exchange, .-exchange
        .ident  "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-39)"
        .section        .note.GNU-stack,"",@progbits

这个例子展示了MOV指令如何从内存读取值到寄存器,如何将值从寄存器写入到内存。

分析

  1. 当函数exchange开始执行时,函数参数xpy分别存储在%rdi%rsi中。
  2. 然后,指令movq (%rdi), %rax从内存中读取x,将值保存在寄存器%rax中,直接实现了操作x = *xp
  3. 接着,指令movq %rsi, (%rdi)将y写入寄存器%rdi中的xp指向的内存位置,直接实现操作*xp = y
  4. 最后,使用寄存器%rax从函数exchange中返回值,所以返回值是x

注意:

上一篇 下一篇

猜你喜欢

热点阅读