打印乘法 table 汇编语言

Print multiplication table assembly language

您好,我正在使用 dosbox 和 masm 编译器,我如何打印乘法 table 我的代码如下,但它打印特殊字符。请在这里纠正我做错了。如果有人可以帮助我解决这个问题,请更正代码

     .MODEL SMALL
     .STACK 100H
      .DATA
    MSG DB 'ENTER A DIGIT:$'
    NL DB 0DH,0AH,'$'
  .CODE
    MAIN PROC

   MOV AX,@DATA
  MOV DS,AX

  LEA DX,MSG
  MOV AH,09
  INT 21H

  MOV AH,01
 INT 21H



  XOR BX,BX
  MOV BL,1
   MOV CL,10
 TOP:
  MUL BL
 ADD AL,30h
 MOV AH,02
 MOV DX,AX
 INT 21H

LEA DX,NL
MOV AH,09
INT 21H

INC BL
LOOP TOP
JCXZ SKIP
SKIP:
 MOV AH,4CH
 INT 21H

 MAIN ENDP
 END MAIN

KIndly correct me here m doing wrong.

您没有使用调试器来验证代码的实际作用。

您没有使用指令参考指南来验证代码的实际作用。

您在编写代码时使用了假设和期望,但没有在源代码中用注释记录它们。这使得其他任何人都很难猜测什么是 bug 什么不是,因为我们只看到指令,而看不到您的意图。如果您对每组 1-5 条指令进行评论,它们的目的是什么,其他人会更容易向您展示您的期望在哪里,因为指令会做一些您没有预料到的事情。


再加上你的代码中几乎没有错误,但每个人的代码中都有错误,这很正常。在调试和修复之前。

您的乘法结果是一位以上的数字,因此您需要一个程序将数字转换为字符串,例如将 21 转换为 '21',因为如果显示 21,屏幕将显示 ASCII字符 21 ('§').

我会将程序“”添加到您的代码中,该程序有两个参数:AX 是要转换的数字(在您的例子中,是乘法的结果),以及SI 与字符串变量的地址 :

     .MODEL SMALL
     .STACK 100H
      .DATA
    MSG DB 'ENTER A DIGIT:$'
    NL DB 0DH,0AH,'$'   
    NUM DB ?                        ;◄■■ NUMBER ENTERED BY USER.
    STRING DB '$$$$$$'              ;◄■■ STRING TO STORE NUMBER CONVERTED.
  .CODE
    MAIN PROC

   MOV AX,@DATA
  MOV DS,AX

  LEA DX,MSG
  MOV AH,09
  INT 21H

  MOV AH,01
 INT 21H             
  SUB AL,'0'    ;◄■■ CONVERT CHAR TO NUMBER.
  MOV NUM,AL    ;◄■■ PRESERVE NUMBER BECAUSE AL WILL BE DESTROYED.


  XOR BX,BX
  MOV BL,1
   MOV CX,10    ;◄■■ NOT CL.
 TOP:   
  MOV AL,NUM    ;◄■■ THE NUMBER TO CONVERT.
  MUL BL        ;◄■■ RESULT IN AX.

  PUSH BX            ;◄■■ BX AND CX WILL BE
  PUSH CX            ;◄■■ DESTROYED IN PROC. 
  LEA  SI,STRING     ;◄■■ STORE NUMBER CONVERTED.
  CALL NUMBER2STRING ;◄■■ CONVERT AX TO STRING.
  POP  CX            ;◄■■ RESTORE BX 
  POP  BX            ;◄■■ AND CX.

LEA DX,NL
MOV AH,09
INT 21H

LEA DX,STRING        ;◄■■ DISPLAY NUMBER CONVERTED.
MOV AH,09
INT 21H

INC BL
LOOP TOP         ;◄■■ CX-1, IF CX > 0 JUMP TO TOP.
;JCXZ SKIP       ;◄■■ UNNECESSARY.
;SKIP:           ;◄■■ UNNECESSARY.
 MOV AH,4CH
 INT 21H

 MAIN ENDP

 END MAIN
.model small
.stack 100h
.data
num db ?
msg db 'Enter a digit:$'
string db 5 dup(?)
.code
main proc
mov ax, @data
mov ds, ax

lea dx, msg      ;; display enter a digit:
mov ah, 9
int 21h
mov ah, 1            ;; gets a digit as character
int 21h
sub al, 48     ;; convert character into number
mov num, al

xor bx, bx
mov bl, 1
mov cx, 10
top:mov al, num           ;; multiplication step
mul bl
push bx                 ;; reserving bx and cx for later use by pushin stack
push cx
lea si, string

mov bx, 10          ;; storing 2 digits number as character in string
xor cx, cx
division: xor dx,dx
div bx
push dx
inc cx
cmp ax, 0
jne division
store: pop dx
add dl, 48
mov [si], dl
inc si
loop store
mov [si], '$ '

pop cx
pop bx
mov dl, 13             ;;; new line
mov ah, 2
int 21h
mov dl, 10
mov ah, 2
int 21h

lea dx, string       ;;get that 2 digit number which is character from string
mov ah, 9
int 21h

inc bl
loop top                 ;; multiplication table stops

mov ah, 4ch             ;; end of program
int 21h
main endp
end

对于你的查询,我的理解是你想打印一个具有正确输出的乘法 table。为此,您需要在两个 BCD 数字中分解乘法值。 have a look on this link 像这样打印输出的完整汇编程序