我正在尝试用汇编程序编写一个小程序,它接受三个 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]
确定下一个数组元素时,它似乎不会将其值添加到 rsi
、rdi
和 r9
。
我已经用 gdb 检查过了。调用add rsi, [offset]
后,存储在rsi
中的地址仍然相同。
有人可以告诉我为什么使用 [offset]
不起作用,但添加一个简单的 1 却可以?
顺便说一下:Linux x86_64 机器
最佳答案
所以我找到了该问题的解决方案。
avgL
和 offset
的地址直接存储在彼此之后。当从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/