求大神帮忙把这个汇编改成C语言,谢谢

qq_37042686 2016-12-14 08:42:09
A3 EQU 288H
B3 EQU 289H
CTL3 EQU 28BH

A EQU 0280H
B EQU 0281H
C EQU 0282H
CTL EQU 0283H

DATA SEGMENT
TABLE DB 06BH,06DH,06EH,0A7H
DB 0ABH,0ADH,0AEH,0C7H

TABL1 DB 06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH

TABL2 DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
DATA ENDS
STACK SEGMENT STACK
DW 50 DUP(0)
TOP_STAC LABEL WORD
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK

START:MOV AX,STACK
MOV SS,AX
LEA SP,TOP_STAC
MOV AX,DATA
MOV DS,AX
MOV DX,CTL
MOV AL,10000010B
OUT DX,AL

MOV DX,C
MOV AL,71H
OUT DX,AL

CALL OPEN
CALL YSHQ2
CALL TAME

MOV DX,A
MOV AL,00H
OUT DX,AL

MOV BX,10
;检测是否所有键都松开
MOV DX,B
T_O: IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE T_O

;检测是否有键被按下
T_P: CALL IEND

MOV DX,A
MOV AL,00H
OUT DX,AL

MOV DX,B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE T_P

MOV CX,16EAH ;延时
DELAY:LOOP DELAY

;检测是否有键仍被按下
IN AL,DX
AND AL,0FH
CMP AL,0FH
JE T_P

;看是哪一个键被按下
MOV AL,0F7H
MOV CL,AL
NEXT_ROW: MOV DX,A
OUT DX,AL
MOV DX,B
IN AL,DX
AND AL,0FH
CMP AL,0FH
JNE ENCODE
ROR CL,01
MOV AL,CL
JMP NEXT_ROW

ENCODE: MOV BX,0007H
IN AL,DX
NEXT_TRY: CMP AL,TABLE[BX]
JE DONE
DEC BX
JNS NEXT_TRY
JMP T_P

DONE: MOV AH,00
CALL YSHQ2
CALL SHOW

;显示键号
SHOW PROC NEAR
MOV AL,TABL1[BX]
MOV DX,C
OUT DX,AL
CALL FUW
RET
SHOW ENDP


;复位
FUW PROC NEAR
MOV DX,A
MOV AL,00H
OUT DX,AL

MOV DX,A
MOV AL,0DH
OUT DX,AL

MOV DX,B
IN AL,DX
AND AL,0EFH
CMP AL,0CEH
JNE FUW
JMP START
RET
FUW ENDP

;开始键
OPEN PROC NEAR
H: MOV DX,A
MOV AL,0CH
OUT DX,AL

MOV DX,B
IN AL,DX
AND AL,0EFH
CMP AL,0CDH
JNE H
RET
OPEN ENDP

;定时器定时20s
TAME PROC NEAR
MOV DX,CTL3
MOV AL,00110100B
OUT DX,AL
MOV DX,A3
MOV AL,20H
OUT DX,AL
MOV AL,4EH
OUT DX,AL
MOV DX,CTL3
MOV AL,01110111B
OUT DX,AL
MOV DX,B3
MOV AL,00H
OUT DX,AL
MOV AL,01H
OUT DX,AL
RET
TAME ENDP


;定时是否结束
IEND PROC NEAR
MOV DX,B
IN AL,DX
AND AL,10H
CMP AL,CH
JE L9
MOV CH,AL
DEC BX
MOV AL,TABL2[BX]
MOV DX,C
OUT DX,AL
JNS L9
CALL YSHQ1
L9: RET
IEND ENDP


;扬声器(超时和出错)
YSHQ1 PROC NEAR
MOV DX,C
MOV CX,250H
DELAY2: MOV AL,80H
OUT DX,AL
LOOP DELAY2
MOV AL,00H
OUT DX,AL
MOV DX,C
MOV AL,79H
OUT DX,AL
CALL FUW
RET
YSHQ1 ENDP

;扬声器(开始和有人抢答)
YSHQ2 PROC NEAR
MOV DX,C
MOV CX,100H
DELAY1: MOV AL,80H
OUT DX,AL
LOOP DELAY1
MOV AL,00H
OUT DX,AL
RET
YSHQ2 ENDP

CODE ENDS
END START
...全文
1414 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
gen1221 2017-10-09
  • 打赏
  • 举报
回复
参考答案:略

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