当前位置:文档之家› 汇编实验一实验报告

汇编实验一实验报告

汇编语言程序设计实验报告课程名称汇编语言程序设计班级姓名学号指导教师汇编语言程序设计实验一DEBUG 程序使用技巧1.寄存器和内存开始Debug 程序。

输入“Q ” 退出程序。

再次启动Debug。

输入“r ”来显示CPU的当前状态和寄存器中的当前内容。

输入“r AX ”和“1234”,AX 寄存器中的内容变为1234。

输入“r DS ”和“2000”,DS 寄存器中的内容变为2000。

输入“d DS:1000 ”来显示数据段中80H 字节数据,把数据抄在这里:输入“f DS:1000 1100 77 ”再显示一次这80H 字节。

判断这条指令的作用是什么?答:从DS:1000地址七,将1100H字节的内容赋值为77H再输入“d 2000:1000 ”来显示数据段中80H 字节数据。

观察与前面的数据有无不同。

输入“d 1900:0100 ”和“d 1ff0:0100 ”来显示两个存储段中的内容。

比较其中2000:0000 段中的数据。

相同段落中的数据相同么?根据你的观察,得出结论,是否程序员可以用不同的段起始地址和偏移量组合,把不容内容存入相同的内存段中。

答:相同段落中的数据相同, 程序员可以用不同的段起始地址和偏移量组合,把不容内容存入相同的内存段中。

2.输入机器码,使用单步和断点退出Debug,再重新启动Debug。

输入“r ”观察CPU 的状态,下一条指令是什么?答:下一条指令是ADD [BX+SI],AL使用两种方式输入一段程序,第一种方式:直接输入机器码。

输入“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 ” 跟踪程序,直到程序结束。

解释为什么标志位内容会有改变?另外,说明这段程序完成什么任务?答:(1)执行完指令: add ax,01f0后结果为100f0H 发生了进位,进位标志位发生改变,并且二进制的100f0H 中1 的个数为偶数,所以奇偶标志位发生了改变。

(2)执行完指令:neg bx 即求补指令,bx由正数变为负数,符号标志位发生改变;二进制的1的数量有偶数变成奇数,奇偶标志位发生改变。

(3) 执行完指令:add ax,bx,ax由00f0H 变为10000H,符号标志位发生改变,零标志位发生改变,奇偶标志位发生改变。

重新把寄存器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?”写入计算机内存呢使用如下汇编指令:mov bx,0mov al,48mov [bx],alinc bxmov al,6fmov [bx],alinc bxmov al,77mov [bx],alinc bxmov al,61mov [bx],alinc bxmov al,72mov [bx],alinc bxmov al,65mov [bx],alinc bxmov al,79mov [bx],alinc bxmov al,6fmov [bx],alinc bxmov al,75mov [bx],alinc bxmov al,3fmov [bx],alint 3(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”的含义么?相对寻址方式比绝对地址方便的地方是什么?-7的补码是F9H 即向上跳转到前面7字节单元的位置。

使用相对寻址可节省指令中的地址位数,也便于程序在内存中成块搬动重置IP 的内容为100H,再输入“g ”来执行程序。

程序中断时,输入字母“B”,检查寄存器AL 中的内容为:____62H_____重复上面的动作,但输入不同字母,记录下每次AL 中的内容,能不能判断出来,这段程序的功能是什么?答:读入键盘键入的一个字母,送入寄存器AL。

(ii)(b) 将下面的代码输入CS:200 中:MOV BH,0MOV DL,0MOV DH,0MOV AH,2INT 10MOV DX,0MOV AH,9INT 3通过命令“e DS:0 68 65 6C 6C 21 24 .”在内存数据段中输入了一个字符串,将IP 设为200,输入“g .” 来运行程序,在屏幕左上角能找到输入的字符串是什么:____hell!_________ 这个程序是用来做什么的?答:将光标移到由寄存器DH 和DL 内容所指定的行和列的位置即第0行第0列的位置,并将位于DS:0 的内容显示为字符串,即显示’ hell!’。

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这些指令分别使用了哪些寻址方式?答:MOV AX,33 //立即数寻址MOV AX,[SI] // 寄存器间接寻址MOV AX,[SI+2] // 寄存器相对寻址MOV AX,[SI]2 //寄存器相对寻址MOV AX,[25] // 直接寻址MOV AX,[BX+SI] //基址加变址寻址MOV AX,[BX+SI-3] // 相对基址加变址寻址MOV AX,20[BX+SI-10] // 相对基址加变址寻址将上面的程序翻译为机器码时,可以发现有些指令的机器码是相同的。

哪些代码的机器码相同?根据发现,得出的结论是什么?答:指令: MOV AX,[SI+2]和指令:MOV AX,[SI]2 的机器码是相同的。

两条指令的机器码相同(8B4402),二者表达方式不同,但是达到的寻址目标是一样的。

将数据段与代码段对齐,将数据段中前40H 字节的数据显示出来,使用命令“d DS:0 40 .”,把这些数据记录下来。

假设BX 和SI 中的内容分别是12 和17,判断一下程序运行后的结果是什么?跟踪程序,记录AX 寄存器中的内容,与你预计的结果相符么?答:预测最后AX的值变为相对DS中的基址偏移量为20+12+17-10=39的值运行结果:AX=FFFF与预测相同。

(i) 将程序输入内存中以地址CS:0000 为起始的代码段中:MOV BX,22MOV AX,33PUSH AXPUSH BXMOV AX,0MOV BX,0POP AXPOP BXINT 3跟踪程序,记录发现的变化。

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

步骤AX BX SP 堆栈内容1 0H 22H 00FDH 空2 33H 22H 00FDH 空3 33H 22H 00FBH 0033H4 33H 22H 00F9H 0033H 0022H5 0 22H 00F9H 0033H 0022H6 0 0 00F9H 0033H 0022H7 22H 0 00FBH 0033H8 22H 33H 00FDH 空增加什么语句,能够使AX 和BX 的内容在程序运行后被恢复。

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

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

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

相应的中断程序被调用。

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

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

相关主题