字符块未在 Turbo 汇编器中显示正确的输出
Character Block is not showing the right output in Turbo Assembler
我试图创建一个只有字符串中的字符块的燃油泵,但是当我使用 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 table,因为它们都是扩展 ASCII 字符的一部分。我希望我能得到一些解决问题的提示。
我解决了这个问题,它可能不是最好的解决方案,但这是我所做的:
TASM 能够回显扩展 ASCII Table 中的特殊字符,只需简单地键入每个特殊字符的十进制值,如 ▐ (222)、█ (219)、▀ (223) ) 和 ▄ (220)。只要确保他们每个人都有逗号,并且不能在引号内。
您可以在要存储的每个数据字符串中混合使用字符串和整数,只需确保为每个字符串和整数添加逗号,并添加 13,10 作为 return 键和"$"到最后。
失真输出来自
- 没有插入必要的换行符
- 您的编辑器和 DOS 控制台之间的代码页不匹配
因为您对燃油泵的表示包含大量图形字符,将所有这些替换为正确的扩展 ASCII 代码将相当乏味,并且还会破坏自我记录的漂亮布局。
我建议您将不同的 Block 字符替换为 ASCII 字符集下半部分中有些相似的字符。
用'(39)替换▀(223)
将 █ (219) 替换为 | (124)
将 ▄ (220) 替换为 , (44)
这样做会产生下一个数据,它仍然类似于燃料泵:
fuelpump db " ,|||||||||||||||||,", 13, 10
db " |' '|", 13, 10
db " | ,,,,,,,,,,,,,,, | ,,,", 13, 10
db " | | | | ||,", 13, 10
db " | | | | '||", 13, 10
db " | | | |||, |", 13, 10
db " | | | | ''| |", 13, 10
db " | | | | | |", 13, 10
db " | ''''''''''''''' | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | '|'", 13, 10
db " ,,| |,,", 13, 10
db " | |", 13, 10
db " |||||||||||||||||||||||||", 13, 10, 0
当然,现在显示需要一些额外的处理,这并不重要!
...
mov si, offset fuelpump
jmp Fetch
Subst: mov dl, 223 ; TopBlock
cmp al, 39 ; SingleQuote
je Print
mov dl, 219 ; FullBlock
cmp al, 124 ; Pipe
je Print
mov dl, 220 ; BottomBlock
cmp al, 44 ; Comma
je Print
mov dl, al ; Space (32), Carriage Return (13), Linefeed (10)
Print: mov ah, 02h ; DOS.PrintCharacter
int 21h
Fetch: mov al, [si]
inc si
cmp al, 0
jne Subst
...
我试图创建一个只有字符串中的字符块的燃油泵,但是当我使用 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 table,因为它们都是扩展 ASCII 字符的一部分。我希望我能得到一些解决问题的提示。
我解决了这个问题,它可能不是最好的解决方案,但这是我所做的:
TASM 能够回显扩展 ASCII Table 中的特殊字符,只需简单地键入每个特殊字符的十进制值,如 ▐ (222)、█ (219)、▀ (223) ) 和 ▄ (220)。只要确保他们每个人都有逗号,并且不能在引号内。
您可以在要存储的每个数据字符串中混合使用字符串和整数,只需确保为每个字符串和整数添加逗号,并添加 13,10 作为 return 键和"$"到最后。
失真输出来自
- 没有插入必要的换行符
- 您的编辑器和 DOS 控制台之间的代码页不匹配
因为您对燃油泵的表示包含大量图形字符,将所有这些替换为正确的扩展 ASCII 代码将相当乏味,并且还会破坏自我记录的漂亮布局。
我建议您将不同的 Block 字符替换为 ASCII 字符集下半部分中有些相似的字符。
用'(39)替换▀(223)
将 █ (219) 替换为 | (124)
将 ▄ (220) 替换为 , (44)
这样做会产生下一个数据,它仍然类似于燃料泵:
fuelpump db " ,|||||||||||||||||,", 13, 10
db " |' '|", 13, 10
db " | ,,,,,,,,,,,,,,, | ,,,", 13, 10
db " | | | | ||,", 13, 10
db " | | | | '||", 13, 10
db " | | | |||, |", 13, 10
db " | | | | ''| |", 13, 10
db " | | | | | |", 13, 10
db " | ''''''''''''''' | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | | |", 13, 10
db " | | '|'", 13, 10
db " ,,| |,,", 13, 10
db " | |", 13, 10
db " |||||||||||||||||||||||||", 13, 10, 0
当然,现在显示需要一些额外的处理,这并不重要!
...
mov si, offset fuelpump
jmp Fetch
Subst: mov dl, 223 ; TopBlock
cmp al, 39 ; SingleQuote
je Print
mov dl, 219 ; FullBlock
cmp al, 124 ; Pipe
je Print
mov dl, 220 ; BottomBlock
cmp al, 44 ; Comma
je Print
mov dl, al ; Space (32), Carriage Return (13), Linefeed (10)
Print: mov ah, 02h ; DOS.PrintCharacter
int 21h
Fetch: mov al, [si]
inc si
cmp al, 0
jne Subst
...