Just My Life & My Work

好幾個月前很好奇交換變數的方法,寫了交換變數值-兩個變數VS三個變數,今日直接來看組合語言如何交換變數值,就以兩種方式來探討。

第一種方法是使用一個暫存變數:

# SWAP by tmp
# void swap_tmp (int a, int b) {
#   int tmp = a;
#   a = b;
#   b = tmp;
#   return;
# }

上述C程式的組合語言為:

_swap_tmp:
LFB2:
pushq    %rbp
LCFI0:
movq    %rsp, %rbp
LCFI1:
movl    %edi, -20(%rbp)
movl    %esi, -24(%rbp)
movl    -20(%rbp), %eax
movl    %eax, -4(%rbp)
movl    -24(%rbp), %eax
movl    %eax, -20(%rbp)
movl    -4(%rbp), %eax
movl    %eax, -24(%rbp)
leave
ret

第二種方法為使用XOR指令:

# SWAP by XOR
# void swap_xor (int a, int b) {
#   a^=b^=a^=b;
#   return;
# }

上述C程式的組合語言為:

_swap_xor:
LFB3:
pushq    %rbp
LCFI2:
movq    %rsp, %rbp
LCFI3:
movl    %edi, -4(%rbp)
movl    %esi, -8(%rbp)
movl    -8(%rbp), %eax
xorl    %eax, -4(%rbp)
movl    -4(%rbp), %eax
xorl    %eax, -8(%rbp)
movl    -8(%rbp), %eax
xorl    %eax, -4(%rbp)
leave
ret

同樣是8條運算指令,使用XOR有3條xorl指令。在速度方面,以C語言寫成來看,tmp法快於xor法。然而組合語言指令數相同,但xorl運算似乎比較慢,不曉得有沒有人知道原因?

參考:噗友、交換變數值-兩個變數VS三個變數

隨意留個言吧:)~

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料

標籤雲