如何顯示 3 位數的答案?
注意:我在 addend 和 augend 中需要 Base 3,因為答案需要是 base 3 我該如何顯示?我正在使用記事本 ,然后使用 tasm add.asm / tlink add / add。執行程式。我是 dosbox 的新手,所以只想學習如何在 base 3 中顯示 3 位數的答案。
我在記事本 中的代碼:
.model small
.stack 100h
.data
Spc db 0dh,0ah, " $" ;New Line
ErAd31 db 0dh,0ah, "Input only number to proceed [00-22 only]. $" ;Error Input Addition Addend and Augend
ErAd32 db 0dh,0ah, "Input only [Y/y] Add Again [N/n] No. $" ;Error Input Add Again
;Bases Calculation in Calculator
BsA31 db 0dh,0ah, " Base 03 Addition " ;Addition Base 03
db 0dh,0ah, " "
db 0dh,0ah, "Addend[00-22]: $"
BsA32 db 0dh,0ah, "Augend[00-22]: $"
SumA db 0dh,0ah, " Sum is : $" ;Sum
AgA db 0dh,0ah,0dh,0ah, "Add Again[Y/N]? : $" ;Sum Again
;Calculation Logic
Dg11 db 0
Dg12 db 0
NoAd1 db 0
NoAd2 db 0
SumAd db 0
.code
main proc
mov ax,@data ;initialize ds
mov ds,ax
AdBs3:
mov ah,09h
lea dx, Spc
int 21h
lea dx, BsA31 ;Addend
int 21h
mov ah,01h
int 21h ;1st Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg11,al
mov ah,01h
int 21h ;2nd Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg12,al
mov al, Dg11
mov bl,10h
mul bl
mov NoAd1,al
mov al,Dg12
add NoAd1,al
jmp AdBs32
ErrAd31:
mov ah,09h
lea dx, Spc
int 21h
lea dx, ErAd31
int 21h
jmp AdAgain
Ad1:
cmp al, 59h or 79h
je AdBs3
AdBs32:
mov ah,09h
lea dx, BsA32 ;Augend
int 21h
mov ah,01h
int 21h ;1st Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg11,al
mov ah,01h
int 21h ;2nd Digit
cmp al,29h
jle ErrAd31
cmp al,33h
jge ErrAd31
sub al,30h
mov Dg12,al
mov al, Dg11
mov bl,10h
mul bl
mov NoAd2,al
mov al,Dg12
add NoAd2,al
;Addition
mov bl, NoAd1
add bl, NoAd2
mov cx,bx
add cx,3210h
mov ah,09h
lea dx, SumA
int 21h
mov ah,02h
mov dl,ch
int 21h
mov dl,cl
int 21h
jmp AdAgain
AdAgain:
mov ah,09h
lea dx, Spc
int 21h
lea dx, AgA
int 21h
mov ah,01h
int 21h
cmp al, 59h or 79h
je Ad1
cmp al, 4Eh or 6Eh
je AdOut
AdOut:
mov ah,4Ch ;end here
int 21h
main endp
end main
需要的輸出:
Base 03 Addition
Addend[00-22]: 22
Augend[00-22]: 22
Sum is :121
Add Again[Y/N]? : N
uj5u.com熱心網友回復:
cmp al, 29h <================ jle ErrAd31 cmp al, 33h jge ErrAd31
和
mov al, Dg11 mov bl, 10h <================ mul bl
和
mov bl, NoAd1 add bl, NoAd2 mov cx, bx add cx, 3210h <================
你的十六進制數字系統似乎有問題!
要檢查輸入數字的有效性,您應該與 2Fh 而不是 29h 進行比較。您忘記了十六進制也使用 A、B、C、D、E 和 F 作為數字。“0”正下方的ASCII碼是2Fh(因為“0”的ASCII碼是30h)。
要轉換 base-3 輸入,乘法應該使用 3,而不是 10h,它實際上等于 16。
我不知道你認為這
add cx, 3210h會做什么。
如何在基數 3 中顯示 3 位數字答案。
以 3 為底顯示數字與以 10 為底顯示數字沒有什么不同。我從使用 DOS 顯示數字的答案中復制了下一段代碼。我變成mov bx, 10了mov bx, 3et voilà...
mov al, NoAd1
add al, NoAd2
mov ah, 0
; Your number is in AX
mov bx, 3 ; CONST
xor cx, cx ; Reset counter
.a: xor dx, dx ; Setup for division DX:AX / BX
div bx ; -> AX is Quotient, Remainder DX=[0,2]
push dx ; (1) Save remainder for now
inc cx ; One more digit
test ax, ax ; Is quotient zero?
jnz .a ; No, use as next dividend
.b: pop dx ; (1)
add dl, "0" ; Turn into character [0,2] -> ["0","2"]
mov ah, 02h ; DOS.DisplayCharacter
int 21h
AdAgain:
重復或退出程式很麻煩
mov ah,01h int 21h cmp al, 59h or 79h je Ad1 cmp al, 4Eh or 6Eh je AdOut AdOut:
- 這種使用
or不提供 UCase 和 LCase 之間的選擇。 - 使用條件跳轉跳轉到頂部迫使您引入中間標簽,因為目標太遠了。
- 如果用戶沒有按任何提到的鍵,則無論如何您都會退出程式。那為什么還要和“N”或“n”比較呢?
更好的使用:
AdAgain:
mov ah, 09h
lea dx, Spc
int 21h
lea dx, AgA ; "Continue?"
int 21h
.z: mov ah, 01h
int 21h
or al, 32 ; Make LCase
cmp al, "n" ; 6Eh
je AdOut
cmp al, "y" ; 79h
jne .z ; (*)
jmp AdBs3 ; (**)
AdOut:
(*) 用戶必須回答“N”、“n”、“Y”或“y”,否則問題會重復。
(**) 這jmp可以一直跳到頂部。您不再需要中間標簽Ad1。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482893.html
