【问题标题】:NASM-64bits-segmentation fault calling procedureNASM-64bits-segmentation 故障调用程序
【发布时间】:2018-12-13 20:50:33
【问题描述】:

当我运行程序时,我遇到了分段错误。该程序包含两个数字之间的简单相加,将值存储在变量中,然后通过系统调用将其打印出来。

这是我调用它的代码:

section .bss
    res: resq 1
    fout: resq 1

section .data
     msg dq 'Hello, world!', 0xa  ;string to be printed
     len equ $ - msg     ;length of the string 
     filename dq 'hello.txt'

section .text
     global _start:     ;must be declared for linker (ld)

_start:             ;tells linker entry point
     mov rcx,5
     mov rdx,4
     call sum
     mov [res],rax

     mov    rdx,1     ;message length
     mov    rcx,res  ;message to write
     mov    rbx,1       ;file descriptor (stdout)
     mov    rax,4       ;system call number (sys_write)
     syscall        ;call kernel

     mov    rax,1       ;system call number (sys_exit)
     syscall       ;call kernel

 sum:
     mov rax,rcx
     add rax,rdx
     add rax,'0'
     ret

调试信息:

 (gdb) n
 sum () at Hello.asm:41
 41              mov rax,rcx
 (gdb) n
 42              add rax,rdx
 (gdb) n
 43              add rax,'0'
(gdb) n
 sum () at Hello.asm:44
 44              ret
 (gdb) n
 0x0000000000000001 in ?? ()
 (gdb) n
 No se pueden encontrar límites en la función actual
 (gdb) quit

结果是分段错误。

【问题讨论】:

  • 在“我调用它的代码”中call sum 之后会发生什么?调试器表明代码在那里崩溃了。
  • 我存储值并进行系统调用以打印结果。
  • 请发布该代码。如果您发布整个程序或任何其他形式的minimal reproducible example,那么您最好通过在他们自己的计算机上运行您的代码来了解问题所在。
  • 我把代码放了。

标签: assembly nasm


【解决方案1】:

您尝试使用mov [res],raxres 中存储8 个字节,尽管只有1 个字节分配给res。虽然这是错误的,但这不是导致程序失败的问题。写信 mov [res], al 来解决这个问题。

真正的问题是您的系统调用号码错误。您使用 i386 Linux 的系统调用编号,但这些是具有不同编号的 amd64 系统调用。有关正确的系统调用号,请参阅asm/unistd_64.h 中的值。对于您的示例,正​​确的数字是 1 代表 sys_write60 代表 sys_exit。修复这些数字使您的程序不再崩溃,但仍然无法正常工作。

您还需要修复使用的寄存器。 amd64 上系统调用的调用约定与 i386 不同;您不要将参数放在 ebx、ecx 等中。而是使用rdirsirdxr10r8r9,如this answer 中所述。解决这个问题可以让你的程序最终工作。

【讨论】:

  • 它的作品!,谢谢!,一个问题,什么是更好的 32 位或 64 位编程汇编?
  • @Roca 对于严肃的开发,64 位汇编是未来,因为 32 位无处可去。对于学习,由于调用约定更简单,32 位汇编可能更容易。
  • 最后一个问题@fuz,你知道任何学习nasm 64位的页面吗?
  • @Roca 可惜没有。
猜你喜欢
  • 1970-01-01
  • 2019-04-04
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-16
  • 2014-06-03
  • 2013-09-09
  • 2022-12-15
相关资源
最近更新 更多