2013-09-29 93 views
6

我是彙編中的總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的雙浮點表示,但我無法弄清楚第二個數字是什麼或者它爲什麼在那裏。

+0

什麼是'你的sizeof平臺上(長)'? –

+0

@KerrekSB好的。我明白了,對不起。 – 2013-09-29 19:17:49

+0

sizeof(long)是8 – mrip

回答

8

我推測,這樣做的目的很簡單,就是%eax中設置爲零

是。

在這種情況下,對應於我的迭代器長i ;.

不可以。您的i在聲明中未初始化。嚴格來說,該操作對應於for循環中的i = 0表達式。

但是,除非我誤,否則%eax是一個32位寄存器。所以在我看來,這實際上應該是xorq%rax,%rax,特別是因爲這是一個64位long int。

但是清除寄存器的低位雙字會清除整個寄存器。這不直觀,但它是隱含的。

+1

謝謝。我認爲必須如此,但我無法在任何地方找到它。就像我說的,我是一個總noob。 – mrip

+1

今天學到了一些新東西,不知道清除EAX會清除RAX。然而,我想知道'清除低位字'是否是正確的方式,是不是AMD64架構上的字大小爲64位? – us2012

+2

@ us2012英特爾簡單地忽略了「字大小」的通常定義。一個字總是16位。 32 =雙字,64 =雙字。 – harold

2

只是爲了回答第二個部分:.long裝置32位,並且兩個積分常數並排側形成雙2.4的IEEE-754表示:

Dec: 1073951539 858993459 
Hex: 0x40033333 0x33333333 

    400 3333333333333 
    S+E Mantissa 

的指數是通過1023偏移,所以實際指數爲0x400的  − =   1中尾數前導 「一」 是隱含的,所以它的2   ×   0B1。001100110011 ...(你認識到這一點的週期性擴張爲3/15,即0.2。果然,2   ×   1.2   =   2.4)。

+0

Aha。謝謝。這很有道理。 – mrip

+1

恩,好吧。因爲我不注意類型是'double',這是64位長。 +1。 – 2013-09-29 19:30:36

+1

@ H2CO3:你大部分都是正確的,但指數的大小應該會讓你失望:-) –

相關問題