NASM 中的增量循环

1 linux assembly x86-64 nasm

我在尝试让这个汇编代码工作时遇到了问题:

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 编写的。

zee*_*zee 5

您的答案有很多问题,首先是系统调用号。你把值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 fdrsiisbufrdxis 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)

如果你要投反对票,请解释你认为答案有什么问题,只是按反对票按钮对任何人都没有帮助