汇编语言将字符串转换为十进制

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

我正在尝试将字符串转换为十进制,然后将所有数字添加到该十进制数(例如,如果数字为5,我需要添加1 + 2 + 3 + 4 + 5)然后在转换后再打印该数字到十进制。

我正在尝试下面的步骤,代码是不完整的,直到现在我只是将字符串转换为十进制并检查它是否被转换,有一些错误

title       fill in title 

;------------------------------------------------------------------------------
stacksg segment     para stack 'Stack'
    db 32 dup(0)


stacksg ends
;---------------------------------------------------------------------------------------------
datasg segment para 'Data'
paralst label byte
maxlen DB 20
actlen DB ?
indata DB 20 dup ('$')
strout DB "Enter a number between 1 and 20: $"
errors DB "USER ERROR$"
sum DB "The sum is: $"
datasg ends
;-----------------------------------------------------------------------------------
codesg segment para 'Code'
main    proc    far
assume ss:stacksg, ds:datasg, cs:codesg 
mov ax, datasg ;initialize data segment registers
        mov ds, ax
        mov es, ax

        MOV AH, 06H
        MOV AL, 0
        MOV CX, 0  ; ch-row, cl-columns
        MOV DH, 79
        MOV DL, 79

        MOV BH, 01000000B

        int 10H

        Mov AH, 02H
        MOV BH, 00H
        MOV DH, 12  ; or mov dx 0c28h
        MOV DL, 25
        INT 10H

        MOV AH, 09H
        LEA DX, STROUT
        INT 21H

        Mov AH, 0AH
        LEA DX, paralst
        int 21H

;converting string to decimal

         CALL READ_NUM 

     READ_NUM Proc Near

        push BX
        push CX
        push DX

        LEA BX, indata
        Mov AX, 0
        Mov CX, 0
        Mov DL, 10

        again: 
        MOV CL, [BX]
        CMP CL, 0DH
        JE THEEND
        SUB CX, 30H
        MUL DL
        ADD AX, CX
        INC BX

        THEEND: 

        POP DX
        POP CX
        POP BX ; conversion complete

        CMP AX, 20  ; since converted decimal is in AX,
                    ; i am checking if it is over 20 or below 1....
                    ; there is where i get error.
        JG ERRS
        CMP AX, 1
        JL ERRS
        mov     ax, 4c00h   
        int 21h


        MOV DX, 0
        MOV CX, 1

        TOPPY:

        CMP DX, AX
        JG ENDDY
        ADD CX, DX
        INC DX
        JMP TOPPY



        ERRS:

        Mov AH, 02H
        MOV BH, 00H
        MOV DH, 15  ; or mov dx 0c28h
        MOV DL, 25
        INT 10H

        MOV AH, 09H
        LEA DX, errors
        INT 21H

        mov     ax, 4c00h   
        int 21h


        ENDDY:
        Mov AH, 02H
        MOV BH, 00H
        MOV DH, 16  ; or mov dx 0c28h
        MOV DL, 25
        INT 10H

        MOV AH, 09H
        LEA DX, sum
        INT 21H

                mov ax, 4c00h   
        int 21h

        Ret
        READ_NUM endp

        main endp       ;end of procedure


        codesg ends ;end of code segment    
        end main    ;end of program
assembly x86-16 tasm
1个回答
0
投票
    LEA BX, indata
    Mov AX, 0
    Mov CX, 0
    Mov DL, 10

   again: 
    MOV CL, [BX]
    CMP CL, 0DH
    JE THEEND
    SUB CX, 30H
    MUL DL
    ADD AX, CX
    INC BX

  THEEND: 

你在这里遇到了一些错误:

  1. 您实际上并没有在此代码中执行循环。再次跳转失踪。
  2. 你忘了它是一个子程序(你called),所以你必须使用ret指令从它返回。
  3. 所需的READ_NUM endp在计划中太过分了。

可能是第2点和第3点来自您的调试工作吗?

READ_NUM Proc Near
  push bx
  push cx
  lea  bx, indata
  mov  al, 0      ;Clear result
again: 
  mov  cl, 10
  mul  cl         ;AX = AL * CL
  mov  cl, [bx]
  cmp  cl, 13
  je   THEEND
  sub  cl, '0'
  add  al, cl     ;Add in new digit
  adc  ah, 0
  inc  bx
  jmp  again      <<<< you missed this one!!
THEEND: 
  pop  cx
  pop  bx         ;Conversion complete
  ret             <<<< you missed this one!
READ_NUM endp

请将整个READ_NUM过程移动到DOS.Terminate以下,这样您的代码就不会意外地落入其中:

  mov ax, 4C00h   
  int 21h

READ_NUM Proc Near
  push bx

paralst label byte
maxlen DB 20
actlen DB ?
indata DB 20 dup ('$')

由于您要求1到20之间的数字输入,您可以选择将此缓冲区限制为2个字符。这将允许输入不超过99.使用字节大小的乘法,您的算法无论如何只能支持0到255之间的数字。

paralst label byte
maxlen DB 3          ;2 characters and 1 carriage return
actlen DB ?
indata DB 3 dup (0)

  CMP AX, 20  ; since converted decimal is in AX,
                ; i am checking if it is over 20 or below 1....
                ; there is where i get error.
    JG ERRS
    CMP AX, 1
    JL ERRS
    mov     ax, 4c00h   
    int 21h

即使没有必要的jmp again,这个调试添加也适用于单个数字输入。


  MOV DX, 0
    MOV CX, 1

   TOPPY:

   CMP DX, AX
    JG ENDDY
    ADD CX, DX
    INC DX
    JMP TOPPY

计算直到输入的数字的总和是错误的。数字1加两次! 如果你开始从上到下添加,那么看下面要简单得多:

               ;AX=5 (input)
 xor cx, cx
more:
 add cx, ax    ;+5 +4 +3 +2 +1
 dec ax
 jnz more
               ;CX=15

要打印这个2位数的结果,您可以阅读this

© www.soinside.com 2019 - 2024. All rights reserved.