使用子例程将数字字符串转换为整数

Convert a string of digits to an integer by using a subroutine

汇编语言程序以字符串形式读入(三位或更多位)正整数并将该字符串转换为整数的实际值。

具体来说,创建一个读入数字的子程序。将其视为一个字符串,尽管它将由数字组成。此外,创建一个子例程将一串数字转换为整数。

不必测试有人认为 i8xc 是整数的输入。

我是这样做的。请帮忙。

.section .data
  
String:
     .asciz "1234"

Intg:
     .long 0
  
.section .text
     .global _start

_start:  
     movl    , %edi
     movl    $String, %ecx

character_push_loop:
     cmpb [=10=], (%ecx)
     je conversion_loop
     movzx (%ecx), %eax        # move byte from (%ecx) to eax
     pushl %eax                # Push the byte on the stack
     incl %ecx                 # move to next byte
     jmp character_push_loop   # loop back

conversion_loop:
     popl    %eax            # pop off a character from the stack
     subl    , %eax       # convert to integer
     imul    %edi, %eax      # eax = eax*edi 
     addl    %eax, Intg     
     imul    , %edi
     decl    %ecx
     cmpl    $String, %ecx   # check when it get's to the front %ecx == $String
     je      end             # When done jump to end
     jmp     conversion_loop

end:   
     pushl   Intg
     addl    , %esp         # clean up the stack
     movl    [=10=], %eax         # return zero from program
     ret

此外,我无法获得输出。我遇到了分段错误。我无法找出我的代码中的错误是什么。

缺少与操作系统的正确交互。
end: 中,您推送了结果,但随后的 addl , %esp 使推送的值无效,最后的 ret 错误地将指令流引导至 SS:ESP+4 指向的内存中的任何垃圾在程序入口处。

当你增加堆栈指针时,你不能相信低于 ESP 的数据会存活。

你的程序不与它的用户交互,如果你想让它打印一些东西,使用系统函数来写。

print_String:
    mov  ,eax     ; System function "sys_write".
    mov ,ebx      ; Handle of the standard output (console).
    mov $String,ecx ; Pointer to the text string.
    mov ,edx      ; Number of bytes to print.
    int 0x80        ; Invoke kernel function.

end:mov ,eax      ; System function "sys_exit".
    mov (Intg),ebx  ; Let your program terminate gracefully with errorlevel Intg.
    int 0x80        ; Invoke kernel function.