⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main0.asm

📁 使用汇编语言进行编程
💻 ASM
字号:
;第一次 ok
DATAS SEGMENT
 DISBUF DB 6 DUP(?)
   BTAB DB 01H,02H,04H,08H,10H,20H 
   CTAB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,89H,0BFH,0DCH,0ADH,0B7H;0123456789+-*/=
   XTAB DB 4 DUP(?)
   BUF  DB ?
DATAS ENDS

STACKS SEGMENT
    DW 100 DUP(?)
TOP LABEL WORD     
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
MAIN:
    MOV AX,DATAS
    MOV DS,AX
    MOV AX,STACKS
    MOV SS,AX
    MOV SP,OFFSET TOP               ;初始化
    
    MOV DX,0EE03H
    MOV AL,82H                      ;初始8255,a出b入c出
    OUT DX,AL
    
   
ZHIP:
    LEA DI,DISBUF
    LEA SI,XTAB
    MOV AL,8CH                      ;8CH为p
    MOV CX,6
ZAGAIN:
    MOV  [DI],AL
    INC  DI
    LOOP ZAGAIN                     ;置DISBUF为P
    
    XOR CX,CX                       ;置cx为0
    LEA DI,DISBUF                   ;置di为0
    LEA SI,XTAB                     ;置si为0 
XH1:                                ;;;;;;;;;;;;;;;;;;循环1
   PUSH SI
   PUSH DI
   PUSH CX
   CALL FAR PTR DISPLAY             ;调display显示
   CALL FAR PTR SCAN                ;调scan扫描键盘
   POP CX
   POP DI
   POP SI  
   MOV  AL,BUF
   CMP  AL,0FFH
   JZ  XH1                          ;无按键按下跳xh1
   INC CX

;;;;;;;;;;;;;;;;;;;;;;
;  0   1   2    3
;
;  4   5   6    7
;                                   ;键盘布局
;  8   9   +    - 
;
;  *   /   =    C
;;;;;;;;;;;;;;;;;;;;;;
   CMP  AL,0FH
   JZ  ZHIP                        ;是c键置disbuf为p(重新开始)
   CMP  CX,1
   JZ   JIAN1
   CMP  CX,2
   JZ   JIAN2
   CMP  CX,3
   JZ   JIAN3
   CMP  CX,4
   JZ   JIAN4
   JMP  CHUCUO
JIAN1:
   CMP  AL,09H
   JA  CHUCUO                      ;第一个键大于9则出错
   MOV [SI],AL                     ;将第一个键值存入XTAB
   MOV BX,OFFSET CTAB              
                                    ;CTAB DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,89H,0BFH,0DCH,0ADH,0B7H;0123456789+-*/=
   XLAT                             ;查表转换(BX+AL)-->AL
   MOV [DI],AL                     ;否则存人disbuf  DISBUF DB 6 DUP(?)
   INC  DI                         ;DISBUF指针后移
   INC  SI                         ;XTAB指针后移
   JMP  XH1
JIAN2:
   CMP  AL,09H
   JBE  CHUCUO
   CMP  AL,0DH
   JA   CHUCUO                     ;第二个键值大于9小于14 (+-*/)
   MOV BX,OFFSET CTAB
   XLAT
   MOV [DI],AL
   INC  DI
   JMP  XH1
JIAN3:
   CMP  AL,09H
   JA  CHUCUO                      ;第三个键大于9则出错
   MOV [SI],AL                     ;将第三个键值存入XTAB
   MOV BX,OFFSET CTAB
   XLAT
   MOV [DI],AL                     ;否则存人disbuf
   INC  DI                         ;DISBUF指针后移
   INC  SI
   JMP  XH1
JIAN4:
   CMP AL,0EH
   JNZ CHUCUO
   MOV BX,OFFSET CTAB
   XLAT
   MOV [DI],AL
   INC  DI
   JMP JISUAN
CHUCUO:
    LEA DI,DISBUF                      ;出错将disbuf置为E
    MOV AL,86H 
    MOV CX,6
 CAGAIN:
    MOV  [DI],AL
    INC  DI
    LOOP CAGAIN 
    
    LEA DI,DISBUF                   ;置di为0
    LEA SI,XTAB  
XH2:                                ;;;;;;;;;;;;;;;;;;循环2  出错后或完成后
   PUSH SI 
   PUSH DI
   PUSH CX
   CALL FAR PTR DISPLAY             ;调display显示
   CALL FAR PTR SCAN                ;调scan扫描键盘
   POP CX
   POP DI
   POP SI   
   MOV  AL,BUF
   CMP  AL,0FFH
   JZ  XH2                       ;无按键按下跳xh2

   CMP AL,0FH
   JZ  ZHUANYI1                        ;是c键置disbuf为p(重新开始)
   JMP XH2
ZHUANYI1:
   JMP FAR PTR ZHIP
;;;;;;;;;;;;;;;;;;;;;;;;;;计算过程;;;;;;;;;;;;;;;;;;;;;;;;;;;;
JISUAN:
   LEA DI,DISBUF
   LEA SI,XTAB
   MOV AL,[DI+1]                   ;89H,0BFH,0DCH,0ADH,0B7H
   CMP AL,89H                      ;判断符号(+)
   JZ SIGNADD
   CMP AL,0BFH                     ;-
   JZ SIGNDEC
   CMP AL,0DCH                     ;* 
   JZ SIGNMUL
   CMP AL,0ADH                     ;/
   JZ SIGNDIV
   JMP CHUCUO
