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)返回值。
- 當函數(shù)
exchange開始執(zhí)行時,函數(shù)參數(shù)xp和y分別存儲在%rdi和%rsi中。 - 然后,指令
movq (%rdi), %rax從內(nèi)存中讀取x,將值保存在寄存器%rax中,直接實現(xiàn)了操作x = *xp。 - 接著,指令
movq %rsi, (%rdi)將y寫入寄存器%rdi中的xp指向的內(nèi)存位置,直接實現(xiàn)操作*xp = y。 - 最后,使用寄存器
%rax從函數(shù)exchange中返回值,所以返回值是x。
注意:
- 在C語言中的指針只是地址而已,這點可從查看C源代碼對應(yīng)的匯編碼可知。
- 解析一個指針包括拷貝該指針到寄存器,然后在內(nèi)存引用中使用寄存器。
- 比如局部變量
x是存儲在寄存器中,而不是內(nèi)存位置。寄存器的訪問速度要比內(nèi)存塊。