arrays - NASM - 使用标签作为数组偏移量

标签 arrays assembly nasm x86-64

我正在尝试用汇编程序编写一个小程序,它接受三个 char 数组作为输入,计算第一个数组中每个元素的平均值并将结果存储在第三个数组中,如下所示.

%macro prologue 0
    push    rbp
    mov     rbp,rsp
    push    rbx
    push    r12
    push    r13
    push    r14
    push    r15
%endmacro
%macro epilogue 0
    pop     r15
    pop     r14
    pop     r13
    pop     r12
    pop     rbx
    leave
    ret
%endmacro

segment .data
    offset  db  1
segment .bss
    a1      resq    1
    a2      resq    1
    avg     resq    1
    avgL    resd    1
segment .text
    global  avgArray 
avgArray:
    prologue

    mov [a1], rdi
    mov [a2], rsi
    mov [avg], rdx
    mov [avgL], rcx

    mov rsi, [a1]
    mov r9, [a2]
    mov rdi, [avg]

    mov rcx, rsi
    add rcx, [avgL]    ; array length

    xor rdx, rdx
    xor rax, rax
    xor rbx, rbx
avgArray_loop:
    mov al, [rsi]
    mov dl, [r9]
    add ax, dx
    shr ax, 1
    mov [rdi], al

    add rsi, [offset]
    add r9, [offset]
    add rdi, [offset]

    cmp rsi, rcx
    jb  avgArray_loop
    epilogue

当用 1 替换 [offset] 时,它工作得很好。但是,当使用 [offset] 确定下一个数组元素时,它似乎不会将其值添加到 rsirdir9 。 我已经用 gdb 检查过了。调用add rsi, [offset]后,存储在rsi中的地址仍然相同。

有人可以告诉我为什么使用 [offset] 不起作用,但添加一个简单的 1 却可以?

顺便说一下:Linux x86_64 机器

最佳答案

所以我找到了该问题的解决方案。

avgLoffset 的地址直接存储在彼此之后。当从rcx读取并将其存储到avgL时,它也会覆盖offset的值。将 avgL 声明为 QWORD 而不是 DWORD 可防止 mov 覆盖 offset 数据。

新的数据和 bss 段如下所示

segment .data
    offset  db  1
segment .bss
    a1      resq    1
    a2      resq    1
    avg     resq    1
    avgL    resq    1

关于arrays - NASM - 使用标签作为数组偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31446707/

相关文章:

python - 在 Numpy Python 中将一维数组 append 到二维数组

assembly - 从 ASCII 到普通数字

assembly - Assembly x86 Irvine 中的链表

assembly - 无效操作数类型错误

x86 - NASM 中断 x86 引用?

assembly - RESB、RESW、RESD、RESQ在NASM中分配了多少字节?

java - 如何在Java中创建缓存来存储用户 session

python - 使用 numpy 进行 3D 图像压缩

html - 将mysql插入数组内的div内

gcc - GCC 生成的 ARM 和 x86 汇编代码的区别