注册 登录
编程论坛 汇编论坛

[求助]请大峡们看看我的程序哪有问题?

ttzz8 发布于 2006-05-04 15:17, 1034 次点击

assume cs:code
data segment
db'welcome to tasm!',0
data ends

code segment
start: mov dh,8
mov dl,3
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str

mov ax,4c00h
int 21h
show_str:mov ax,0b800h
mov es,ax
mov cx,16
s:mov al,ds:[si]
mov es:[si],al
mov ah,02h
mov es:[si+1],ah
inc si
loop s
ret
code ends
end start
我想把'welcome to tasm!'这个字符串输到屏幕上,我的方法是向显存的缓冲区内写入,然后再输出,但是好象这段程序没用啊,请大峡们帮小弟我检查检查,看看哪有问题?先谢谢了!

10 回复
#2
公子吕2006-05-04 19:15

你的程序有很多另人费解的地方,如果仅仅要输出字符串可以调用09号中断.如下:
data segment
str db 'welcome to tasm!' ,0dh,0ah,0
data ends

code segment
assume cs:code,ds:data

start:
mov ax,data
mov ds,ax
mov dx,offset str
mov ah,9 ;09中断输出ds:dx处的字符串,不过我也不知道用什么结束字符串.
int 21h
mov ah,7 ; 等待输入一个字符,方便看到前面输出的串.
int 21h
mov ah,4ch
int 21h

code ends
end start

如果实在要用02号中断,可以用下面这段代码:
data segment
str db 'welcome to tasm!' ,0
data ends

code segment
assume cs:code,ds:data

start:
mov ax,data
mov ds,ax
mov si,offset str
mov cx,16
showstr:
mov dl,[si]
mov ah,2
int 21h
inc si
loop showstr

mov ah,7
int 21h
mov ah,4ch
int 21h

code ends
end start

[此贴子已经被作者于2006-5-4 19:19:28编辑过]

#3
–★–2006-05-04 21:18
回复:(ttzz8)[求助]请大峡们看看我的程序哪有问题?...
现在的显存基地址还是0b800H吗?
应该是0A000H了吧。
#4
ttzz82006-05-04 22:49

教材上的显存基地址还是0B800H的啊!好象我们同学做的时候就是用这个的,具体我也不清楚啊!

#5
ttzz82006-05-04 22:50
2楼,为什么出来以后还有一大串的乱码啊?
是不是 就是你那注释里说的不知道该怎么用什么来结束字符串啊?
还有能不能帮忙解释下你的程序啊?
偶好象看不大懂啊~~~~呵呵!麻烦了!
#6
ttzz82006-05-04 22:53
我知道了,只要把'welcome to tasm!'改成'welcome to tasm!$'就可以了,就没有乱码了!
#7
ttzz82006-05-04 22:56
我还想问一下,如果要用向显存里写入是怎么实现打印在屏幕上的?
#8
公子吕2006-05-05 14:12

你说的没错,09号中断的字符串就是用'$'字符结尾的.
你的程序是要通过写入显存来显示,对于上面的答非所问我很抱歉,
我本来也不知道怎样通过显存显示,于是到csdn上问了一下,发现字符串只要写入
显存,系统会自动显示的,不过它用彩色显示在dos窗口的左上角 程序如下:
.model small
.stack
.data
str db 'welcome to tasm!' ,0
.code
start:

mov ax,@data ;data的段地址送ax
mov ds,ax
mov si,offset str ;str的偏移地址送到si
mov cx,16 ;拷贝字符的个数.
mov ax,0b800h ;显存段地址
mov es,ax
mov di,0
rep movsb ;ds:si的16个字符送到es:di

mov ah,7
int 21h ;等待按键,方便看到显示的字符
mov ah,4ch
int 21h
end start

另外:我的书上也说0A0000H是RAM映射的显存地址,不过还是要用0B800做段地址才能显示.

#9
ttzz82006-05-05 17:42

显存里是用一个字来作为一个基本的存储单元的,例如一个'w'是用一字来存储的,其中低字节用来存储这个字母的ASCII的,高字节是用来存储这个字母的属性的,像颜色啊,前景色,背景色之类的.


PS:偏移地址决定了字符串显示的位置的,例如000-09F对应于显示器的第一行0A0-13F对应于第二行.....
这些我们的书上都有的,但是我就是不知道怎样把字符输出到屏幕上啊!哎~~~~~~~好笨啊我!!!

#10
公子吕2006-05-05 18:52

你只要把字符放到显存里面0b800:0000, 程序运行的时候它会自动显示在屏幕上的,
正如你所说的,它用一个两个字节存放一个字符,所以我上面的那个程序只能显示奇数位置的字符.
.model small
.stack
.data
str db 'weeeleceoemeee eteoe eteaeseme!e' ,0 ;将e的ascii码作显示字符的属性.
.code
start:

mov ax,@data
mov ds,ax
mov si,offset str
mov cx,16
mov ax,0b800h
mov es,ax
mov di,0
rep movsw

mov ah,7
int 21h
mov ah,4ch
int 21h
end start

这个程序在dos窗口的左上角以绿底红字(属性e)显示welcome to tasm!
我想道理已经很明显了,你自己试一下,不要灰心.

#11
ttzz82006-05-05 19:12

恩真的很谢谢你了!

1