necesita ayuda, cómo sumar dos números y, a continuación, imprimir el resultado aquí está mi código

    .MODEL SMALL
    .STACK 200H
    .DATA
NUM1 DB 12
NUM2 DB 3
VAL  DB ?
MSG1 DB "The sum is : $"

    .CODE
BEGIN PROC 
      MOV AX, @DATA
      MOV DS, AX

      MOV AL, NUM1
      ADD AL, NUM2
      MOV VAL, AL



      LEA DX, MSG1
      MOV AH, 9
      INT 21H


      MOV AH, 2
      MOV DL, VAL
      INT 21H

      MOV AX, 4C00H
      INT 21H
BEGIN ENDP
      END BEGIN

Tengo una salida que dice

The sum is 0 

¿Cuál es el error en mi código?

  • Que el lenguaje ensamblador?
  • Usted ve, es masm, ¿no ?
  • No por que me dicen.
InformationsquelleAutor user3640979 | 2014-05-15

2 Comentarios

  1. 1

    Dividiendo el valor constantemente por 10 obtendrás el único dígitos en el resto -, pero en el «mal» de la orden (del último al primero). Para imprimir en el «derecho» de la orden (la primera a la última) usted puede invertir en ellos por PUSHing y POPing (palabra clave: LIFO = last in first out):

    .MODEL SMALL
    .STACK 200H
    .DATA
        NUM1 DB 12
        NUM2 DB 3
        VAL  DW ?
        MSG1 DB "The sum is : "
        DECIMAL  DB "00000$"
    
    .CODE
    BEGIN PROC
        MOV AX, @DATA
        MOV DS, AX
    
        XOR AX, AX
        MOV AL, NUM1
        ADD AL, NUM2
        ADC AH, 0
        MOV VAL, AX
    
        MOV AX, VAL
        CALL AX_to_DEC
    
        LEA DX, MSG1
        MOV AH, 9
        INT 21H
    
        MOV AX, 4C00H
        INT 21H
    BEGIN ENDP
    
    AX_to_DEC PROC
            mov bx, 10              ; divisor
            xor cx, cx              ; CX=0 (number of digits)
    
        First_Loop:
            xor dx, dx              ; Attention: DIV applies also DX!
            div bx                  ; DX:AX /BX = AX remainder: DX
            push dx                 ; LIFO
            inc cx                  ; increment number of digits
            test  ax, ax            ; AX = 0?
            jnz First_Loop          ; no: once more
    
            mov di, OFFSET DECIMAL  ; target string DECIMAL
        Second_Loop:
            pop ax                  ; get back pushed digit
            or ax, 00110000b        ; to ASCII
            mov byte ptr [di], al   ; save AL
            inc di                  ; DI points to next character in string DECIMAL
            loop Second_Loop        ; until there are no digits left
    
            mov byte ptr [di], '$'  ; End-of-string delimiter for INT 21 /FN 09h
            ret
    AX_to_DEC ENDP
    
    END BEGIN
    

Dejar respuesta

Please enter your comment!
Please enter your name here