Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 打印数组值上的段故障组件NASM_Linux_Assembly_X86 64_Nasm - Fatal编程技术网

Linux 打印数组值上的段故障组件NASM

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

我无法打印数组值

程序在到达“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: 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]
这将与您之前对阵列所做的匹配,而且效率更高。我同意所有诊断和建议。我想我会在代码中找到一个类似“你做错了,我会纠正它”的解决方案。但没关系,我会从头开始做所有的事情。再次谢谢你。