數(shù)據(jù)移動指令MOV示例

long exchange(long *xp, long y)
{
    long x = *xp;
    *xp = y;
    return x;
}

執(zhí)行指令

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指令如何從內(nèi)存讀取值到寄存器,如何將值從寄存器寫入到內(nèi)存。

分析

  • 函數(shù)exchange僅使用3條指令:兩條數(shù)據(jù)移動指令movq和一條返回到調(diào)用函數(shù)exchange的位置的指令ret。
  • 傳遞給函數(shù)的實參在寄存器中。
  • 函數(shù)通過將值保存在寄存器%rax或者該寄存器中的低位部分之一來實現(xiàn)返回值。
  1. 當函數(shù)exchange開始執(zhí)行時,函數(shù)參數(shù)xpy分別存儲在%rdi%rsi中。
  2. 然后,指令movq (%rdi), %rax從內(nèi)存中讀取x,將值保存在寄存器%rax中,直接實現(xiàn)了操作x = *xp
  3. 接著,指令movq %rsi, (%rdi)將y寫入寄存器%rdi中的xp指向的內(nèi)存位置,直接實現(xiàn)操作*xp = y
  4. 最后,使用寄存器%rax從函數(shù)exchange中返回值,所以返回值是x。

注意:

  • 在C語言中的指針只是地址而已,這點可從查看C源代碼對應(yīng)的匯編碼可知。
  • 解析一個指針包括拷貝該指針到寄存器,然后在內(nèi)存引用中使用寄存器。
  • 比如局部變量x是存儲在寄存器中,而不是內(nèi)存位置。寄存器的訪問速度要比內(nèi)存塊。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容