标题:[求助]请大峡们看看我的程序哪有问题?
只看楼主
ttzz8
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-5-4
 问题点数:0 回复次数:10 
[求助]请大峡们看看我的程序哪有问题?

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!'这个字符串输到屏幕上,我的方法是向显存的缓冲区内写入,然后再输出,但是好象这段程序没用啊,请大峡们帮小弟我检查检查,看看哪有问题?先谢谢了!

搜索更多相关主题的帖子: welcome start 
2006-05-04 15:17
公子吕
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-5-4
得分:0 

你的程序有很多另人费解的地方,如果仅仅要输出字符串可以调用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编辑过]

2006-05-04 19:15
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
得分:0 
回复:(ttzz8)[求助]请大峡们看看我的程序哪有问题?...
现在的显存基地址还是0b800H吗?
应该是0A000H了吧。

落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-05-04 21:18
ttzz8
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-5-4
得分:0 

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


2006-05-04 22:49
ttzz8
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-5-4
得分:0 
2楼,为什么出来以后还有一大串的乱码啊?
是不是 就是你那注释里说的不知道该怎么用什么来结束字符串啊?
还有能不能帮忙解释下你的程序啊?
偶好象看不大懂啊~~~~呵呵!麻烦了!

2006-05-04 22:50
ttzz8
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-5-4
得分:0 
我知道了,只要把'welcome to tasm!'改成'welcome to tasm!$'就可以了,就没有乱码了!

2006-05-04 22:53
ttzz8
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-5-4
得分:0 
我还想问一下,如果要用向显存里写入是怎么实现打印在屏幕上的?

2006-05-04 22:56
公子吕
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-5-4
得分:0 

你说的没错,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做段地址才能显示.

2006-05-05 14:12
ttzz8
Rank: 1
等 级:新手上路
帖 子:25
专家分:0
注 册:2006-5-4
得分:0 

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


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


2006-05-05 17:42
公子吕
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-5-4
得分:0 

你只要把字符放到显存里面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!
我想道理已经很明显了,你自己试一下,不要灰心.

2006-05-05 18:52



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-61842-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.373268 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved