按这个理解帮你改一下,方法是悔芹:
程序启时,先存一下初始状态,以后用变化的判断来触发。
另,我这里没有汇编工具,没有调试。有问题我们再讨论
stt segment stack
db 64 dup (0)
stt ends
data segment
++++++++++++++++
kStart db 0
kReset db 0
kPause db 0
+++++++++++++++++
data ends
code segment
assume cs:code,ds:data,ss:stt
start:
mov ax,data
mov ds,ax
mov al,89h ;控制字的写入,A口输出,C口输入,B口输出
out 63h,al
mov al,0ffh
out 62h,al
++++++++++++++++++
in al,62h
push ax
and al,8
mov [kStart],al
pop ax
push ax
and al,10h
mov[kPause],al
popax
and al,1
mov [kReset],al
+++++++++++++++++++
a1: mov al,30h ;管脚清零
out 60h,al
mov al,6fh
out 61h,al
a2: in al,62h ;开始
++++++++++++++++
test al,08h -----------
andal,8
xoral,[kStart]判状态变了没,如果目前的状态与之前保存的一样,说明没有变
jnz a2 -------------
jza2
mov[kStart],al 保存新的状态
+++++++++++++++++
call delay1
mov al,7fh
out 61h,al
call delay1
mov al,07h
out 61h,al
call delay1
mov al,7dh
out 61h,al
call delay1
mov al,6dh
out 61h,al
call delay1
mov al,66h
out 61h,al
call delay1
mov al,4fh
out 61h,al
call delay1
mov al,5bh
out 61h,al
call delay1
mov al,06h
out 61h,al
call delay1
mov al,3fh
out 61h,al
call delay1
delay1 proc秒延时
push cx
mov cx,0ffffh
YS:in al,62h 暂停循环
++++++++++++++++
test al,10h -----------
andal,10h
xoral,[kPause]判状态变了没,如果目前的状态与之前保存的一样,说明没有变
jz YS
mov [kPause],al
+++++++++++++++++
in al,62h 复位跳神袜转至显示"9"
++++++++++++++++
test al,1 -----------
andal,1h
xoral,[kReset]判状态变了没,如果目前游前激的状态与之前保存的一样,说明没有变
jza1 注意,我搞不太清楚你的RESET的功能是什么,如果和你想的不一样,改成JNZ
+++++++++++++++++
test al,01h -------------
jz a1-------------
loop YS
pop cx
ret
delay1 endp
code ends
end start
DATA SEGMENTTABLE DB 10H,34H,45H,0FDH,0,0,87H,95H,23H,0CDH 十个数
ZERO DB ?零的个数
PLUS DB ? 正数的个数
MINUS DB ? 负数个数
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX 初始化段寄存器
LEA BX,TABLE 取地址指针
MOV CX,10 判断次数
MOV DX,0 DX寄存器清零
BEG:
MOV AL,[BX] 将TABLE中的数移入AL寄存器中
CMP AL,0 和零比较
JL MIN 小于0则跳转MIN
CMP AL,0 否则在进行比较
JG PLS 大镇雹于肢旅手0则跳转PLS
JMP NEXT 无条件跳转NEXT
PLS:
INC DL 正数个数加一
JMP NEXT无条件跳转NEXT
MIN:
INC DH负数个数加一
NEXT:
INC BX 每比较一次,地址指针加一,指向下一个数
LOOP BEG
MOV PLUS,DL 将历嫌正数个数存入PLUS存储单元
MOV MINUS,DH将负数个数存入MINUS单元
MOV AH,10
SUB AH,DL
SUB AH,DH 剩下的只有0的个数
MOV ZERO,AH 零的个数移入ZERO存储单元
MOV AH ,4CH
INT 21H 返回DOS
CODE ENDS
END START
测试过了,可以生成exe,并且能调试通过,不懂可以hi我。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)