| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2994 人关注过本帖
标题:[求助]为什么用INT 21H 的9号功能却输出了乱码
只看楼主 加入收藏
汪洋
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-5-5
收藏
 问题点数:0 回复次数:13 
[求助]为什么用INT 21H 的9号功能却输出了乱码

在下初学汇编,遇到一问题不明原因,请各位指教:
......
MESSAGE DB 'THIS IS A MESSAGE!$'
......
MOV DX,OFFSET MESSAGE
MOV AH,09H
INT 21H
......
可为什么输出结果却先是:一串乱码+"THIS IS A MESSAGE!"

搜索更多相关主题的帖子: INT 乱码 输出 
2006-05-05 15:25
lj_860603
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:714
专家分:0
注 册:2006-1-25
收藏
得分:0 
DX没有清0吧,你在前面加上一句把DX清0,看看行不行.

我的原则很简单:不做不喜欢的事!
2006-05-05 15:32
汪洋
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-5-5
收藏
得分:0 
谢谢,我这就试试

2006-05-05 15:37
汪洋
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-5-5
收藏
得分:0 

还是有乱码,
下面是我写的程序,可以帮我看看吗?
DATA SEGMENT
message DB 'this is a message!$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
mov dx,0
MOV DX,OFFSET message
mov ah,09h
INT 21H

MOV AH,4CH
INT 21H
CODE ENDS
END START


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

把message下面再定义一个变量,可以没有名字,象这样:
DATA SEGMENT
message DB 'this is a message!$'
db '$'
DATA ENDS

我的程序里也经常有这个问题,无法理解.
还有你最好在退出程序之前(MOV AH,4CH INT 21H)
加上 mov ah,7
int 21h ;等待按键
不然你的字符串显示闪了一下就没了,看得见吗?

2006-05-06 10:51
汪洋
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-5-5
收藏
得分:0 

谢谢公子的解答,我把昨天的程序加了两句就行了,MOV AX,DATA MOV DS,AX.但我不知道为什么应该加上这两句,不是ASSUME已经给DS分配了吗?
程序尾不加 MOV AH,7
INT 21H
在命令提示符下也能看到的,不会一下就没了。

DATA SEGMENT
MESSAGE DB 0ah,0dh,'this is a message!$'
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET MESSAGE
MOV AH,9
INT 21H

MOV AH,4CH
INT 21H
CODE ENDS
END START


2006-05-06 11:00
公子吕
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-5-4
收藏
得分:0 
我晕.你原来的那个程序我还真没仔细看,
MOV AX,DATA ;DATA是数据段起始地址
MOV DS,AX ;数据段地址通过AX送到数据段寄存器DS中.

这两句是必须有的.因为后面的09中断就是在DS:DX处取字符串.
2006-05-06 13:46
汪洋
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-5-5
收藏
得分:0 
ASSUME CS:CODE,DS:DATA的作用不是把DATA的段地址赋给DS吗?
为什么这里还要再赋一次呢?

2006-05-06 16:10
公子吕
Rank: 1
等 级:新手上路
帖 子:79
专家分:0
注 册:2006-5-4
收藏
得分:0 

ASSUME只是告诉汇编程序建立段与段寄存器之间的联系,规定对某个段寻址时用哪个段寄存器提供段地址
但是并不设置段寄存器的初值. 假如你这样:
ASSUME DS:CODE,CS:DATA
那么程序访问DATA里的数据,它就会用CS寻址,而不是DS了.

2006-05-06 17:49
汪洋
Rank: 1
等 级:新手上路
帖 子:26
专家分:0
注 册:2006-5-5
收藏
得分:0 

如果不写把DATA的段地址赋给DS,也就是说如果不写
MOV AX,DATA
MOV DS,AX
的话,编译器会从什么地方找DATA段和CODE段?
我刚开始出现乱码的程序输出中有乱码,但最后还是包含了正确的那个字符串。
这是不是说明如果不这样写,编译器也能“估计”出该在什么地方找相应的段?
问题太多了,哈哈,各位大侠,能继续指教吗?


2006-05-06 20:43
快速回复:[求助]为什么用INT 21H 的9号功能却输出了乱码
数据加载中...
 
   



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

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