Assembly 按menu键打开组件上cmd上的.txt文件

Assembly 按menu键打开组件上cmd上的.txt文件,assembly,x86,dos,dosbox,Assembly,X86,Dos,Dosbox,我目前正在为大学开发一个组装项目,其中包括为迷宫游戏创建一个菜单,但首先我必须通过按“1”键访问所需的菜单选项,然后我的cmd应该显示“labirito.txt”的内容,即我的迷宫。我已经有了退出选项运行的钥匙,但我的“JOGAR”播放选项不起作用。我打开“Menu.txt”并在cmd上打印内容,我想对“maze.txt”做同样的操作,但我不知道为什么。这是我的密码: .8086 .model small .stack 2048h dseg segment para public 'da

我目前正在为大学开发一个组装项目,其中包括为迷宫游戏创建一个菜单,但首先我必须通过按“1”键访问所需的菜单选项,然后我的cmd应该显示“labirito.txt”的内容,即我的迷宫。我已经有了退出选项运行的钥匙,但我的“JOGAR”播放选项不起作用。我打开“Menu.txt”并在cmd上打印内容,我想对“maze.txt”做同样的操作,但我不知道为什么。这是我的密码:

.8086
.model small
.stack 2048h

dseg    segment para public 'data'

        Erro_Open       db      'Erro ao tentar abrir o ficheiro$'
        Erro_Ler_Msg    db      'Erro ao tentar ler do ficheiro$'
        Erro_Close      db      'Erro ao tentar fechar o ficheiro$'
        Fich1           db      'Menu.TXT',0
        Fich2           db      'Labirinto.TXT',0
        Fich3           db      'Top10.TXT', 0
        HandleFich      dw      0
        car_fich        db      ?

dseg    ends



cseg    segment para public 'code'

    assume  cs:cseg, ds:dseg

LE_TECLA    PROC

        mov     ah,08h
        int     21h
        mov     ah,0
        cmp     al,0
        jne     SAI_TECLA
        mov     ah, 08h
        int     21h
        mov     ah,1

SAI_TECLA:  RET
LE_TECLA    endp

carrega_labirinto Proc

        mov     ah,3dh          ; vamos abrir ficheiro para leitura 
        mov     al,0            ; tipo de ficheiro  
        lea     dx,Fich2            ; nome do ficheiro
        int     21h         ; abre para leitura 
        ;jc      erro_abrir     ; pode aconter erro a abrir o ficheiro 
        mov     HandleFich,ax       ; ax devolve o Handle para o ficheiro 
        ;jmp     ler_ciclo
        ret

carrega_labirinto endp

carrega_top10 Proc

        mov     ah,3dh          ; vamos abrir ficheiro para leitura 
        mov     al,0            ; tipo de ficheiro  
        lea     dx,Fich3            ; nome do ficheiro
        int     21h         ; abre para leitura 
 ;       jc      erro_abrir     ; pode aconter erro a abrir o ficheiro 
 ;;       mov     HandleFich,ax     ; ax devolve o Handle para o ficheiro 
  ;      jmp     ler_ciclo
        ret
carrega_top10 endp

Main    Proc

        mov     ax,dseg
        mov     ds,ax


;abre ficheiro

        mov     ah,3dh          ; vamos abrir ficheiro para leitura 
        mov     al,0            ; tipo de ficheiro  
        lea     dx,Fich1            ; nome do ficheiro
        int     21h         ; abre para leitura 
        jc      erro_abrir      ; pode aconter erro a abrir o ficheiro 
        mov     HandleFich,ax       ; ax devolve o Handle para o ficheiro 
        jmp     ler_ciclo       ; depois de abero vamos ler o ficheiro 

erro_abrir:
        mov     ah,09h
        lea     dx,Erro_Open
        int     21h
        jmp     sair

ler_ciclo:
        mov     ah,3fh           
        mov     bx,HandleFich        
        mov     cx,1            
        lea     dx,car_fich     
        int     21h             
      jc        erro_ler        
      cmp       ax,0            ficheiro 
      je        fecha_ficheiro   
      mov     ah,02h            
      mov       dl,car_fich     
      int       21h             
      jmp       ler_ciclo       

erro_ler:
        mov     ah,09h
        lea     dx,Erro_Ler_Msg
        int     21h

fecha_ficheiro:                 ; vamos fechar o ficheiro 
        mov     ah,3eh
        mov     bx,HandleFich
        int     21h
        jnc     LER_OPCAO

        mov     ah,09h          
        lea     dx,Erro_Close
        Int     21h

LER_OPCAO:
        call LE_TECLA
    ;   cmp     ah, 1
    ;   je      ESTEND

        CMP     AL, '1' 
        JE      jogar
        CMP     AL, '2' 
        JE      TOP10
        CMP     AL, '3' 
        JE      CONFIGURAR
        CMP     AL, '4' 
        JE      SAIR
        jmp     LER_OPCAO

JOGAR:  
    ;   call carrega_labirinto      ;1
        jmp     LER_OPCAO

TOP10:  
;       call carrega_top10      ;2
        jmp     LER_OPCAO

CONFIGURAR: 
;       call carrega_configuracao       ;3
        jmp     LER_OPCAO

SAIR:   
        mov     ah,4CH
        INT     21H

Main    endp
cseg    ends
end     Main           

因为选项1、2和3的代码已经被注释掉了?即使您对选项1调用carrega_Labirito,它所做的只是打开一个文件并存储文件句柄-仅此而已。通过
int 21h
服务,您将无法打开名为
“labirito.txt”
的文件,这样您就需要“short”8.3文件的编码名称(可能类似于
“LABIRI~1.TXT”
。使用
dir/?
查看哪个命令行选项显示短名称(我没有windows…实际上dosbox“dir”应该适合您)。长名称是Windows 95 IIRC的功能。@Ped7g我错过了一个好的陷阱。最简单的解决方法是使用8.3文件名,如
“LABY.TXT”
“MAZE.TXT”
。路易斯,8.3表示文件名最多8个字符+文件扩展名最多3个字符。