Linux 打印数组值上的段故障组件NASM
我无法打印数组值 程序在到达“printloop:”标签之前不会显示任何错误。有一些错误导致无法打印值,但我找不到它 我希望你能Linux 打印数组值上的段故障组件NASM,linux,assembly,x86-64,nasm,Linux,Assembly,X86 64,Nasm,我无法打印数组值 程序在到达“printloop:”标签之前不会显示任何错误。有一些错误导致无法打印值,但我找不到它 我希望你能 ; compile: nasm -felf64 array.asm ; linked in Ubuntu/Linux Mint: gcc -no-pie array.o -o array ; run: ./array segment .data lst: dq 101, 102, 103, 104, 105 len: equ (($ - lst) / 8) fmt
; compile: nasm -felf64 array.asm
; linked in Ubuntu/Linux Mint: gcc -no-pie array.o -o array
; run: ./array
segment .data
lst: dq 101, 102, 103, 104, 105
len: equ (($ - lst) / 8)
fmt: dq "%lld ",10, 0
segment .text
global main
extern printf
main:
mov ecx, len
lea rbx, [lst]
mov rdx, rbx ; We'll use RDX below.
xor edi,edi
xor eax,eax
pushloop:
push qword [rbx+rdi*8]
add rdi,1
dec ecx
jnz pushloop
mov ecx, len
xor edi, edi
poploop:
pop rax
mov [rdx+rdi*8], rax
add rdi,1
dec ecx
jnz poploop
mov ecx, len
xor edi, edi
printloop:
mov rax, [rdx+rdi*8]
add rdi, 1
mov rcx, fmt
mov rsi, rax
call printf wrt ..plt
dec ecx
jnz printloop
end:
mov eax, 60
xor edi,edi
syscall
请提前通知您。
rax
应包含用于将参数传递给printf
的SSE寄存器的数量。所以把它归零。无论如何,做mov-rax、[rdx+rdi*8]
然后再做mov-rsi、rax是没有意义的。另外,在没有初始化的情况下使用rdx
,这会在printloop
之前崩溃。此外,不要使用直接系统调用退出,而是从main
或callexit
返回。您还应该正确地维护堆栈对齐。使用堆栈反转(?)数组也不是最优的。最后,像往常一样,学习使用调试器。@Jester:RDX是用mov RDX,rbx
初始化的(与到处使用rbx相比,没有明显的原因),问题是OP没有意识到它的调用被破坏了,所以printf对它进行了处理。RDI与循环计数器存在相同的问题。顺便说一句,如果您像往常一样使用default rel
,则此代码可以在饼图可执行文件中工作,但调用失败的寄存器错误除外。IDK为什么在printf循环中使用mov rcx,fmt
learcx,[fmt]
这将与您之前对阵列所做的匹配,而且效率更高。我同意所有诊断和建议。我想我会在代码中找到一个类似“你做错了,我会纠正它”的解决方案。但没关系,我会从头开始做所有的事情。再次谢谢你。