Arrays 在x86-64程序集中添加数组元素

Arrays 在x86-64程序集中添加数组元素,arrays,assembly,x86-64,Arrays,Assembly,X86 64,我正在尝试编写一个x86-64汇编程序,它是函数“intaddarray(intn,int*array)”。第一个参数是数组的长度,第二个是指向数组的指针。它应该将数组的元素相加并返回。这是我到目前为止的代码,我不知道为什么它不起作用 .text .globl addarray .type addarray, @function addarray: movq $0, %rdx movq $0, %rax while: cmpq %rdx, %r

我正在尝试编写一个x86-64汇编程序,它是函数“intaddarray(intn,int*array)”。第一个参数是数组的长度,第二个是指向数组的指针。它应该将数组的元素相加并返回。这是我到目前为止的代码,我不知道为什么它不起作用

.text
.globl addarray
.type   addarray, @function  

addarray:
    movq    $0, %rdx
    movq    $0, %rax
while:
    cmpq    %rdx, %rdi
    jle afterw

    movq    %rdx, %rcx
    imulq   $8, %rcx
    addq    %rsi, %rcx

    addq    %rcx, %rax

    addq    $1, %rdx
    jmp while
afterw:
    ret

我不太熟悉AT&T的语法,但它看起来像你的台词:

addq %rcx, %rax
将把
rcx
的值添加到
rax
。您希望添加
rcx
引用的值,即:

addq (%rcx), %rax
至少,我认为At&T的语法就是这样做的。在英特尔语法中,它将是:

add rax,[rcx]

你可以做一些简单的优化来提高速度,但我认为以上是解决问题的关键。

定义“不起作用”。你使用哪种调用约定?即,哪些寄存器包含参数?我的汇编程序有点生疏,但是
cpmq%rdx,%rdi jle afterw
不会立即跳转到afterw,因为
$rdx
设置为0?