我需要显示问题,用户将回答Y或N.我总共有5个问题,1个问题有20个分数。我需要5 * 20 = 100之类的东西。
当用户回答Y时,countY db 0
将增加20
我已成功计算出标记,但如何显示为标记的是两位数字(例如80),它也可能是一个3位数字(例如100)。
Q1:
mov ah, 09h
lea dx, msgq1
int 21h
mov ah, 01h
int 21h
mov myInput, al
cmp myInput, 59h
JE I1
jmp Q2
I1:
mov dl, countY
add dl,20
mov countY, dl
;calculation
Cal:
mov ah,02h
mov dl, countY
add dl, 30h ; display countY=80;
mov countY, dl
int 21h
;NOT WORKING, ERROR CODE
mov bl,10
mov al, countY
cbw
div bl
mov q, al
mov r, ah
mov ah, 02h
mov q, al
int 21h
答案 0 :(得分:2)
cal: mov ah,02h mov dl, countY add dl, 30h ; display countY=80; mov countY, dl int 21h ;NOT WORKING, ERROR CODE mov bl,10 mov al, countY cbw div bl
通过这种划分你是正确的方式,但它太糟糕了,它上面的几行确实破坏了 countY 中的值。
一旦你从分区获得商和余数,你需要用DOS显示它们。首先是商,然后是余数。但是你不要忘记通过向每个字符添加30h来将它们变成字符。
cal:
mov bl,10
mov al, countY ;Values are {0,20,40,60,80}
cbw ;Prepare for division of AX/BL
div bl ; -> AL=quotient AH=remainder
mov dx, ax ;Conveniently moving both to DX
add dx, 3030h ;Adding 30h to each in a single instruction
mov ah, 02h
int 21h ;Display the tenths
mov dl, dh
mov ah, 02h
int 21h ;Display the ones
唯一缺少的是分数可能精确到100的情况,因此需要3位数 只需检测它,显示一个前导“1”,从商中减去10,然后像以前一样继续:
cal:
mov bl,10
mov al, countY ;Values are {0,20,40,60,80,100}
mov ah, 0 ;Prepare for division of AX/BL
div bl ; -> AL=quotient AH=remainder
cmp al, 10
jl Skip
push ax ;Save AX because the DOS call destroys it's value
mov dl, "1"
mov ah, 02h
int 21h ;Display the hundreds
pop ax ;Restore AX
sub al, 10
Skip:
mov dx, ax ;Conveniently moving both to DX
add dx, 3030h ;Adding 30h to each in a single instruction
mov ah, 02h
int 21h ;Display the tenths
mov dl, dh
mov ah, 02h
int 21h ;Display the ones
通过将cbw
更改为mov ah,0
,此版本的代码可以显示0到199之间的所有数字。