好幾個月前很好奇交換變數的方法,寫了交換變數值-兩個變數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三個變數。
隨意留個言吧:)~