assembly - 用汇编语言将 2 个数字相加并打印结果

标签 assembly masm

需要帮助,如何将两个数字相加然后打印结果这里是我的代码

    .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

我得到的输出是

The sum is 0 

我的代码有什么错误?

最佳答案

通过将值不断除以 10,您将得到余数中的个位数 - 但顺序“错误”(从后到前)。要以“正确”的顺序(从前到后)打印它,您可以通过 PUSHing 和 POPing 反转它们(关键字:LIFO = 后进先出):

.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

关于assembly - 用汇编语言将 2 个数字相加并打印结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23679521/

相关文章:

assembly - 清屏不间断

assembly - MASM内联函数

c - 我应该知道什么来优化程序?

linux - 系统调用导致Segmentation Fault

assembly - 如何验证 x86 命令的输出?

assembly - 我可以在每个内核的基础上编写汇编代码吗?

c++ - Windbg 语法 - 将两个命令(MASM 和 C++)合二为一

dart - 为什么我的 asm 校验和宏的 Dart 实现不起作用?

c - 程序集字符*链接

assembly - CMOS RAM 如何以一个字节存储年份