我是彙編中的總noob,只是稍微查看一下發生了什麼。不管怎麼說,我寫了一個很簡單的功能:xorl%eax,x86_64中的%eax由gcc生成的彙編代碼
void multA(double *x,long size)
{
long i;
for(i=0; i<size; ++i){
x[i] = 2.4*x[i];
}
}
我編譯它:
gcc -S -m64 -O2 fun.c
而且我得到這個:
.file "fun.c"
.text
.p2align 4,,15
.globl multA
.type multA, @function
multA:
.LFB34:
.cfi_startproc
testq %rsi, %rsi
jle .L1
movsd .LC0(%rip), %xmm1
xorl %eax, %eax
.p2align 4,,10
.p2align 3
.L3:
movsd (%rdi,%rax,8), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, (%rdi,%rax,8)
addq $1, %rax
cmpq %rsi, %rax
jne .L3
.L1:
rep
ret
.cfi_endproc
.LFE34:
.size multA, .-multA
.section .rodata.cst8,"aM",@progbits,8
.align 8
.LC0:
.long 858993459
.long 1073951539
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
.section .note.GNU-stack,"",@progbits
彙編輸出對我來說很有意義(大部分)除了線xorl %eax, %eax
。從谷歌搜索,我認爲這是簡單的將%eax
設置爲零,在這種情況下,這對應於我的迭代器long i;
。
但是,除非我誤認爲,%eax
是一個32位寄存器。所以在我看來,這實際上應該是xorq %rax, %rax
,特別是因爲這是一個64位長的int。此外,在代碼中更進一步,它實際上使用64位寄存器%rax
來進行迭代,該迭代從未在xorl %eax %eax
之外初始化,這似乎只是將寄存器的低32位清零。
我錯過了什麼嗎?
另外,出於好奇,爲什麼在底部有兩個.long
常量?第一個,858993459
等於2.4
的雙浮點表示,但我無法弄清楚第二個數字是什麼或者它爲什麼在那裏。
什麼是'你的sizeof平臺上(長)'? –
@KerrekSB好的。我明白了,對不起。 – 2013-09-29 19:17:49
sizeof(long)是8 – mrip