【发布时间】:2021-07-19 19:19:04
【问题描述】:
我试图创建一个只有字符串中的字符块的燃油泵,但是当我使用 TASM 编译它时,这是 dosbox 给我的输出。
我存储的数据主要是字符块,其中一些是上下半块,我使用的最多字符是完整块。
.model small
.stack
.data
fuelpump0 db " ▄█████████████████▄$"
fuelpump1 db " █▀ ▀█$"
fuelpump2 db " █ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ █ ▄▄▄$"
fuelpump3 db " █ █ █ █ ██▄$"
fuelpump4 db " █ █ █ █ ▀██$"
fuelpump5 db " █ █ █ ███▄ █$"
fuelpump6 db " █ █ █ █ ▀▀█ █$"
fuelpump7 db " █ █ █ █ █ █$"
fuelpump8 db " █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ █ █$"
fuelpump9 db " █ █ █ █$"
fuelpumpa db " █ █ █ █$"
fuelpumpb db " █ █ █ █$"
fuelpumpc db " █ █ █ █$"
fuelpumpd db " █ █ █ █$"
fuelpumpe db " █ █ █ █$"
fuelpumpf db " █ █ ▀█▀$"
fuelpumpg db " ▄▄█ █▄▄$"
fuelpumph db " █ █$"
fuelpumpi db " █████████████████████████$"
.code
begin:
mov ax, @data
mov ds,ax
mov dx, offset fuelpumpn
mov ah,09h
int 21h
mov dx, offset fuelpump1
mov ah,09h
int 21h
mov dx, offset fuelpump2
mov ah,09h
int 21h
mov dx, offset fuelpump3
mov ah,09h
int 21h
mov dx, offset fuelpump4
mov ah,09h
int 21h
mov dx, offset fuelpump5
mov ah,09h
int 21h
mov dx, offset fuelpump6
mov ah,09h
int 21h
mov dx, offset fuelpump7
mov ah,09h
int 21h
mov dx, offset fuelpump8
mov ah,09h
int 21h
mov dx, offset fuelpump9
mov ah,09h
int 21h
mov dx, offset fuelpumpa
mov ah,09h
int 21h
mov dx, offset fuelpumpb
mov ah,09h
int 21h
mov dx, offset fuelpumpc
mov ah,09h
int 21h
mov dx, offset fuelpumpd
mov ah,09h
int 21h
mov dx, offset fuelpumpe
mov ah,09h
int 21h
mov dx, offset fuelpumpf
mov ah,09h
int 21h
mov dx, offset fuelpumpg
mov ah,09h
int 21h
mov dx, offset fuelpumph
mov ah,09h
int 21h
mov dx, offset fuelpumpi
mov ah,09h
int 21h
mov ah, 4ch
int 21h
end begin
我开始怀疑我的字符是否不是 ASCII 表的一部分,因为它们都是扩展 ASCII 字符的一部分。我希望我能得到一些提示来解决这个问题。
【问题讨论】:
-
看来您使用的是 utf8 编码。切换到纯 8 位。
-
您还需要回车和换行才能从一行前进到下一行。
-
实际字符取决于您的代码页和字体。见wikipedia for codepage 437。确保不要使用 utf8。
-
将每一行设为单独的字符串是对代码的巨大浪费,尤其是因为您甚至没有使用循环。就像 ecm 所说,使用 CR LF,但在除最后一行之外的每一行的末尾使用 而不是
$。然后一个单一的输出字符串 DOS 调用将循环整个事情。 (当然,您仍然可以在源代码中使用多行代码;DOS 调用不知道也不关心字节是如何进入内存的,只知道它们就在那里。) -
类似于Print special character in assembly bootloader。这没有提到 UTF-8,但源代码的复制/粘贴显示它以发布到 SO 的形式使用 UTF-8。如果需要,您可以发布自己对此问题的答案,并附上详细信息以帮助未来的读者解决同样的问题。
标签: assembly dos tasm codepages codepage-437