我似乎遇到的问题是我对寄存器的工作方式以及内存或指针在汇编中的工作方式缺乏了解。不管我做什么,也不管我读了多少,我就是不明白这个非常简单的事情。
这是我的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。我真的只是想了解为什么会发生这种情况,并更好地了解寄存器的机制以供将来参考。感觉就像我忽略了一些我根本不理解的基本知识。谢谢!