2015-11-16 45 views
-1

这是我的代码:大会鸸鹋8086输入点击特定的按钮2040

DSEG SEGMENT 'DATA' 

; add DATA 

DSEG ENDS 

SSEG SEGMENT STACK 'STACK' 
     DW  100h DUP(?) 
SSEG ENDS 

CSEG SEGMENT 'CODE' 

;******************************************* 

START PROC FAR 

; Store return address to OS: 
    PUSH DS 
    MOV  AX, 0 
    PUSH AX 

; set segment registers: 
    MOV  AX, DSEG 
    MOV  DS, AX 
    MOV  ES, AX 

; initialization 
    MOV DX, 2040h 
    MOV AL, 00h 
    OUT DX, AL 
    MOV DX, 2080h 
    OUT DX, AL 

NEXT: 
    MOV DX, 2080h ; input data entrada dos buttons 
    IN AX, DX ; 16-bit input 

    MOV DX, 2040h ; output data/saida para ASCII LCD display 
    OUT DX, AL 

    JMP NEXT ; infinit loop 


; return to operating system: 
    RET 
START ENDP 

;******************************************* 

CSEG ENDS 

     END START ; set entry point. 

我想,当按下button 1中挑选一个动作,就像到另一个过程的调用。

+0

其中,您使用哪个插件需要端口0x2080和0x2040? (由学校/班级提供)。哪个插件提供按钮? –

+0

@MichaelPetch我正在使用仿真器工具包,使用emu8086内部的虚拟设备,并且确实需要一些帮助来弄清楚,点击按钮1调用过程。 –

回答

1

我找到了自己的问题的解决方案。我使用的代码如下:

DSEG SEGMENT 'DATA' 

msg1: db  "PLAY!", 0Dh,0Ah, 24h 
msg2: db  "PAUSE!", 0Dh,0Ah, 24h 
msg3: db  "STOP!", 0Dh,0Ah, 24h 
msg4: db  "UP!", 0Dh,0Ah, 24h 
msg5: db  "DOWN!", 0Dh,0Ah, 24h 

DSEG ENDS 

SSEG SEGMENT STACK 'STACK' 
     DW  100h DUP(?) 
SSEG ENDS 

CSEG SEGMENT 'CODE' 

;******************************************* 

START PROC FAR 

; Store return address to OS: 
    PUSH DS 
    MOV  AX, 0 
    PUSH AX 

; set segment registers: 
    MOV  AX, DSEG 
    MOV  DS, AX 
    MOV  ES, AX 

; initialization 
    MOV DX, 2040h 
    MOV AL, 00h 
    OUT DX, AL 
    MOV DX, 2080h 
    OUT DX, AL 

NEXT: 
    MOV DX, 2080h ; input data entrada dos buttons 
    IN AX, DX ; 16-bit input 

    CMP AL,02 
    JE PLAY 

    CMP AL,02 
    JE PAUSE 

    CMP AL,04 
    JE STOP 

    CMP AL,01 
    JE UP 

    CMP AH,01 
    JE DOWN 


    MOV DX, 2040h ; output data/saida para ASCII LCD display 
    OUT DX, AL 

    JMP NEXT ; infinit loop 


; return to operating system: 
    RET 
START ENDP 



PLAY PROC 

     mov  dx, msg1 ; load offset of msg into dx. 
     mov  ah, 09h ; print function is 9. 
     int  21h  ; do it! 

     mov  ah, 0 
     int  16h  ; wait for any key.... 
    RET   
PLAY ENDP 

PAUSE PROC 

     mov  dx, msg2 ; load offset of msg into dx. 
     mov  ah, 09h ; print function is 9. 
     int  21h  ; do it! 

     mov  ah, 0 
     int  16h  ; wait for any key.... 
    RET   
PAUSE ENDP 

STOP PROC 

     mov  dx, msg3 ; load offset of msg into dx. 
     mov  ah, 09h ; print function is 9. 
     int  21h  ; do it! 

     mov  ah, 0 
     int  16h  ; wait for any key.... 
    RET   
STOP ENDP 

UP PROC 

     mov  dx, msg4 ; load offset of msg into dx. 
     mov  ah, 09h ; print function is 9. 
     int  21h  ; do it! 

     mov  ah, 0 
     int  16h  ; wait for any key.... 
    RET   
UP ENDP 

DOWN PROC 

     mov  dx, msg5 ; load offset of msg into dx. 
     mov  ah, 09h ; print function is 9. 
     int  21h  ; do it! 

     mov  ah, 0 
     int  16h  ; wait for any key.... 
    RET   
DOWN ENDP 


;******************************************* 

CSEG ENDS 

     END START ; set entry point. 
+0

请花时间格式化此程序。也请解释为什么这个程序回答这个问题。 –

+0

我必须同意@ user3144770:除非有一般的解释(除代码和代码注释之外),否则我不会考虑upvote,这些解释一般如何工作,以及它如何解决OP问题(它不必过分看中)。 –

+0

关于你为什么选择通过'RET'从每个按钮处理程序等重新启动程序的讨论可能会帮助OP。 –