code segment
assume cs:code;ds:data
start:
lea dx,out1
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
mov dl,0dh
mov ah,2
int 21h
lea dx,out2
mov ah,9
int 21h
code ends
end start
再次进行PROCEDURE b进行编译,屏幕显示:
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.
Object filename [error.OBJ]:
Source listing [NUL.LST]:
Cross-reference [NUL.CRF]:
51524 + 406492 Bytes symbol space free
0 Warning Errors
0 Severe Errors
本程序在语句上已无错误。
再执行PROCEDURE d连接为可执行文件(link error回车),屏幕显示:
Microsoft (R) Overlay Linker Version 3.60
Copyright (C) Microsoft Corp 1983-1987. All rights reserved.
Run File [ERROR.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
LINK : warning L4021: no stack segment
这时error.exe可执行文件已存在,可以执行PROCEDURE e来运行看一看是否正确
在dos提示符下键入:error回车(小心!!!)
屏幕显示:乱码,并死机。reset My computer!
说明程序在逻辑上有错误,并且严重。
这是就要用PROCEDURE f,用调试工具调试,查找错误。
在DOS提示符下键入:debug error.exe回车
屏幕出现 - 提示符,这时就可以用DEBUG的命令来找错误了,
我首先用d命令来查看数据区和内容,发展所定义的两个字符串并不在数据段的段首,而在数据段内的100h位置上,这时才想起masm有一个不成文的规定,那就是在定义完数据段后,所定义的变量均向后100h个单元,需要我们将ds段寄存器置位,在程序的start:后面加上如下指令:(执行PROCEDURE a)
mov ax,data
mov ds,ax
再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,
屏幕显示:
换行
My name is DJX及乱码,并死机。(又要重新启动!)
再次执行PROCEDURE a检查程序,发现:
1.汇编语言有规定每个字符串应由$结尾
2.在输出第一个串的语句中的AH子功能号应为09H
将以上两点改正。
再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,
屏幕显示:
Hello world
My name is DJX并死机,不能返回DOS
原因分析,在程序中没有返回DOS的指令,更正:
用PROCEDURE a来进行编辑:
用DOS 21H中断的4cH子功能便可返回DOS,在code ends前加:
mov ah,4ch
int 21h
再执行PROCEDURE b,PROCEDURE d,PROCEDURE e来运行程序,
屏幕显示:
Hello word
My name is DJX
并返回DOS
成功!
这样一个程序就调试完成,并正确。
下面是正确的源程序:
data segment
out1 db ''Hello world