汇编 写一个程序完成如下功能:读键盘,并把按键在显示器上显示出来。在检测到按下SHIFT键时,程序结束。

汇编 写一个程序完成如下功能:读键盘,并把按键在显示器上显示出来。在检测到按下SHIFT键时,程序结束。,第1张

code segment assume cs:code L_shift=00000010b R_shift=00000001b main proc far start: mov ah,2 int 16h 得到旁码族变换键状态字运弊节 test al,L_shift+R_shift jnz over 按下shift键时转 mov ah,1 int 21h 是否有键模余可读 jz start 无键转 mov dl,al mov ah,6 int 21h jmp start over: mov ah,4ch int 21h main endp code ends end start

开关控制指示灯显示

MY8255_AEQU 0A860H;8255A口地址

MY8255_BEQU 0A861H;8255B口地址

MY8255_CEQU 0A862H;8255C口地址

MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,MY8255_MODE

MOV AL,82H

OUT DX,AL;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1:MOV DX,MY8255_B

IN AL,DX ;读8255 B口内容

MOV DX,MY8255_A

OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容

CALL BREAK;调用子程序BREAK

JMP A1;跳转到A1

BREAK PROC NEAR ;BREAK子程序

MOV AH,1

INT 16H

JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符

MOV AX,4C00H

INT 21H ;返回DOS 

RETURN:RET

BREAK ENDP

CODE ENDS 皮氏渗

END START

流水灯显示

MY8255_AEQU 0b860H;8255A口地址

MY8255_BEQU 0b861H;8255B口地址

MY8255_CEQU 0b862H;8255C口地址

MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT

LA DB ?;留出1个字节

LB DB ?;留出1个字节

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DX,MY8255_MODE

MOV AL,80H

OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。

MOV DX,MY8255_A

MOV AL,7FH

OUT DX,AL ;将7FH送入A口

MOV LA,AL ;将7FH送入LA存储单元燃脊

MOV DX,MY8255_B

MOV AL,0FEH

OUT DX,AL;将FEH送入B口

MOV LB,AL ;将FEH送入LB存储单元

CALL DALLY

A1:MOV AL,LA

ROR AL,1;LA内容循环右移1次

MOV LA,AL

MOV DX,MY8255_A

OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮

MOV AL,LB

ROL AL,1 ;LB内容循环左移1次

MOV LB,AL

MOV DX,MY8255_B

OUT DX,AL ;将循环左移后的LB内容送B口,核如其目的是让B口连接的LED灯依次向左循环点亮

CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个

CALL BREAK ;调用BREAK子程序,看是否有键按下

JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序

D1:MOV AX,0FFFFH

D2:DEC AX

JNZ D2

LOOP D1

RET

BREAK PROC NEAR ;是否有键按下

MOV AH,06H

MOV DL,0FFH

INT 21H

JE RETURN ;若无,则转RETURN

MOV AX,4C00H

INT 21H ;返回DOS

RETURN:RET

BREAK ENDP

CODE ENDS

END START

因为最大(FFFF)是四位,所以输出的也是四位

如:

输入A

输出0041H

核心腔漏代码是向十六进制伍态烂转换的子程序

data segment

str1 db 'INPUT:$'

str2 db 'ASCII(16):$'

data ends

code segment

assume cs:code,ds:data

main proc far

start:

mov ax,data

mov ds,ax

lea dx,str1

mov ah,09h

int 21h

mov ah,01h

int 21h

cbw8位扩展为16位

mov bx,ax将字符的ASCII存入BX

call crlf回车换行子程序

lea dx,str2

mov ah,09h

int 21h

call transform转换子程序闭铅

mov dl,'H'

mov ah,02h

int 21h

mov ah,4ch

int 21h

ret

main endp

transform proc near

mov ch,4

rotate: mov cl,4

rol bx,cl

mov al,bl

and al,0fh

add al,30h

cmp al,3ah

jl printit

add al,7h

printit:mov dl,al

mov ah,02h

int 21h

dec ch

jnz rotate

ret

transform endp

crlf proc near

mov dl,0ah

mov ah,02h

int 21h

mov dl,0dh

mov ah,02h

int 21h

ret

crlf endp

code ends

end start

怎么不给分啊,呵呵


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12434772.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存