汇编语言实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇编语言程序设计
实验一DEBUG 程序使用技巧
学号:姓名:
1.寄存器和内存
开始Debug 程序。输入“Q ” 退出程序。再次启动Debug。
输入“r ”来显示CPU的当前状态和寄存器中的当前内容。
输入“r AX ”和“1234”,_______寄存器中的内容变为1234。
输入“r DS ”和“2000”,_______寄存器中的内容变为2000。
输入“d DS:1000 ”来显示数据段中80H 字节数据,把数据抄在这里:
输入“f DS:1000 1100 77 ”再显示一次这80H 字节。判断这条指令的作用是什么?
再输入“d 2000:1000 ”来显示数据段中80H 字节数据。观察与前面的数据有无不同。
输入“d 1900:0100 ”和“d 1ff0:0100 ”来显示两个存储段中的内容。比较其中2000:0000 段中的数据。相同段落中的数据相同么?根据你的观察,得出结论,是否程序员可以用不同的段起始地址和偏移量组合,把不容内容存入相同的内存段中。
2.输入机器码,使用单步和断点
退出Debug,再重新启动Debug。
输入“r ”观察CPU 的状态,下一条指令是什么?
使用两种方式输入一段程序,第一种方式:直接输入机器码。
输入“u ”来显示程序段中的指令序列。然后输入“d CS:100 ” 来显示代码段中的数据。观察显示内容。
“u CS:100 106 ”做反汇编,就是显示出汇编语句。将这几句汇编语句记录下来:
使用输入“r ”观察CPU 的状态,使用“t ”来跟踪程序,直至最后一条指令执行完毕。注意,跟踪程序前,要让IP 寄存器中的值是100H。一直监视AX 和IP 寄存器的内容变化,尤其是标志位的变化。
第二种方式,是输入汇编语句。重启Debug 程序。
先输入“a CS:100 ”,然后输入:
MOV AX, FF00
ADD AX,01F0
MOV BX,AX
NEG BX
ADD AX,BX
输入“u CS:100 10A ”就可以得到这几条语句的机器码。把机器码记录下来:
使用命令“r ip ”再输入“100 ”,可以将寄存器IP 中的内容置为“100H”。再输入“r ”观察CPU 的状态,然后反复输入“t ” 跟踪程序,直到程序结束。解释为什么标志位内容会有改变?另外,说明这段程序完成什么任务?
重新把寄存器IP 的内容变为100H,不使用跟踪命令“t”,改用“g 10c”来完成程序。
程序中还可以加断点,做法是在程序中加入“int 3” 这条指令。如果这条指令在程序的末尾,我们可以通过输入“g ” 来完成运行程序。这样就不需像上面需要告诉Debug 程序最后机器码字节的地址偏移量了。“int 3”是Debug 中很有效的返回控制指令。把这条指令放在程序中必要的位置上,在这条指令后面的代码在不允许时就不会运行。
3.ASCII 字符码,从键盘输入,从显示器输出
(i) 标准ASCII ( American Standard Code for Information Interchange ) 码使用7- bit 二进制数来代表字符。一般文本信息经常用ASCII 编码。
使用命令“a CS:100 ”, 输入下面的代码:
MOV BX,0
MOV [BX],BL
INC BX
CMP BH,1
JNE 103
INT 3
使用“d DS:0 100 ”命令,显示程序运行前相应内存段中的数据。运行上面的程序来填充DS:0000-00FF 这段内存中的内容。再次输入“d DS:0 100 ”命令来显示填充的内容。在窗口的右边,可以看到相应的ASCII码字符。
如果填充的内容不是字符,显示就用点表示。用类似方法,如何将字符串“How are you?”写入计算机内存呢?
(ii) 计算机的BIOS ( Basic Input / Output System ) 程序有很多子程序,用来通过标准外设处理输入和输出,比如,键盘和显示器。
BIOS 的程序都可以通过称为系统中断的特殊指令被调用。例如:
INT 16H 返回值是把下一个键盘输入值送入寄存器AL
INT 10H 当BH = 0 时,将光标移到由寄存器DH 和DL 内容所指定的行和列的位置上INT 21H 当AH = 2 时,将DL 中的内容作为ASCII 码的字符显示出来
INT 21H 当AH = 9 时,将位于DS:DX 的内容显示为字符串( 一个ASCII 码序列由$ 符作结束符)。
(ii)(a) 将下列代码输入程序段CS:0100 中:
MOV AH,0
INT 16H
INT 3
JMP 100
使用“u CS:100 110 ” 命令,将程序转换为机器码。其中“JMP 100”的机器码是“EBF9”。如果使用的是相对寻址方式,我们可以猜测出机器码中“F9”的含义么?相对寻址方式比绝对地址方便的地方是什么?
重置IP 的内容为100H,再输入“g ”来执行程序。程序中断时,输入字母“B”,检查寄存器AL 中的内容为:_________
重复上面的动作,但输入不同字母,记录下每次AL 中的内容,能不能判断出来,这段程序的功能是什么?
(ii)(b) 将下面的代码输入CS:200 中:
MOV BH,0
MOV DL,0
MOV DH,0
MOV AH,2
INT 10
MOV DX,0
MOV AH,9
INT 21
INT 3
通过命令“e DS:0 68 65 6C 6C 21 24 .”在内存数据段中输入了一个字符串,将IP 设为200,输入“g .” 来运行程序,在屏幕左上角能找到输入的字符串是什么:_____________ 这个程序是用来做什么的?_____________________________________________________ _____________________________________________________