美文网首页
x86基础实验-INT16读取按键

x86基础实验-INT16读取按键

作者: cxzzzz | 来源:发表于2018-05-19 16:05 被阅读0次
简介

分别使用AH=0中断方式、AH=1轮询方式读取键盘按键,并输出按键的扫描码和ASCII码。ESC键退出程序

程序运行结果
image.png
代码
  1. AH=0中断方式
ASSUME  CS:CODE1,DS:DATA1,SS:STACK1

STACK1  SEGMENT STACK
STACK_AREA      DW      200H DUP(?)
STACK_BTM       EQU     $-STACK_AREA
STACK1          ENDS

DATA1   SEGMENT

EXPLAIN_MODE_SELECT     DB  13,10,"please select mode:1.read key from keyboard. 2.read key from buffer. other.quit",13,10,'$'
EXPLAIN_INPUT     DB  13,10,"please press any key:",13,10,'$'
EXPLAIN_OUTPUT_SCAN    DB  13,10,"scan code:",'$'
EXPLAIN_OUTPUT_ASCII    DB  13,10,"ascii code:",'$'
ASCII   DB  20H DUP(0)

DATA1   ENDS

CODE1   SEGMENT

MAIN    PROC    NEAR
        MOV     AX,STACK1
        MOV     SS,AX
        MOV     SP,STACK_BTM
        MOV     AX,DATA1
        MOV     DS,AX
        MOV     ES,AX

        MOV     AH,09H
        MOV     DX,OFFSET EXPLAIN_INPUT 
        INT     21H

    MAIN_LOOP_1:

        MOV     AH,0    ;中断方式读取按键
        INT     16H

        MOV     CL,AL
        XOR     CH,CH

        MOV     BL,AH
        XOR     BH,BH

        MOV     AH,09H
        MOV     DX,OFFSET EXPLAIN_OUTPUT_ASCII
        INT     21H

        PUSH    CX 
        CALL    OUTPUT_NUM_DEC
        
        MOV     AH,09H
        MOV     DX,OFFSET EXPLAIN_OUTPUT_SCAN
        INT     21H

        PUSH    BX 
        CALL    OUTPUT_NUM_DEC

        CMP     BX,1
        JNZ     MAIN_LOOP_1

        MOV     AX,4C00H
        INT     21H


    
MAIN    ENDP

OUTPUT_NUM_DEC  PROC    NEAR ;[SP+2]:num

        PUSH    BP
        MOV     BP,SP
        PUSH    SI
        PUSH    DI
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     AX,[BP+4]
        MOV     SI,10
        MOV     DI,0
        MOV     BP,OFFSET ASCII

    HEX2DEC_LOOP2:

        MOV     DX,0

        MOV     CX,10 
        DIV     CX

        MOV     DS:[BP+DI],DL 
        INC     DI
        CMP     AX,0
        JNE     HEX2DEC_LOOP2

        MOV     CX,DI

    HEX2DEX_LOOP3:

        DEC     DI  
        MOV     DL,DS:[BP+DI]

        PUSH    DX
        CALL    OUTPUT_NUM

        LOOP    HEX2DEX_LOOP3

        POP     DX
        POP     CX
        POP     BX
        POP     AX
        POP     DI
        POP     SI
        POP     BP

        RET     2
        

OUTPUT_NUM_DEC  ENDP

OUTPUT_NUM  PROC    NEAR    ;[SP+2]:num(byte)
        PUSH    BP
        MOV     BP,SP
        PUSH    AX
        PUSH    DX

        MOV     DL,[BP+4]
        CMP     DL,9
        JA      OUTPUT_NUM_ALPHA 

        ADD     DL,'0'
        JMP     OUTPUT_NUM_OUTPUT
    OUTPUT_NUM_ALPHA:
        ADD     DL,'A'-10
        
    OUTPUT_NUM_OUTPUT:
        MOV     AH,02H
        INT     21H

        POP     DX
        POP     AX
        POP     BP

        RET     2
OUTPUT_NUM  ENDP

CODE1   ENDS

END     MAIN

  1. AH=1轮询方式
ASSUME  CS:CODE1,DS:DATA1,SS:STACK1

STACK1  SEGMENT STACK
STACK_AREA      DW      200H DUP(?)
STACK_BTM       EQU     $-STACK_AREA
STACK1          ENDS

DATA1   SEGMENT

EXPLAIN_MODE_SELECT     DB  13,10,"please select mode:1.read key from keyboard. 2.read key from buffer. other.quit",13,10,'$'
EXPLAIN_INPUT     DB  13,10,"please press any key:",13,10,'$'
EXPLAIN_OUTPUT_SCAN    DB  13,10,"scan code:",'$'
EXPLAIN_OUTPUT_ASCII    DB  13,10,"ascii code:",'$'
ASCII   DB  20H DUP(0)

DATA1   ENDS

CODE1   SEGMENT

