美文网首页CSAPP_3e
数据移动指令MOV示例

数据移动指令MOV示例

作者: 橡树人 | 来源:发表于2020-07-03 07:27 被阅读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指令如何从内存读取值到寄存器,如何将值从寄存器写入到内存。

分析

  • 函数exchange仅使用3条指令:两条数据移动指令movq和一条返回到调用函数exchange的位置的指令ret
  • 传递给函数的实参在寄存器中。
  • 函数通过将值保存在寄存器%rax或者该寄存器中的低位部分之一来实现返回值。
  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

注意:

  • 在C语言中的指针只是地址而已,这点可从查看C源代码对应的汇编码可知。
  • 解析一个指针包括拷贝该指针到寄存器,然后在内存引用中使用寄存器。
  • 比如局部变量x是存储在寄存器中,而不是内存位置。寄存器的访问速度要比内存块。

相关文章

  • 数据移动指令MOV示例

    执行指令 输出 这个例子展示了MOV指令如何从内存读取值到寄存器,如何将值从寄存器写入到内存。 分析 函数exch...

  • 汇编语言--汇编指令系统总结

    [数据传送指令] 一、通用数据传送指令 1、传送指令 MOV (move) 指令的汇编格式:MOV DST,SRC...

  • 14. ARM 汇编指令集2

    常用ARM指令1:s数据处理指令 数据传输指令 mov mvn 算术指令 ...

  • 汇编的数据处理指令

    mov指令 这个指令是最常用的数据转移指令,表示将原操作数转移到目的操作数,指令的格式为。mov 目的操作数,原操...

  • 汇编语言 学习笔记 (二)

    汇编语言学习笔记 三、8086基本指令 数据传送指令 通用数据传送指令 1. MOV传送指令 a. 对标志位无影响...

  • movsx

    movsx 汇编语言数据传送指令MOV的变体。带符号扩展,并传送。 例如: MOV BL,80HMOVSX AX,...

  • 不同的寻址方式

    不同的寻址方式 指令要处理的数据长度 8086指令能处理2种尺寸的数据:byte、word 思考:“mov [0]...

  • 汇编-指令-MOV

    在汇编语言中,MOV指令是数据传送指令,也是最基本的编程指令,用于将一个数据从源地址传送到目标地址(寄存器间的数据...

  • 汇编语言中mov、add、sub的可用操作对象

    mov、add、sub指令的目的操作数都不可以是数据(立即数) 以下例子均无使用 X ptr操作符 mov add...

  • 汇编指令mov

    mov把一个值放到寄存器里。 movsxmovzxlea

网友评论

    本文标题:数据移动指令MOV示例

    本文链接:https://www.haomeiwen.com/subject/jsdjqktx.html