我在尝试让这个汇编代码工作时遇到了问题:
section .text
global _start
_start:
loop:
mov rax, 4
mov rdi, 1
add rsi, 1
mov rdx, 1
syscall
cmp rsi,11
jne loop
exit:
mov rax,60
xor rdi,rdi
syscall
Run Code Online (Sandbox Code Playgroud)
此代码的目的是增加rsi寄存器中的值并将其值打印 10 次。它是在 Linux x86_64 机器上用 NASM 编写的。
您的答案有很多问题,首先是系统调用号。你把值4放在 rax 但对于 x86_64 linux sys_write 的值是1
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/
其次,您的参数有问题,对 sys_write 的调用如下所示sys_write(unsigned int fd, const char *buf, size_t count),其中rdiis fd、rsiisbuf和rdxis count。您调用的问题是您将 rsi 作为字面值1,这使 linux 转到地址0x1以查找显然无效的要打印的内容。
考虑这个例子是一种打印数字“1”然后换行的有效方法
section .data
myNum: db '1', 0xA
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, myNum
mov rdx, 2
syscall
mov rax, 60
mov rdi, 0
syscall
Run Code Online (Sandbox Code Playgroud)
如果你要投反对票,请解释你认为答案有什么问题,只是按反对票按钮对任何人都没有帮助