装配中的打印功能无法正常工作

问题描述 投票:0回答:0

我似乎遇到的问题是我对寄存器的工作方式以及内存或指针在汇编中的工作方式缺乏了解。不管我做什么,也不管我读了多少,我就是不明白这个非常简单的事情。

这是我的makefile:

default:
        nasm -f elf64 print.asm
        ld print.o
        ./a.out               

这两天我一直在学习汇编,并且我一直在制作越来越复杂的功能。我尝试制作这个打印函数,它一次打印一个字符串,直到它到达一个空终止符。当执行这个程序时,它似乎无限循环,这是由于 rsi 寄存器的某种原因。

当我使用 rcx 作为指向 msg 标签的指针并仅在我需要打印时将 rcx 移动到 rsi 时,它会无限期地悬停。

打印.asm:

section .text

        global _start

_start:

        mov rcx, msg

print:

        mov rax, 1
        mov rdi, 1
        mov rsi, rcx
        mov rdx, 1
        syscall


        inc rcx
        cmp byte[rcx], 0
        jne print

        mov rax, 60
        mov rdi, 0
        syscall

section .data
        msg db "Hello World!", 0x0a, 0x00

输出:

nasm -f elf64 print.asm
ld print.o
./a.out
H

程序从未真正完成并退出。它只是悬停在 H 它不会再打印字符或退出程序

只有当我尝试使用 rcx 寄存器作为指向消息的指针然后在需要打印时将 rcx 移到 rsi 时才会发生这种情况。

当我使用 rsi 作为指向消息标签的指针开始时,它似乎工作正常,如下所示:

打印.asm:


section .text

        global _start

_start:

        mov rsi, msg

print:
        mov rax, 1
        mov rdi, 1
        mov rdx, 1
        syscall


        inc rsi

        cmp byte[rsi], 0
        jne print

        mov rax, 60
        mov rdi, 0
        syscall

section .data
        msg db "Hello World!", 0x0a, 0x00

输出:

nasm -f elf64 print.asm
ld print.o
./a.out
Hello World!

如您所见,它完全打印了整个字符串的所需输出并退出程序,退出代码为 0。我真的只是想了解为什么会发生这种情况,并更好地了解寄存器的机制以供将来参考。感觉就像我忽略了一些我根本不理解的基本知识。谢谢!

pointers assembly memory 64-bit cpu-registers
© www.soinside.com 2019 - 2024. All rights reserved.