【问题标题】:Problems with assembler, nasm "Segmentation fault (core dumped)"汇编器问题,nasm“分段错误(核心转储)”
【发布时间】:2023-03-12 11:50:02
【问题描述】:

我在进行 nasm 练习时遇到了一些问题。我有一条消息说“分段错误(核心转储)”我想知道是否有人会帮助我 我正在尝试很多事情,但我仍然没有解决问题。 希望有人能真正帮助我哈哈

这是我目前的代码:

section .data
a1: dd 83
resultado: dw 0
section .text
global _start

start:
mov    ebx,a1
mov    ax,[ebx]
xor    dx,dx
push   dx
push   ax
push   dx
push   dx
push   dx
call   redon5
pop    dx
pop    dx
pop    dx
pop    dx
pop    dx
mov    ebx,resultado
mov    [ebx],dx

mov    ebx,0        ; exit code, 0=normal
mov    eax,1        ; exit command to kernel
int    0x80         ; interrupt 80 hex, call kernel

redon5:
mov    ebp,esp      ; "sincroniza" el base pointer
mov    ax,[ebp + 10] ; pone en ax el argumento "p"
mov    dx,10
div    dx           ; separa unidades de decenas (q y r)
cmp    ax,3
jge    intervalo_2
mov    word [ebp + 4],0  ; k1 = 0
mov    word [ebp + 2],0  ; k2 = 0
jmp    fin_de_if

intervalo_2:
cmp   ax,8
jge   intervalo_3
mov    word [ebp + 4],5  ; k1 = 5
mov    word [ebp + 2],0  ; k2 = 0
jmp    fin_de_if

intervalo_3:
mov    word [ebp + 4],0  ; k1 = 0
mov    word [ebp + 2],10 ; k2 = 10

fin_de_if:
mov    dx,[ebp + 10] ; vuelve a recuperar p
sub    dx,ax         ;dx <-- p - r
add    dx,[ebp + 4]  ;dx <-- (p-r) + k1
add    dx,[ebp + 2]  ;dx <-- (p-r) + k1 + k2
mov    [ebp + 8],dx  ; valor de retorno de la función
ret

【问题讨论】:

  • 您是否使用调试器来确定发生这种情况的位置?有一个明显的地方,但学习调试,尤其是汇编代码,是必不可少的。你尝试了哪些方法?
  • 不,我只是使用命令 nasm -f elf64 test.asm ld test.o -o test
  • 然后拿起一个调试器并在那里运行代码以查看发生了什么。
  • 使用调试器是必不可少的,尤其是在汇编程序中编程时。你迟早会需要一个(相当早)
  • 我很好奇,你的代码是 32 位的;你为什么用elf64

标签: assembly nasm


【解决方案1】:

我没有足够高的声誉来添加评论,但是(假设您使用 elf64 是因为您试图在 64 位系统上运行 32 位代码)尝试使用:

nasm -f elf64 -g -F stabs test.asm ld -o test test.o

nasm -f elf -g -F stabs test.asm ld -o test test.o -melf_i386

大约在页面下方查看:http://duntemann.com/assembly.html 解释一下。

“-g”后跟“-F stabs”将产生可以在 gdb 调试器中使用的输出,并真正找出程序中的 seg-fault ^_^(正如 Sami 也指出的那样)。设置一些断点并在gdb中使用“stepi”来查找问题。

【讨论】:

  • OP 的代码使用的是 ESP/EBP 而不是 RSP/RBP,因此如果构建为 64 位代码,它会将堆栈指针截断为 32 位和段错误。只有您的第二组命令可以工作。 (然后OP的代码仍然很奇怪,使用16位堆栈操作。)根据他们的评论,您的第一个建议是OP已经在做的事情,这当然不起作用,因为Linux将堆栈指针放在低位之外64 位进程中的 32 位地址空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-21
  • 1970-01-01
  • 1970-01-01
  • 2018-07-28
  • 2019-08-06
相关资源
最近更新 更多