如我的标题中所述,我使用以下代码来获取输入并将其转换为整数,以非数字字符终止。它编译得很好,但不想运行。相反,它返回“分段错误(核心已转储)”。
我的错误在哪里,我该如何解决?
我目前正在为我的 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
是我用来尝试诊断问题的替代品。
我找到了解决办法。编辑
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帮助我完成这些修复。