打印乘法 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 像这样打印输出的完整汇编程序
您好,我正在使用 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 像这样打印输出的完整汇编程序