实 验 汇编语言程序结构
一、实验目的
1.掌握汇编语言程序上机过程。
2.掌握汇编语言结构。
3.学习汇编语言的伪操作。
4.了解汇编程序、连接程序、DOS系统装入和返回功能。
5.掌握用DEBUG调试汇编语言程序的方法
二、实验任务
1. 编写完整的汇编语言程序
(1) 从键盘输入一个字符,将该字符对应的ASCII码以二进制形式显示出来。
(2) 将1CH类型中断子程入口地址的段址和偏移地址以十六进制形式显示出来。
(3) 密码检测:从键盘输入的字符串,如果与所设密码相符,显示‘Welcome’;不符,显示‘Invalid Password!’。要求输入密码前,给出‘Enter Password:’的提示,输入的密码不反显,而以‘*’显示。
(4) 将数据段1定义的字符串‘How are you doing?’ 传送到数据段2定义的缓冲区中。
2. 伪操作学习
编辑下列源文件:
data SEGMENT
var0 DB 10101010B,‘TsingHua’
var1 DW ‘efgh’
var2 DB -374,-1
var3 DW -1,9080H
var4 DD ffeeddccH
data ENDS
code SEGMENT
ASSUME CS:code,DS:data
start: MOV DS,data
MOV CX,var0
LEA AL,var1
code ENDS
END start
汇编该文件,据提示说明出错语句的错误原因。
修改程序中的错误,在DEBUG下查看变量var0~var4在内存中的存放情况。
三、实验说明
1. 参看附录2,了解汇编程序、连接程序、DOS的装入和返回功能。
2. 汇编语言程序的上机过程
(1)建立汇编语言程序源文件。可使用任何一个文本编辑器(如EDIT.com)编辑源文件,源文件,源文件的扩展名通常取为.asm。
(2)汇编文件,形成目标模块。汇编程序的使用参看附录2。
若文件有语法错误,据错误提示,返回(1),修改源文件。
若无错,则形成.OBJ目标文件和.LST列表文件。
(3)连接目标模块,形成可执行文件。连接程序的使用参看附录2。
若有错,据错误提示,返回(1),修改错误。
若无错,则形成.EXE可执行文件和.MAP映像文件。
(4) DOS下直接键入可执行文件名,即可执行该程序。
(5) 运行结果不对,需调试程序,查找原因。
返回步骤(1)查看源文件,查找错误,修改文件。
若无法通过查看源文件找出错误,可在DEBUG下调试.EXE文件,找出错误之处,再返回步骤(1)。参看附录2,了解在DEBUG下装入.exe文件的方法,利用在实验一中掌握的调试方法对程序进行调试。
3. 对于编程任务(1),利用DOS的单字符输入功能,即可获得输入字符的ASCII码。字符的ASCII码为一个8位二进制数,显示时需将这8位二进制数值(0或1)分别转换为其对应的ASCII码(30H或31H),从高位至低位顺序显示出来。
4. 对于编程任务(2),中断子程的入口地址可从中断向量表中获得,段地址和偏移地址均为16位二进制数,用十六进制表示为4位数,显示时需将这4位十六进制数值转换为其对应的ASCII码,从高位至低位顺序显示出来。
5. 对于编程任务(3),实质是一个字符串的比较程序,其中不回显的输入可调用DOS的07H或08H功能完成。
6. 编程任务(4),程序本身较简单,请按下列要求完成任务:
(1)在汇编过程中,除形成.obj目标文件外,还要形成源文件的 .lst列表文件,通过查看列表文件,掌握汇编程序的基本功能。
(2)在连接过程中,除形成 .exe执行文件外,还要形成其 .map 映像文件,通过查看映像文件,掌握连接程序的功能.
(3) 由于程序中无结果的显示,故需在DEBUG下运行并查看结果。
(4)分别用附录2 中介绍的两种方法,完成程序返回DOS的功能。
(5)在DEBUG下查看程序,对照源程序文件 .asm,掌握汇编程序伪操作的功能。
7.利用DEBUG,学习伪操作的方法。
在DEBUG下查看源程序时,发现.asm源文件指令中用符号表示的变量、标号、过程名等符号地址以及一些由汇编提供的操作符(如SEG,OFFSET等)均被一些确定的数值代替,从而说明,这些用符号表示的地址,经过汇编、连接及装入内存后,都有了具体的选择理地址与之对应,其它的一些伪操作也都在程序执行前已经完成,通过对在DEBUG下查看源程序,对比.asm源文件,可以掌握伪操作的功能。
例:有如下程序段,程序源文件名设为Study.asm:
data SEGMENT
string DB‘how are you doing?’,‘$’
D_word DW 1234h,5678h
Data ENDS
Code SEGMENT
ASSUME CS:code,DS:data
main PROC FAR
Begin: PUSH DS
MOV AX,0
PUSH AX
MOV AX,data
MOV DS,AX
MOV SI,OFFSET string
MOV BL,string
RET
main ENDP
code ENDS
END begin
经汇编、连接后,形成Study.exe,在DEBUG下装入此文件,用U查看程序。
D:\>DEBUG study.exe ↙
-U ↙
12A7:0000 1E PUSH DS
12A7:0001 B80000 MOV AX,0000
12A7:0004 50 PUSH AX
12A7:0005 B8A512 MOV AX,12A5 ;原为MOV AX,data
12a7:0008 8ED8 MOV DS,AX
12A7:000A BE0000 MOV SI,0000 ;原为MOV SI,OFFSET string
12A7:000D 8A1E0000 MOV BL,[0000] ;原为MOV BL,string
12A7:0011 CB RETF
┇ ;省略与程序部分无关的显示
—
对照源程序Study.asm,可知:
(1) 定义的data段,在内存的段值为12A5H;
(2) 伪操作OFFSET的作用是取变量string的偏移地址:
从汇编后操作数OFFSET string由string的偏移值0000代替可知;
(3) 变量string是一个直接寻址的操作数:
从程序中操作数string被操作数[0000]代替可知。
(4) 用命令D查看12A5H段的内容
—D 12 5:0 L 30 ↙
12A5:0000 48 6F 77 20 61 72 65 20—79 6F 75 20 64 6F 69 6E How are you doing
12A5:0010 67 20 3F 24 34 12 78 56—00 00 00 00 00 00 00 00 g?$4Xv … … …
12A5:0020 1E B8 00 00 50 B8 A5 12—8E D8 BE 00 00 8A 1E 00 P … … … …
—
看到存放在内存的字符串‘How are you doing?’,其后存放数值1234H,5678H,存放规则为低地址的内存单元放低字节数据,高地址的内存单元放高字节数据。
(5) 用命令R查看当前各寄存器值
—R ↙
AX=0000 BX=0000 CX=0032 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1295 ES=1295 SS=12A5 CS=12A7 EP=0000 NV UP EI PL NZ NA PO NC
12A7:0000 1E PUSH DS
—
当前DS的值为1295H,并不等于data对应的值12A5H,此时DS的值为程序段前缀所在段值,故程序中若不给DS赋值,使 DS的值等于12A5H,则指令MOV BL,[0000]中的操作数[0000]将不为12A5:0000H指向的值‘H’,而是1295:0H指向的值CDH。
(6)对伪操作功能不清楚的地方,均可通过编写汇编语言程序,经汇编、连接后在DEBUG下对照查看来掌握。
8.结束实验前,演示编程任务(1),(2),(3),(4)的运行结果,请指导教师检查。
四、问题思考
1. 汇编语言程序中语句END后的标号作用是什么?
2. 采用附录2介绍返回DOS的方法二中,可否将语句main proc far中的far属性去掉,为什么?
3. 一个段的大小为多少?一定是64KB吗?如何在DEBUG下查看程序在内存的存放情况?画出编程任务4各段在内存的存放情况。
六、 实验报告
1. 画出各程序流程图,列出程序清单,加上适量注释。
2. 记录实验任务“2.伪操作学习”的结果。
3. 回答问题思考。
4. 针对实验目的做小结。
评论
查看更多