linux 字符串到int函数核心转储程序集x86

jq6vz3qz  于 2023-04-05  发布在  Linux
关注(0)|答案(1)|浏览(140)

我正在编写一个函数,它选择一个字符串,例如“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

我尝试了其他地址,甚至尝试连接结果,所有输出都是相同的问题。

wfsdck30

wfsdck301#

您在几个场合使用了call指令。这些都应该成为某种跳转!
第一个call stlEnd必须是je stlEnd
最后一个call stoiLoop必须是jmp stoiLoop
call stlContinue你可以只删除。

stlEnd:
 mov eax, ebx

在这个1个字符的练习中,mov eax, ebx将破坏结果整数!
您的代码并没有将字符串转换为整数。您也没有积累处理当前字符的任何中间结果。我看到的唯一操作是对ASCII码的数字进行冗余添加。
为了理解你的目标,下面的几行是完全等价的:

input db '5', 0
input db 53, 0

但是请注意,53周围没有(单)引号。

相关问题