SIGNADD:
   XOR AX,AX
   MOV AL,[SI]
   MOV DL,[SI+1]
   ADD AL,DL
   AAA
   MOV BX,OFFSET CTAB
   XLAT 
   MOV [DI+5],AL
   MOV AL,AH
   MOV BX,OFFSET CTAB
   XLAT
   MOV [DI+4],AL
   JMP XH2
SIGNDEC:
	MOV AL,[SI]
	MOV AH,[SI+1]
	CMP AL,AH
	JLE BELOW
	SUB AL,AH
    MOV BX,OFFSET CTAB
    XLAT
	MOV [DI+5],AL
	MOV AL,0C0H
	MOV [DI+4],AL
	JMP XH2
BELOW:
	SUB AH,AL
	MOV AL,AH
	MOV BX,OFFSET CTAB
    XLAT        
	MOV [DI+5],AL
	MOV AL,0BFH
	MOV [DI+4],AL
	JMP XH2
SIGNMUL:
	MOV AL,[SI]
	MOV AH,[SI+1]
	IMUL AH
	AAM
	MOV BX,OFFSET CTAB
	XLAT
	MOV [DI+5],AL
	MOV AL,AH
	MOV BX,OFFSET CTAB
    XLAT
	MOV [DI+4],AL
	JMP XH2
SIGNDIV:
	XOR AX,AX
	MOV AL,[SI]
	MOV DL,[SI+1]
	CMP DL,00H
	JZ  ZHUANYI                         ;除数为零
	IDIV DL
	MOV [SI+2],AH                        ;余数
	MOV [SI+3],AL                        ;商
				
	MOV BX,OFFSET CTAB
	XLAT
	SUB AL,80H
	MOV [DI+4],AL
					      ;余数乘10在除
	MOV AL,AH
	MOV CL,10
	MUL CL
	IDIV DL
	MOV [SI+2],AL                         ;将余数的商存入[SI+2]中
					      ;余数乘以10在除
	MOV AL,AH
	MOV CL,10
	MUL CL
	IDIV DL 
	CMP AL,05H
	JL JIESHU
	MOV AL,[SI+2]                         ;余数大于等于5,加一
	ADD AL,01H
	MOV [SI+2],AL
JIESHU:
    MOV AL,[SI+2]
	MOV BX,OFFSET CTAB
    XLAT 
    MOV [DI+5],AL
    JMP XH2     
ZHUANYI:
    JMP CHUCUO
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;计算过程结束;;;;;;;;;;;;;;;;;;;;;;;;;;

    MOV AH,4CH
    INT 21H
CODES ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;DISPLAY程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE1 SEGMENT
	ASSUME CS:CODE1                 
DISPLAY PROC FAR
     PUSH AX
     PUSH BX
     PUSH CX
     PUSH DX
     LEA DI,DISBUF
     LEA SI,BTAB
     MOV CX,6
AGAIN:
     MOV AL,[SI]
     MOV DX,0EE05H
     OUT DX,AL
     MOV AL,[DI]
     MOV DX,0EE02H
     OUT DX,AL
     INC SI
     INC DI
     
DELAY:
     PUSH CX
     MOV BX,1000
AGAIND:
     MOV CX,6000
 DLP:
     LOOP DLP
     DEC BX
     CMP BX,0
     JNZ AGAIND    ;延时段.........................
     
     POP CX
     LOOP AGAIN
     POP DX
     POP CX
     POP BX
     POP AX
     RET
DISPLAY ENDP
CODE1 ENDS 
;;;;;;;;;;;;;;;;;;;;;;;;;;;SCAN程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CODE2 SEGMENT
	ASSUME CS:CODE2                 ;SCAN程序
SCAN PROC FAR
    MOV BH,4                        ;置行数
    MOV CL,4                        ;置列数
    MOV BL,0FFH                     ;置键值初值为-1
DO1:
    MOV DX,0EE00H
    MOV AL,0
    OUT DX,AL                       ;置行线为0
    MOV DX,0EE01H
    IN  AL,DX                       ;读列线
    CMP AL,0FFH
    JZ  NONE                        ;无键值
    MOV DX,0EE00H
    MOV AL,11111110B                
    OUT DX,AL                       ;置行值为1110
    MOV CH,AL
DO2:
    MOV AL,CH
    MOV DX,0EE00H
    OUT DX,AL
    MOV DX,0EE01H
    IN  AL,DX                       ;读列值
    CMP AL,0FFH
    JNZ YOU                         ;不为零则有按键
    ADD BL,CL                       ;键值加4
    ROL CH,1                        ;否则改变行号
    DEC BH
    JNZ DO2                         ;再一次     
    JMP NONE
YOU:
    CALL FAR PTR DISPLAY             ;调用display,消抖
DO3:
    MOV AH,AL
    MOV DX,0EE01H
    IN  AL,DX                       ;读列值
    CMP AL,0FFH
    JNZ DO3                         ;不为零则说明未放手
    CALL FAR PTR DISPLAY            ;调用display,消抖
KEY:
    INC BL
    ROR AH,1
    JC  KEY                         ;计算键值
    MOV BUF,BL                      ;将键值存入buf中
    JMP DONE  
    
NONE:
    MOV BL,0FFH
    MOV BUF,BL
DONE:                                                    
    MOV AH,02H
    MOV DL,0DH
    INT 21H                           ;回车
    MOV AL,BUF
    MOV AH,02H
    MOV DL,AL
    INT 21H                           ;显示buf中的内容
    RET
SCAN  ENDP
CODE2 ENDS     
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 
     END MAIN

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -