在下初学汇编,遇到一问题不明原因,请各位指教:
......
MESSAGE DB 'THIS IS A MESSAGE!$'
......
MOV DX,OFFSET MESSAGE
MOV AH,09H
INT 21H
......
可为什么输出结果却先是:一串乱码+"THIS IS A MESSAGE!"
在下初学汇编,遇到一问题不明原因,请各位指教:
......
MESSAGE DB 'THIS IS A MESSAGE!$'
......
MOV DX,OFFSET MESSAGE
MOV AH,09H
INT 21H
......
可为什么输出结果却先是:一串乱码+"THIS IS A MESSAGE!"
还是有乱码,
下面是我写的程序,可以帮我看看吗?
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
把message下面再定义一个变量,可以没有名字,象这样:
DATA SEGMENT
message DB 'this is a message!$'
db '$'
DATA ENDS
我的程序里也经常有这个问题,无法理解.
还有你最好在退出程序之前(MOV AH,4CH INT 21H)
加上 mov ah,7
int 21h ;等待按键
不然你的字符串显示闪了一下就没了,看得见吗?
谢谢公子的解答,我把昨天的程序加了两句就行了,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
ASSUME只是告诉汇编程序建立段与段寄存器之间的联系,规定对某个段寻址时用哪个段寄存器提供段地址
但是并不设置段寄存器的初值. 假如你这样:
ASSUME DS:CODE,CS:DATA
那么程序访问DATA里的数据,它就会用CS寻址,而不是DS了.
如果不写把DATA的段地址赋给DS,也就是说如果不写
MOV AX,DATA
MOV DS,AX
的话,编译器会从什么地方找DATA段和CODE段?
我刚开始出现乱码的程序输出中有乱码,但最后还是包含了正确的那个字符串。
这是不是说明如果不这样写,编译器也能“估计”出该在什么地方找相应的段?
问题太多了,哈哈,各位大侠,能继续指教吗?