CODE SEGMENT
DATA SEGMENT
NUM DB 30H,39H
LIST DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
PORTA EQU 288H
PORTB EQU 28AH
PORTC EQU 28CH
PORTCTL EQU 28EH
DATA ENDS
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA;段分配
START:
MOV AX, DATA;段初始化
MOV DS, AX
MOV DX, PORTCTL;写入控制字
MOV AL, 80H
OUT DX, AL
NEXT1:
;MOV DX, PORTCTL;PC0置0;询问老师二者异同
;MOV AL, 00H
;OUT DX, AL
;MOV AL, 03H;PC1置1
;OUT DX, AL
MOV DX, PORTC
MOV AL, 02H
OUT DX, AL
MOV AL, NUM
SUB AL, 30H
MOV BX, OFFSET LIST
XLAT
MOV DX, PORTA
OUT DX, AL
CALL DELAY
;MOV DX, PORTCTL;PC0置1
;MOV AL, 01H
;OUT DX, AL
;MOV AL, 02H;PC1置0
;OUT DX, AL
MOV DX, PORTC
MOV AL, 01H
OUT DX, AL
MOV AL, NUM+1
SUB AL, 30H
MOV BX, OFFSET LIST
XLAT
MOV DX, PORTA
OUT DX, AL
CALL DELAY
JMP NEXT1
MOV AH, 4CH;返回DOS,仿真无用,反正死循环
INT 21H
MAIN ENDP
DELAY PROC NEAR;延时
PUSH SI
PUSH CX
MOV SI, 1
DELAYNEXT1:
MOV CX, 0E000H
DELAYNEXT2:
LOOP DELAYNEXT2
DEC SI
JNZ DELAYNEXT1
POP CX
POP SI
RET
DELAY ENDP
CODE ENDS
END MAIN
这个简单的仿真我用了很长时间,原因就是遇到了各种各样的仿真问题。
这个程序是为了实际DOS系统8086写的,本意是DOS INT 21H输入数字显示。所以会使用查表指令。仿真中无法输入,所以中间许多步骤都是冗余的。