【问题标题】:Increment loop In NASMNASM 中的增量循环
【发布时间】:2018-05-08 17:13:13
【问题描述】:

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

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

【问题讨论】:

  • “打印出它的值”是什么意思,linux操作系统没有“打印整数”服务,值1不是可打印字符,对于普通的linux服务@987654323 @ 你必须提供指向字符的指针,而不是字符本身。您能否展示一些以您想要的方式至少打印一次值的示例,然后解释循环应该做什么?可能从一些工作的 hello world 示例开始,并在调试器中检查它,它是如何工作的?参数值是什么?您还可以使用strace 工具查看您的代码提供了哪些参数。
  • rax=4 服务是“sys_stat”,调用它没有任何意义,如果你想“打印”一些东西,因为sys_stat 将收集有关文件的信息,它不是在任何地方打印任何东西。

标签: linux assembly nasm x86-64


【解决方案1】:

您的回答有很多问题,首先是系统调用号。您将值 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),其中rdifdrsibufrdxcount .您调用的问题是您将 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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2017-03-22
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多