私はアセンブリ時に合計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
を0に設定することであることがわかります。この場合、これは私のイテレータlong i;
に対応しています。
ただし、私が間違っていない限り、%eax
は32ビットのレジスタです。だから、これは実際にはxorq %rax, %rax
でなければならないと思います。特にこれは64ビットのintを保持しているからです。さらに、コードのさらに下には、実際には%rax
というレジスタを使用して反復処理を行います。これは決してxorl %eax %eax
の外部で初期化されることはなく、レジスタの下位32ビットのみをゼロにするようです。
何か不足していますか?
また、好奇心の理由から、なぜそこに2つの.long
の定数がありますか?最初の1つは858993459
で、ダブル浮動小数点表現2.4
と同じですが、2番目の数字が何であるか、それがなぜ存在するのかわかりません。
は、ご使用のプラットフォーム上で ''のsizeof(長い)とは何ですか? –
@KerrekSBああ。私は、ごめんなさい。 –
sizeof(long)は8 – mrip