?? js2.asm
字號:
CURS MACRO A,B
MOV AH,2 ;置光標位置
MOV BH,0 ;頁號為0
MOV DH,A ;設置光標的坐標為(A.B)
MOV DL,B
INT 10H ;BIOS調用
ENDM
;-------------------------------
DISPMSG MACRO MESSAGE
LEA DX,MESSAGE ;傳遞MESSAGE的偏移地址
MOV AH,9 ;顯示字符串
INT 21H ;DOS調用
ENDM
;----------------------------------
CLEAR MACRO COLOR ;清屏
MOV AH,6 ;屏幕初始化
MOV AL,0 ;頁號
MOV CH,0 ;設置左上角的坐標為(0,0)
MOV CL,0
MOV DL,100 ;設置右上角的坐標為(100,100)
MOV DH,100
MOV BH,COLOR ;卷入行屬性
INT 10H ;BIOS調用
ENDM
.MODEL SMALL
.STACK
.DATA ;數據段定義
MSG0 DB '* * * * * * * * * * * * * * * * * * * *',0DH,0AH ;,0dh,0ah,0dh,0ah
DB ' * *',0DH,0AH
;db '* *',0dh,0ah
;db '* *',0dh,0ah
DB ' * --------COUNTER-------- *',0DH,0AH ;,0dh,0ah,0dh,0ah
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * DATA1:'
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * DATA2:'
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * RESULT:'
DB '_______________ *',0DH,0AH,0DH ;,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * * * * * * * * * * * * * * * * * * * *','$'
MSG1 DB 'choose +,-,*,/','$'
MSG2 DB 'you choose wrong','$',0AH,0DH
MSG3 DB 'Press ESC to Exit!',0DH,0AH,'$'
MSG4 DB 'Press any key to continue!',0DH,0AH,'$'
MSG5 DB '-','$'
MSG6 DB '.','$'
MSG7 DB 'error input!','$'
MSG8 DB 'data2 is wrong!','$'
DATA1 DW ?
DATA2 DW ?
.CODE ;代碼段從這里開始
;--------------------------------------------
DEC_DIV PROC NEAR
CWD ;將字轉換為雙字,AX內容符號擴展到DX
DIV CX
PUSH DX
MOV DL,AL
ADD DL,30H ;將不是數字的字符轉換為數字
MOV AH,2 ;顯示輸出
INT 21H ;DOS調用
POP DX
MOV AX,DX
RET
DEC_DIV ENDP
;------------------------------------------
CHANGE PROC NEAR ;該子程序的功能:將AX中存儲的十六進制數轉換為十進制數
CMP AX,1000
JAE C1 ;AX≥1000則轉移
CMP AX,100
JAE C2 ;AX≥100則轉移
CMP AX,10
JAE C3 ;AX≥10則轉移
JMP C4 ;AX<10
C1: MOV CX,1000D
CALL DEC_DIV
C2: MOV CX,100D
CALL DEC_DIV
C3: MOV CX,10D
CALL DEC_DIV
C4: MOV CX,1D
CALL DEC_DIV
RET
CHANGE ENDP
;-------------------------------
BEGIN PROC NEAR
BACK: CLEAR 1EH
CURS 2,20 ;設置光標為(2.20)
DISPMSG MSG0 ;顯示用戶界面
CURS 8,11 ;設置光標為(8,41) ,第一行
MOV BX,0
MOV CX,2
NEWCHAR1:
MOV AH,1 ;鍵盤輸入并回顯
INT 21H ;DOS調用
CMP AL,30H ;檢查輸入的字符是不是數字
JAE J1 ;如果不是,則轉移至J1
JMP D2 ;是,轉移到D2執行
J1: CMP AL,39H ; 與9的ASCII侶氡
JBE J2 ;如果輸入的字符是0-9,則轉移至J2
JMP D2 ;如果不是數字,則轉移至D2
J2: SUB AL,30H
CBW ;AL的內容符號擴展到AH
XCHG AX,BX
MOV DI,10
MUL DI
XCHG AX,BX
ADD BX,AX
LOOP NEWCHAR1
MOV DATA1,BX
CURS 11,11 ;設置光標位為(11,40),第二行
MOV BX,0
MOV CX,2
NEWCHAR2:
MOV AH,1 ;鍵盤輸入并回顯
INT 21H ;DOS調用
CMP AL,30H ;與0的ASCII碼比較
JAE J3 ;如果輸入數字大于等于0則跳轉至J3
JMP D2
J3: CMP AL,39H ;與9比較
JBE J4 ;如果小于或等于9則跳轉
JMP D2 ;如果輸入不是數字則跳轉
J4: SUB AL,30H ;如果輸入不是0-9,則轉化成相應的字符
CBW ;將AL符號擴展到AH
XCHG AX,BX
MOV DI,10
MUL DI
XCHG AX,BX
ADD BX,AX
LOOP NEWCHAR2
MOV DATA2,BX
MOV AX,DATA1
MOV BX,DATA2
PUSH AX
PUSH BX
CURS 15,33 ;設置光標的位置為(15.33),第三行
DISPMSG MSG1 ;顯示提示信息
MOV AH,1 ;接受鍵盤輸入并回顯
INT 21H ;DOS調用
CMP AL,'+'
JE ADDI ;如果運算符為+,則計算兩數之和
CMP AL,'-'
JE SUBT ;如果運算符為-,則計算兩數之差
CMP AL,'*'
JE MULT ;如果運算符為*,則計算兩數之積
CMP AL,'/'
JE DIVI ;如果運算符為/,則計算兩數之商
CURS 16,25 ;設置光標為(16,25)
DISPMSG MSG2 ;在屏幕上輸出提示信息
JMP D1
;----------------------------------------
;ADD THE TWO DATAS
ADDI: POP BX
POP AX
ADD AX,BX ;計算兩數字之和
PUSH AX
CURS 14,21 ;設置光標位置為(14,11)
POP AX
CALL CHANGE ;將結果轉換為十進制數
JMP D1
;---------------------------------------
;SUBTRACT THE TWO DATAS
SUBT: POP BX
POP AX
CMP AX,BX ;比較兩數大小
JAE D0 ;如果AX>=BX則跳轉
XCHG AX,BX
PUSH AX
PUSH BX
CURS 14,10 ;設置光標位置為(14,40)
DISPMSG MSG5 ;在屏幕上顯示負號
POP BX
POP AX
D0: SUB AX,BX ;計算兩數之差
PUSH AX
CURS 14,11 ;設置光標位置為(14,41)
POP AX
CALL CHANGE ;將結果轉換為十進制數
JMP D1
;---------------------------------------
;MULTIPLY THE TWO DATAS
MULT: POP BX
POP AX
MUL BX ;計算兩數之積
PUSH AX
CURS 14,11 ;設置光標位置為(14,41)
POP AX
CALL CHANGE ;將結果轉換為十進制數
JMP D1
;---------------------------------------
;DIVIDE THE TWO DATAS
DIVI: POP BX
POP AX
CMP BX,0 ;判斷除數是否為0
JE ERROR ;如果是0則跳轉
CWD
DIV BX ;計算兩數之商
PUSH DX
PUSH AX
CURS 14,11 ;設置光標位置為(14,41)
POP AX
CALL CHANGE ;將十六進制數轉換為十進制數
POP DX
CMP DX,0
JNE LOP ;如果DX不等于0則跳轉
JMP D1
LOP: MOV CX,4 ;設置精確度為小數點后4位
PUSH DX
DISPMSG MSG6 ;輸出小數點
POP DX
CON: PUSH BX
MOV AX,DX
MOV BX,10
MUL BX
POP BX
CWD ;將AX的內容符號擴展到雙字
DIV BX ;計算小數點后每一位的數字
PUSH DX
PUSH CX
CALL CHANGE ;將十六進制數轉化為十進制數
POP CX
POP DX
CMP DX,0 ;判斷是否已經計算到小數點后第六位
JE D1 ;如果是,則跳轉
LOOP CON ;如果不是,就繼續計算
ERROR: CURS 15,33 ;設置光標位置為(15,33)
DISPMSG MSG8 ;提示出錯
D1: RET
D2: PUSH AX
PUSH BX
CURS 15,33 ;設置光標位置為(15,33)
DISPMSG MSG7 ;提示輸入出錯
POP BX
POP AX
RET
BEGIN ENDP
;----------------------------------------
MAIN PROC NEAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
PUSH DS
XOR AX,AX
PUSH AX
MOV DATA2,0 ;將緩沖區清空
MOV DATA1,0
AGAIN:
CALL BEGIN
CURS 16,23 ;設置光標位置為(16.23)
DISPMSG MSG3 ;在屏幕上輸出提示信息,提示退出的方法
CURS 17,23 ;設置光標位置為(17.23)
DISPMSG MSG4 ;在屏幕上輸出提示信息,提示繼續的方法
MOV AH,7 ;鍵盤輸入,無回顯
INT 21H ;DOS調用
CMP AL,27 ;判斷輸入的是否為ESC
JNE AGAIN ;如果不是就繼續執行以上運算
EXIT: MOV AX,4C00H ;如果是就退出系統
INT 21H ;DOS調用
MAIN ENDP
END MAIN
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -