问题描述
我接到了一个作业,我必须添加 2 个数字并显示结果。我在控制台中显示它们时遇到问题。它不显示数字,而是显示 ascii[ 对于加法大于 9 的数字的表示。例如:8 + 9 = 17 并打印字母 A。
如何显示数字而不是 ascii?
Bellow 是我正在使用的代码。
.model large
DATAS SEGMENT
aV dw ?
bV dw ?
cV dw ? ;,'$'
DATAS ENDS
STACKSEGMENT SEGMENT
startStack label word
dw 3 dup(0)
STACKSEGMENT ENDS
CODES SEGMENT
ASSUME CS:CODES,SS:STACKSEGMENT,DS:DATAS
START:
MOV AX,SEG DATAS
MOV DS,AX
MOV AX,SEG STACKSEGMENT
MOV SS,AX
MOV AX,OFFSET startStack
MOV SP,AX
xor ax,ax
mov ah,01h
int 21h
xor ah,ah
sub al,48 ; ASCII to DECIMAL or substract al 30h
mov aV,ax
xor ax,ax
; NEW LINE
MOV DL,10
MOV ah,02h
INT 21h
mov ah,01h
int 21h
xor ah,48 ; ASCII to DECIMAL or substract al 30h
mov bV,ax
MOV DL,02h
INT 21h
mov ax,aV
push ax
mov ax,bV
push ax
mov ax,cV
push ax
CALL FAR PTR mathcalc
MOV BX,DS:[cV] ; cV
add BX,30H
MOV AH,2
MOV DL,BH
INT 21H
MOV AH,BL
INT 21H
sub BX,30H
CALL ENDPROGRAM
mathcalc PROC FAR
push BP
mov bp,sp
mov al,SS:[bp+10]
;========
add al,SS:[bp+8]
;========
xor ah,ah
mov ss:[bp+6],ax
xor dx,dx
MOV dx,ss:[bp+6]
mov DS:[cV],dx
pop bp
retf 2
ENDP
ENDPROGRAM:
MOV AX,4c00h
INT 21h
CODES ENDS
END START
PS:我使用带有 TASM 编译器的 DOSBox。
谢谢, 亲切的问候, 阿尔芒
解决方法
您必须在(伪代码)中执行以下操作:
reserve data with b bytes
n = 1234 # Number to be printed
b = address of data + b - 1
while n > 0
d = n mod 10
n = n / 10
c = 48 + d # 48 is ascii code for digit zero
store c at b
decrement b