我正在编写一个函数,它选择一个字符串,例如“input db '5',0”并将其转换为“input ' 53',0”(一个int)。我有以下代码。但每次运行它都会输出Segmentation Fault(核心转储)。
stoi:
push ebx
mov ebx, eax
stoiLoop:
; if is null: end
cmp byte[ebx], 0
call stlEnd
; if < 48: continue
cmp byte[ebx], 48
jl stlContinue
; if > 57: continue
cmp byte[ebx], 57
jg stlContinue
; add 48 so it matches the ascii code of number
mov al, [ebx]
add al, 48
call stlContinue
stlContinue:
inc ebx
call stoiLoop
stlEnd:
mov eax, ebx
pop ebx
ret
我尝试了其他地址,甚至尝试连接结果,所有输出都是相同的问题。
1条答案
按热度按时间wfsdck301#
您在几个场合使用了
call
指令。这些都应该成为某种跳转!第一个
call stlEnd
必须是je stlEnd
。最后一个
call stoiLoop
必须是jmp stoiLoop
。而
call stlContinue
你可以只删除。在这个1个字符的练习中,
mov eax, ebx
将破坏结果整数!您的代码并没有将字符串转换为整数。您也没有积累处理当前字符的任何中间结果。我看到的唯一操作是对ASCII码的数字进行冗余添加。
为了理解你的目标,下面的几行是完全等价的:
但是请注意,
53
周围没有(单)引号。