【发布时间】: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?