当前位置:文档之家› 汇编语言实验

汇编语言实验

汇编语言程序设计实验一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, FF00ADD AX,01F0MOV BX,AXNEG BXADD 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,0MOV [BX],BLINC BXCMP BH,1JNE 103INT 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 返回值是把下一个键盘输入值送入寄存器ALINT 10H 当BH = 0 时,将光标移到由寄存器DH 和DL 内容所指定的行和列的位置上INT 21H 当AH = 2 时,将DL 中的内容作为ASCII 码的字符显示出来INT 21H 当AH = 9 时,将位于DS:DX 的内容显示为字符串( 一个ASCII 码序列由$ 符作结束符)。

(ii)(a) 将下列代码输入程序段CS:0100 中:MOV AH,0INT 16HINT 3JMP 100使用“u CS:100 110 ” 命令,将程序转换为机器码。

其中“JMP 100”的机器码是“EBF9”。

如果使用的是相对寻址方式,我们可以猜测出机器码中“F9”的含义么?相对寻址方式比绝对地址方便的地方是什么?重置IP 的内容为100H,再输入“g ”来执行程序。

程序中断时,输入字母“B”,检查寄存器AL 中的内容为:_________重复上面的动作,但输入不同字母,记录下每次AL 中的内容,能不能判断出来,这段程序的功能是什么?(ii)(b) 将下面的代码输入CS:200 中:MOV BH,0MOV DL,0MOV DH,0MOV AH,2INT 10MOV DX,0MOV AH,9INT 21INT 3通过命令“e DS:0 68 65 6C 6C 21 24 .”在内存数据段中输入了一个字符串,将IP 设为200,输入“g .” 来运行程序,在屏幕左上角能找到输入的字符串是什么:_____________ 这个程序是用来做什么的?_____________________________________________________ _____________________________________________________4. 内存寻址把下面程序输入到内存中以地址CS:0000 为起始的代码段中。

MOV AX,33MOV AX,[SI]MOV AX,[SI+2]MOV AX,[SI]2MOV AX,[25]MOV AX,[BX+SI]MOV AX,[BX+SI-3]MOV AX,20[BX+SI-10]INT 3这些指令分别使用了哪些寻址方式?将上面的程序翻译为机器码时,可以发现有些指令的机器码是相同的。

哪些代码的机器码相同?根据发现,得出的结论是什么?将数据段与代码段对齐,将数据段中前40H 字节的数据显示出来,使用命令“d DS:0 40 .”,把这些数据记录下来。

假设BX 和SI 中的内容分别是12 和17,判断一下程序运行后的结果是什么?跟踪程序,记录AX 寄存器中的内容,与你预计的结果相符么?5. 堆栈.(i) 将程序输入内存中以地址CS:0000 为起始的代码段中:MOV BX,22MOV AX,33PUSH AXPUSH BXMOV AX,0MOV BX,0POP AXPOP BXINT 3跟踪程序,记录发现的变化。

不要忘记运行前要把IP 的内容变为0。

步骤AX BX SP 堆栈内容1 ________ ________ ________ _________________2 ________ ________ ________ _________________3 ________ ________ ________ _________________4 ________ ________ ________ _________________5 ________ ________ ________ _________________6 ________ ________ ________ _________________7 ________ ________ ________ _________________8 ________ ________ ________ _________________增加什么语句,能够使AX 和BX 的内容在程序运行后被恢复。

(ii) 重启Debug将指令"INT 3" 在代码段地址CS:100 中输入。

输入“r .” 记录堆栈段和代码段的参数:SS:____________ SP:____________ CS:____________ IP:______________将堆栈段中SS:FFE0 FFFF 的内容显示出来,记录堆栈段中的有效数据。

地址: ______________________________________________________________________内容: ______________________________________________________________________执行"INT 3" 指令,引起CPU 的软件中断。

相应的中断程序被调用。

中断服务程序的最后一条指令是"IRET",它告诉CPU 中断服务结束。

一步步跟踪"INT 3" 直到"IRET" 指令被执行。

注意寄存器SP 中内容的变化,记录被推入堆栈的内容,以及中断程序终止时,弹出命令将什么内容送到什么地方?根据观察,能找到INT 3 中断向量的内容么?中断服务程序的起始地址是什么?。

相关主题