MAIN    PROC    NEAR
        MOV     AX,STACK1
        MOV     SS,AX
        MOV     SP,STACK_BTM
        MOV     AX,DATA1
        MOV     DS,AX
        MOV     ES,AX

        MOV     AH,09H
        MOV     DX,OFFSET EXPLAIN_INPUT 
        INT     21H

    MAIN_LOOP_1:

        TRY_READ:      ;轮询方式读取按键
        MOV     AH,0
        INT     16H
        JZ      TRY_READ

        MOV     CL,AL
        XOR     CH,CH

        MOV     BL,AH
        XOR     BH,BH

        MOV     AH,09H
        MOV     DX,OFFSET EXPLAIN_OUTPUT_ASCII
        INT     21H

        PUSH    CX 
        CALL    OUTPUT_NUM_DEC
        
        MOV     AH,09H
        MOV     DX,OFFSET EXPLAIN_OUTPUT_SCAN
        INT     21H

        PUSH    BX 
        CALL    OUTPUT_NUM_DEC

        CMP     BX,1
        JNZ     MAIN_LOOP_1

        MOV     AX,4C00H
        INT     21H


    
MAIN    ENDP

OUTPUT_NUM_DEC  PROC    NEAR ;[SP+2]:num

        PUSH    BP
        MOV     BP,SP
        PUSH    SI
        PUSH    DI
        PUSH    AX
        PUSH    BX
        PUSH    CX
        PUSH    DX

        MOV     AX,[BP+4]
        MOV     SI,10
        MOV     DI,0
        MOV     BP,OFFSET ASCII

    HEX2DEC_LOOP2:

        MOV     DX,0

        MOV     CX,10 
        DIV     CX

        MOV     DS:[BP+DI],DL 
        INC     DI
        CMP     AX,0
        JNE     HEX2DEC_LOOP2

        MOV     CX,DI

    HEX2DEX_LOOP3:

        DEC     DI  
        MOV     DL,DS:[BP+DI]

        PUSH    DX
        CALL    OUTPUT_NUM

        LOOP    HEX2DEX_LOOP3

        POP     DX
        POP     CX
        POP     BX
        POP     AX
        POP     DI
        POP     SI
        POP     BP

        RET     2
        

OUTPUT_NUM_DEC  ENDP

OUTPUT_NUM  PROC    NEAR    ;[SP+2]:num(byte)
        PUSH    BP
        MOV     BP,SP
        PUSH    AX
        PUSH    DX

        MOV     DL,[BP+4]
        CMP     DL,9
        JA      OUTPUT_NUM_ALPHA 

        ADD     DL,'0'
        JMP     OUTPUT_NUM_OUTPUT
    OUTPUT_NUM_ALPHA:
        ADD     DL,'A'-10
        
    OUTPUT_NUM_OUTPUT:
        MOV     AH,02H
        INT     21H

        POP     DX
        POP     AX
        POP     BP

        RET     2
OUTPUT_NUM  ENDP

CODE1   ENDS

END     MAIN

相关文章

  • x86基础实验-INT16读取按键

    简介 分别使用AH=0中断方式、AH=1轮询方式读取键盘按键,并输出按键的扫描码和ASCII码。ESC键退出程序 ...

  • x86基础实验-字典排序

    简介 输入n个字符串,对其进行字典排序并输出。(每个字符串长度最长为216-1,支持跨段。字符串个数n最多为约21...

  • x86基础实验-冒泡排序

    简介: 程序运行结果: (运行前内存情况)(红色部分为水印)(直接把学号传到网上会不会出问题....) (运行后内...

  • 实验二-沈正浩-2014

    独立按键实验 一、实验目的 把大板上的独立按键移植到小板上。 二、实验器材 keil软件,普中科技烧录软件,实验板...

  • Arduino 红外遥控

    从左至右分别为OUT、GND、VCC 实验一 读取遥控器按键值通过串口发送值电脑。 接线 Nano功能接收头D9数...

  • 树莓派基础实验6:轻触开关按键实验

    一、介绍    按键模块是我们使用最为频繁的一个电子部件,内部有一对轻触拨盘构成,当按下是闭合导通,松开时自动弹开...

  • 实验二 邓彩凤 0109

    一、实验目的 1、了解大板小板的区别 2、大板上的独立按键实验修改代码后适合小板,按键加一,逢十进一。 二、实验过...

  • 实验二 崔提提0128

    实验目的:1、了解大板小板的区别 2、大板上的独立按键实验修改代码后适合小板,按键加一,逢十进一。 实验器材:ke...

  • x86基础实验-32位乘法

    简介 由于8086只支持8位和16位的乘法,所以16位以上的乘法需要自己实现。该程序实现输入两个32位16进制数,...

  • Golang入门三:类型

    基础类型 布尔类型:bool 整形:int8、byte、int16、int、uint、uintptr等 浮点类型:...

网友评论

      本文标题:x86基础实验-INT16读取按键

      本文链接:https://www.haomeiwen.com/subject/epfadftx.html