Arrays 使用字符GUI TASM程序集打印到屏幕阵列中

Arrays 使用字符GUI TASM程序集打印到屏幕阵列中,arrays,string,assembly,tasm,Arrays,String,Assembly,Tasm,下午好,我正试图用GUI Turbo Asembler TASM在屏幕上显示字符串数组,问题是我不能只显示第一个字符串。如果有人能帮我在屏幕上正确显示字符串并在数组中移动,非常感谢- 这是Borland C中的一个例子++ 这实际上在TASM中: 代码如下 .MODEL small .STACK 100h ; reserves 256 bytes of uninitialized storage .DATA startX equ 35 startY equ 8 y db ? x db

下午好,我正试图用GUI Turbo Asembler TASM在屏幕上显示字符串数组,问题是我不能只显示第一个字符串。如果有人能帮我在屏幕上正确显示字符串并在数组中移动,非常感谢-

这是Borland C中的一个例子++

这实际上在TASM中:

代码如下

.MODEL small

.STACK  100h ; reserves 256 bytes of uninitialized storage

.DATA
startX equ 35
startY equ 8
y db ?
x db ?
t1 db ?
t2 db ?
t3 db ?

zSprite db'M','M','L','E','E','N','A','E','V','E',
    db'E','R','H','O','N','G','O','S','T','R',
    db'X','X','O','T','I','R','R','A','C','A',
    db'I','S','A','P','P','O','T','A','P','S',
    db'C','C','M','L','A','A','I','Z','O','T',
    db'O','A','A','U','A','N','U','L','P','U',
    db'S','O','M','B','R','E','R','O','M','P',
    db'C','N','E','A','R','R','I','I','O','O',
    db'W','O','J','E','N','O','C','P','Z','E',
    db'A','A','Z','A','A','L','N','Y','T','D'


.386 ;enabled assembly of non privileged 80386 instructions
.CODE
start:
;set DS to point to the data segment
mov ax,@data
mov ds,ax

mov di,offset zSprite

mov y,0

l5:
cmp y,10
jl  l0
jmp l1

l0:
mov x,0

l4:
cmp x,10
jl  l2
jmp l3

l2:
mov al,startX
add al,x
mov t1,al

mov al,startY
add al,y
mov t2,al

; set cursor position at (x,y)
mov ah,02h ;set cursor position service
mov bh,00h ;page number
mov dh,t2 ;row
mov dl,t1 ;column
int 10h ;bios interrupt

mov ax,0 ;reset ax
mov al,y ;ax = y
mov bx,10
mul bx   ;ax = ax * 10
mov bx,0 ;reset bx
mov bl,x ;bx = x
add ax,bx ;ax = ax + x
mov bx,ax

; set color
mov ah,09h ;service
mov al, zSprite;character
mov bh,00h ;page number
mov bl,[bx+di] ;color
mov cx,01h ;number of times to print character
int 10h

;print symbol
mov ah, 02h  
mov dl,  zSprite
int 21h 

inc x
jmp l4

l3:
inc y
jmp l5

l1:
nop

exit:
;DOS: terminate the program
mov ah,4ch ; mov ax, 4c00h
mov al,0h
int 21h

delay PROC
pop bx

mov ax,1000d
mov dx,ax

delay1:
mov cx,ax

delay2:
dec cx
jnz delay2
dec dx
jnz delay1

push bx

ret
delay ENDP

END start

嗯。。我决定写一些显示板的高级版本。。。我知道纯代码答案不是很好的答案,但我在代码中添加了许多注释,以使其更清楚,它是如何工作的

关于使用的概念的一些提示:

我直接写入,避免使用BIOS/DOS服务(它们在绘制游戏板等情况下使用起来既慢又麻烦)

电路板
数据不仅包含字母,而且每个“字母”的顶部位(
80h
值)用作已使用/未使用的标记。绘图例程将根据该位的值更改字母的颜色

也就是说,电路板中的值
41h
将作为“未使用的A”使用,而值
41h+80h=0C1h
将作为“已使用的A”使用

未使用/使用的字母为浅品红色/白色,根据使用的位计算,并利用字母ASCII值的40h位。 (数字会有明亮的红色/黄色,因为
'0'=30h
,所以数字的ASCII码不包含40h位集=不同的颜色计算结果)

通过向原始字母颜色添加/减去颜色,“绘制”+“隐藏”光标


以及代码墙(在
dosbox
下使用TASM 4.1进行测试):

