Linux x8664汇编,xorl%eax,g86生成的x86_64汇编代码中的%eax

我在集会上总是一个菜鸟,只是捅了一下看看发生了什么.无论如何,我写了一个非常简单的函数:

void multA(double *x,long size)

{

long i;

for(i=0; 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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值