首页 > 解决方案 > 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

这段代码的目的是增加rsi寄存器中的值并将其值打印 10 次。它是在 Linux x86_64 机器上用 NASM 编写的。

标签: linuxassemblynasmx86-64

解决方案


您的答案有很多问题,首先是系统调用号。您将值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), where rdiis fdrsiis bufrdxis 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

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


推荐阅读