。型号小
.堆叠100小时;保留256字节的未初始化存储
.数据
电路板尺寸等于10
电路板尺寸等于10
启动设备(EQU 35)
启动Y EQU 8
光标颜色等于0B0h;添加“闪烁”+青色背景
板标签字节
DB“MMLEENAEVE”
DB“二红斯特”
DB“XXOTIRRACA”
DB“ISAPPOTAPS”
DB“CCMLAAIZOT”
DB“OAAUANULPU”
DB“阴沉的罗姆普”
DB“CNARRIOO”
DB“WOJENOCPZE”
DB“AAZAALNYTD”
光标x db 5
光标_y db 7
.386
.代码
开始:
;将DS设置为指向数据段
mov-ax,@data
mov-ds,ax;ds=数据段
mov ax,0B800h
mov-es,ax;es=用于直接VRAM写入的文本VRAM段
; 伪造一些“用于”测试图形代码的字符
或字节PTR[board+34],80h;标记“锅”字
或字节PTR[board+35],80h;在中间的第四行
或字节PTR[board+36],80h
呼叫清除屏幕
调用绘图板
mov dl,光标颜色
调用绘图游标
; 等待击键
xor啊,啊
int 16h
; 假“移动光标”
mov dl,-光标颜色;将光标隐藏在旧位置
调用绘图游标
inc字节PTR[cursor_x];向上+向右移动
dec字节PTR[光标y]
mov dl,光标颜色;在新位置显示光标
调用绘图游标
; (另一种选择是重新绘制整个董事会)
; 等待击键后退出
xor啊,啊
int 16h
; 退出待办事项
mov-ax,4C00h
int 21h
; 将全文视频RAM设置为红色背景的白色“空白”
; 修改ax、cx、di,假设es=B800
清除屏幕程序
xor-di,di;B800:0000目标地址
移动轴,+4Fh*256;红色背景上的空白
mov-cx,80*25
代表stosw;用这个填充视频RAM
ret
ENDP
; 将整个电路板重新绘制到视频RAM中,并标记“已使用”字符
; 修改ax、cx、dx、si、di,假设ds=@DATA,es=B800
绘图板程序
mov-si,胶印板;si=董事会第一个字母的地址
; di=视频RAM中起始位置的偏移量
; 每字符2字节(字符+颜色),每行80字符(160B)
mov di,(启动Y*80+启动X)*2
; 输出板尺寸线
mov dx,电路板尺寸
线路板回路:
; 输出板\u尺寸\u X彩色字符
mov cx,电路板尺寸
线路板字符循环:
lodsb;al=下一个字符+使用的位,前进si+1
莫夫·阿勒;未使用/使用的颜色为:12+1 | | 3=13 | | 15
al,7Fh;清除顶部位(已使用/未使用):al=ASCII字母
shr-ah,6;ah=1 | | 3(字母代码中的80h“已用”位+40h位)
加上啊,十二,;ah=13 | | 15,由“已用”位(黑底黑底白)
stosw;向VRAM es写字母+颜色:di,预付di+2
十二月十二日
jnz板字符环路;循环直到显示整行
; 将视频ram指针移动到下一行的开头
增加di,(80板尺寸)*2;前进到下一行的起点
dec dx
jnz线路板回路;循环直到显示每一行
ret
ENDP
; 通过添加DL修改当前光标位置的字母颜色
; 修改ax,di,假设ds=@DATA,es=B800
绘制光标程序
mov al,[光标_y]
莫夫啊,160
穆勒啊,;ax=光标_y*160
movzx di,字节PTR[cursor_x];di=零扩展游标
增加di,di;di*=2(光标x*2)
加上di,ax;di+=光标_y*160
; 仅将初始线路板偏移量和+1添加到地址属性
添加di,(起始Y*80+起始X)*2+1
添加es:[di],dl;通过添加DL修改字母颜色
ret
ENDP
结束-开始
用于生成exe的命令:

REM source file has name: wordgame.asm
tasm /m5 /w2 /t /l wordgame
tlink wordgame.obj


使用Turbo debugger单步跳过指令,观察它们如何影响CPU状态以及如何修改内存(在选项屏幕中设置为“始终交换”,以使直接视频RAM写入在用户屏幕上可见(Alt+F5))。试着去理解所有的东西,还有你的旧代码,它是如何工作的,在哪里有问题。

Erm,你自己的评论是“mov al,0feh;character”。。。那是你的“照片”。我很抱歉我的英语不好。我不知道如何显示字母而不是错误的字符。谢谢你的帮助,不是“呃”