📄 iqu_f.asm
字号:
;/////////////8088 caculater/////////////////
;//README
;// key value
; 0~9 <-> 0~9
; A <-> +
; B <-> -
; C <-> *
; D <-> /
; E <-> RESET
; F <-> =
;//USING DIRECT IQUIRING
;////////////////////////////////////////////
DATA SEGMENT
NUM1 DW ? ;CURRENT INPUT NUMBER
TEMP DW ? ;TEMP SAVE
ANS DW ? ;RESULT
FLAG DB ? ;DISPLAY\RESET FLAY
FLAG_O DB ? ;OPERATER FLAG
DATA ENDS
STACK SEGMENT
DW 64 DUP(?)
;
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MAIN_STAR:
;//CONSTANT INITIALIZE
MOV AX,0
MOV BX,0
MOV CX,0
MOV DX,0
MOV NUM1,0
MOV TEMP,0
MOV ANS ,0
MOV FLAG_O,0
MOV FLAG,0
ROUND_ONE:
CALL SCAN ;Keyboard scan
CALL MATCH ;Keycode match
CMP FLAG,1
JNE ROUND_ONE
JMP MAIN_STAR
;////////////KEY SCAN/////////////////////
SCAN LABEL NEAR
MOV AL,90H ;setting:port B out and port A in
OUT 63H,AL
MOV AH,0EEH ;output initialize
ONE:MOV AL,AH
OUT 61H,AL ;port B output BH
;CALL DELAY
TWO:IN AL,60H ;read port A
MOV BL,AL
AND BL,0FH ;get lower 4 bits
CMP BL,0FH ;key down checking
JNE SAVE
ROL AH,1 ;left shift 1 bit
JMP ONE
SAVE:
IN AL,60H
CMP AL,0FH
JNE TWO
MOV BH,BL
AND AH,0F0H ;get BH high 4 bits
OR BH,AH ;save key code to BH
RET
;key scan end
;;//////////////////DISPLAY RESULT///////////////////////////
DISP LABEL NEAR
MOV DL,0
MOV CH,0 ;to
CYC_D:
MOV AX,ANS ;MOVE IN THE RESULT
MOV CL,10
DIV CL
MOV BL,AL ;get remainder
CMP BL,0 ;the remainder should not equal 0 more than twice
JNE GOON
INC CH
CMP CH,1
JG RETURN_D ;RETURN
GOON:
MOV CL,8
SHR AX,CL
ADD AX,0130H ;current data bit output
PUSH AX ;PUSH AND SAVE
INC DL ;SAVE DATA COUNTS
AND BH,0
MOV ANS,BX ;REINITIALIZE ANSWER
JMP CYC_D
RETURN_D:
CMP DL,0
JE RETURN_D_E ;END DISPLAY
POP AX ;POP THE SAVED DATA
INT 10H ;DISPLAY
DEC DL
JMP RETURN_D
RETURN_D_E:
RET
;DISP END
;//////////////////KEYCODE MATCH//////////////
MATCH LABEL NEAR
MATCH_NUM:
CMP BH,0EEH ;0
JNE NUM_1
MOV AX,0130H
MOV TEMP,0
JMP NUM_OK
NUM_1:
CMP BH,0DEH ;1
JNE NUM_2
MOV AX,0131H
MOV TEMP,1
JMP NUM_OK
NUM_2:
CMP BH,0BEH ;2
JNE NUM_3
MOV AX,0132H
MOV TEMP,2
JMP NUM_OK
NUM_3:
CMP BH,07EH ;3
JNE NUM_4
MOV AX,0133H
MOV TEMP,3
JMP NUM_OK
NUM_4:
CMP BH,0EDH ;4
JNE NUM_5
MOV AX,0134H
MOV TEMP,4
JMP NUM_OK
NUM_5:
CMP BH,0DDH ;5
JNE NUM_6
MOV AX,0135H
MOV TEMP,5
JMP NUM_OK
NUM_6:
CMP BH,0BDH ;6
JNE NUM_7
MOV AX,0136H
MOV TEMP,6
JMP NUM_OK
NUM_7:
CMP BH,07DH ;7
JNE NUM_8
MOV AX,0137H
MOV TEMP,7
JMP NUM_OK
NUM_8:
CMP BH,0EBH ;8
JNE NUM_9
MOV AX,0138H
MOV TEMP,8
JMP NUM_OK
NUM_9:
CMP BH,0DBH ;9
JNE OPER_ADD
MOV AX,0139H
MOV TEMP,9
JMP NUM_OK
NUM_OK:
INT 10H ;NUMBER OUTPUT
;NUM1*10+TEMP
MOV BL,10
MOV AX,NUM1
MUL BL
ADD AX,TEMP
MOV NUM1,AX ;INPUT DATA
JMP MATCH_OK
OPER_ADD:
CMP BH,0BBH ;A
JNE OPER_SUB
MOV FLAG_O,1
MOV AX,012BH
JMP OPER_OK
OPER_SUB:
CMP BH,07BH ;B
JNE OPER_MUL
MOV FLAG_O,2
MOV AX,012DH
JMP OPER_OK
OPER_MUL:
CMP BH,0E7H ;C
JNE OPER_DIV
MOV FLAG_O,3
MOV AX,012AH
JMP OPER_OK
OPER_DIV:
CMP BH,0D7H ;D
JNE RESET
MOV FLAG_O,4
MOV AX,012FH
OPER_OK:
INT 10H ;OUTPUT OPERATER
CMP CH,0
JNE OPER_END
MOV AX,NUM1
MOV ANS,AX ;FIRST ROUND SAVE
MOV NUM1,0 ;NUM1 SET O
INC CH
OPER_END:
JMP MATCH_OK
RESET: ;RESET
CMP BH,0B7H
JNE RESULT
CALL CRLF
MOV FLAG,1
JMP MATCH_OK
RESULT: ;=
;CMP BH,0B7H
;JNE MATCH_OK
CMP BH,77H
JNE MATCH_OK
;;
CMP FLAG_O,1 ;ADD
JNE OP_DEC ;ANS+NUM1=>ANS
MOV AX,ANS
ADD AX,NUM1
MOV ANS,AX
JMP OP_END
OP_DEC:
CMP FLAG_O,2 ;DEC
JNE OP_MUL ;ANS-NUM1=>ANS
MOV AX,ANS
SUB AX,NUM1
MOV ANS,AX
JMP OP_END
OP_MUL:
CMP FLAG_O,3 ;MUL
JNE OP_DIV ;ANS*MUL=>ANS
MOV AX,ANS
MOV DX,NUM1
MUL DX
MOV ANS,AX
JMP OP_END
OP_DIV: ;DIV
MOV AX,ANS ;ANS/MUL=>ANS
MOV CX,NUM1
DIV CX
AND AX,00FFH
MOV ANS,AX
OP_END:
MOV AX,013DH ;OUTPUT '='
INT 10H
CALL DISP ;OUTPUT RESULT
CALL CRLF ;CRLF
MOV FLAG,1
MATCH_OK:
RET
;MATCH END
;///////////////////CRLF//////////////////////
CRLF LABEL NEAR
MOV AX,010AH
INT 10H
MOV AX,010DH
INT 10H
RET
;CRLF END
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -