【问题标题】:Writing text mode screen to a text file. (MASM)将文本模式屏幕写入文本文件。 (MASM)
【发布时间】:2017-05-26 16:13:18
【问题描述】:

基本上我必须创建一个迷宫并将其存储在一个文本文件中,以便稍后打开它,我已经完成了创建迷宫的部分,但我终生无法保存所有内容在屏幕上到文本文件(甚至是空格)我知道我可以使用 int 21h 将内容写入文件我只是不知道如何将所有内容写入所述文本文件(整个 80 行和 25 列)中订单显示在dosbox屏幕上。

mov     ah,3CH ; File creation
mov     cx,0    ; 
mov     dx, OFFSET filename
int     21h
mov     handle, ax

mov ax,0b800h
mov es,ax
ciclo2:
    mov ah, es:[bx]
    mov al, es:[bx+1]
    mov var1, ax
    mov ah,40h
    mov cx,2
    mov dx,var1
    mov bx,handle
    int 21h
    inc bx
    inc bx
    cmp bx, 4000
    jne ciclo2
fim:
    mov     ah,3Eh ; Closing the file
    mov     bx,handle
    int     21h

    mov     ah,4CH ; Closing the program
    INT     21H

我正在使用 MASM 和 dosBOX。

【问题讨论】:

  • 你得到了什么问题或错误的结果是什么?
  • 它应该将屏幕上的内容写入 txt 文件,但最终根本不打印任何内容。
  • 我在您的代码中发现了 4 个错误,请查看下面的答案(如果有用别忘了点击答案的 ✔ 复选标记)。
  • 您的代码正在将字符和属性写入文件。那是你必须做的吗?还是只需要将字符存储在文本文件中?

标签: assembly dos masm x86-16 vga


【解决方案1】:

接下来是代码 sn-p 中的 4 个错误和修复:

mov ax,0b800h
mov es,ax
xor si,si     ;◄■■ INITIALIZE SI = 0.
ciclo2:
    mov aL, es:[si]    ;◄■■ CHARACTER IN AL.
    mov aH, es:[si+1]  ;◄■■ COLOR IN AH.
    mov var1, ax
    mov ah,40h
    mov cx,2
;   mov dx,var1       ;◄■■ WRONG : VARIABLE VALUE.
    lea dx,var1       ;◄■■ RIGHT : VARIABLE ADDRESS.
    mov bx,handle
    int 21h
    inc si
    inc si
    cmp si, 4000
    jne ciclo2
fim:

当你读取文件来显示内容时,记住屏幕先包含字符(mov al, es:[si])然后是颜色(mov ah, es:[si+1]),按顺序显示字节,否则你会看到奇怪的字符和颜色在屏幕上。

【讨论】:

  • 我刚刚意识到这段代码让我陷入了无限循环,因为 bx 不断更改为“句柄”中的值以便使用 int 21h ,是否有任何其他寄存器可以用来代替 bx对于这部分 mov al, es:[bx] mov ah, es:[bx+1]
  • @GabrielSilva,我用SI 替换了BX,这个寄存器就可以了。
  • mov ax, es:[si] 将使用一条指令同时加载 AL 和 AH。但这看起来仍然非常低效,@GabrielSilva:为什么不将 DS 指向视频 RAM 并进行更大的写入调用,而不是一次将 2 个字节复制到一个小缓冲区?出于某种原因,您同时写入了两个字节(字符 + 颜色/属性),因此它不仅仅是一个文本文件,而是一个完整的视频 RAM 转储到文件中,一次 2 个字节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-03
  • 2019-05-13
  • 1970-01-01
相关资源
最近更新 更多