在 ASM 中实现字符串到整数转换后,代码因分段错误而退出

问题描述 投票:0回答:1

如我的标题中所述,我使用以下代码来获取输入并将其转换为整数,以非数字字符终止。它编译得很好,但不想运行。相反,它返回“分段错误(核心已转储)”。

我的错误在哪里,我该如何解决?

我目前正在为我的 Linux 计算机使用 NASM 编译成 ELF 格式,如果这有帮助的话。提前致谢(抱歉没有评论)。

section .text

global _start
_start:

mov eax, 4
mov ebx, 1
mov edx, lenUsrMsg
mov ecx, usrMsg
int 0x80

mov eax, 3
mov ebx, 2
mov ecx, num
mov edx, 8
int 80h

mov ecx, num
mov edi, ecx
xor eax, eax

atoi:
xor eax,eax
.next:
movzx ecx, byte [edi]
sub ecx, '0'
jb .done
cmp ecx, 9
ja .done


imul eaX, 10
ADD EAX, ecx
inc edi
jmp .next

.done:
ret

mov si, 10

print_loop:
mov eax, 4
mov ebx, 1
mov ecx, star
mov edx, 1
int 0x80

dec si
jnz print_loop

mov al, 4
mov bl, 1
mov ecx, endl
mov edx, 1
int 80h

end:
mov eax, 1
xor ebx,ebx
int 0x80

section .data
usrMsg db 'Please specify amount of stars 1-9:'
lenUsrMsg equ $-usrMsg
star db '*'
num db 5
endl db 0xa

该程序在以前的版本中运行,只允许使用个位数,但当我尝试实现 AtoI 函数将字符串转换为 int 时,它就被破坏了。

mov si, 10
是我用来尝试诊断问题的替代品。

linux assembly x86 nasm
1个回答
0
投票

我找到了解决办法。编辑

imul eaX, 10
ADD EAX, ecx
inc edi
jmp .next

.done:
ret

到...

imul eaX, 10
ADD EAX, ecx
inc edi
jmp .next

.done:

删除

ret
。然后改变

mov si, 10

print_loop:

,更有成效的答案:

mov esi, eax

print_loop:

不要忘记将

dec si
更改为
dec esi
。 最后一个简短的修复是将
num db 5
移至
section .bss
并将其更改为
num resb 8

感谢Jester帮助我完成这些修复。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.