1、汇编语言程序设计 实验一 DEBUG 程序使用技巧学号: 姓名:1. 寄存器和内存开始 Debug 程序。输入“Q8 ” 退出程序。再次启动 Debug。输入 “r8 ”来显示CPU的当前状态和寄存器中的当前内容。输入 “r AX8 ”和“1234”,_寄存器中的内容变为 1234。输入 “r DS8 ”和“2000”,_寄存器中的内容变为 2000。输入 “d DS:10008 ”来显示数据段中 80H 字节数据,把数据抄在这里:输入 “f DS:1000 1100 778 ”再显示一次这 80H 字节。判断这条指令的作用是什么?再输入 “d 2000:10008 ”来显示数据段中 80H
2、字节数据。观察与前面的数据有无不同。输入 “d 1900:01008 ”和“d 1ff0:01008 ”来显示两个存储段中的内容。比较其中 2000:0000 段中的数据。相同段落中的数据相同么?根据你的观察,得出结论,是否程序员可以用不同的段起始地址和偏移量组合,把不容内容存入相同的内存段中。2输入机器码,使用单步和断点退出 Debug,再重新启动 Debug。输入 “r8 ”观察 CPU 的状态,下一条指令是什么?使用两种方式输入一段程序,第一种方式:直接输入机器码。输入 “u8 ”来显示程序段中的指令序列。然后输入 “d CS:1008 ” 来显示代码段中的数据。观察显示内容。“u CS
3、:100 1068 ”做反汇编,就是显示出汇编语句。将这几句汇编语句记录下来:使用输入 “r8 ”观察 CPU 的状态,使用 “t8 ”来跟踪程序,直至最后一条指令执行完毕。注意,跟踪程序前,要让 IP 寄存器中的值是 100H。一直监视 AX 和 IP 寄存器的内容变化,尤其是标志位的变化。第二种方式,是输入汇编语句。重启 Debug 程序。先输入 “a CS:1008 ”,然后输入:MOV AX, FF00ADD AX,01F0MOV BX,AXNEG BXADD AX,BX输入 “u CS:100 10A8 ”就可以得到这几条语句的机器码。把机器码记录下来:使用命令“r ip8 ”再输入
4、 “1008 ”,可以将寄存器 IP 中的内容置为 “100H”。再输入“r8 ”观察 CPU 的状态,然后反复输入 “t8 ” 跟踪程序,直到程序结束。解释为什么标志位内容会有改变?另外,说明这段程序完成什么任务?重新把寄存器 IP 的内容变为 100H,不使用跟踪命令 “t”,改用“g 10c”来完成程序。程序中还可以加断点,做法是在程序中加入 “int 3” 这条指令。如果这条指令在程序的末尾,我们可以通过输入 “g8 ” 来完成运行程序。这样就不需像上面需要告诉 Debug 程序最后机器码字节的地址偏移量了。“int 3”是 Debug 中很有效的返回控制指令。把这条指令放在程序中必要
5、的位置上,在这条指令后面的代码在不允许时就不会运行。3ASCII 字符码,从键盘输入,从显示器输出(i) 标准 ASCII ( American Standard Code for Information Interchange ) 码使用 7- bit 二进制数来代表字符。一般文本信息经常用 ASCII 编码。使用命令 “a CS:1008 ”, 输入下面的代码:MOV BX,0MOV BX,BLINC BXCMP BH,1JNE 103INT 3使用 “d DS:0 1008 ”命令,显示程序运行前相应内存段中的数据。运行上面的程序来填充 DS:0000-00FF 这段内存中的内容。再次输
6、入 “d DS:0 1008 ”命令来显示填充的内容。在窗口的右边,可以看到相应的ASCII码字符。如果填充的内容不是字符,显示就用点表示。用类似方法,如何将字符串“How are you?”写入计算机内存呢? (ii) 计算机的 BIOS ( Basic Input / Output System ) 程序有很多子程序,用来通过标准外设处理输入和输出,比如,键盘和显示器。BIOS 的程序都可以通过称为系统中断的特殊指令被调用。例如:INT 16H 返回值是把下一个键盘输入值送入寄存器 ALINT 10H 当 BH = 0 时,将光标移到由寄存器 DH 和 DL 内容所指定的行和列的位置上IN
7、T 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 1108 ” 命令,将程序转换为机器码。其中 “JMP 100”的机器码是 “EBF9”。如果使用的是相对寻址方式,我们可以猜测出机器码中“F9”的含义么?相对寻址方式比绝对地址方便的地方是什么?重置 IP 的内容为 100H,再输入“g8 ”来执行
8、程序。程序中断时,输入字母“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 248.”在内存数据段中输入了一个字符串,将 IP 设为 200,输入 “g8.” 来运行程序,在屏幕左上角能找到输入的字符串是什么:_这个程序是用来做什么的? _4. 内存寻址把下面程序输入到内
9、存中以地址 CS:0000 为起始的代码段中。MOV AX,33MOV AX,SI MOV AX,SI+2 MOV AX,SI2MOV AX,25 MOV AX,BX+SI MOV AX,BX+SI-3 MOV AX,20BX+SI-10 INT 3这些指令分别使用了哪些寻址方式?将上面的程序翻译为机器码时,可以发现有些指令的机器码是相同的。哪些代码的机器码相同?根据发现,得出的结论是什么?将数据段与代码段对齐,将数据段中前 40H 字节的数据显示出来,使用命令“d DS:0 408.”,把这些数据记录下来。 假设 BX 和 SI 中的内容分别是 12 和 17,判断一下程序运行后的结果是什么
10、?跟踪程序,记录 AX 寄存器中的内容,与你预计的结果相符么?5. 堆栈.(i) 将程序输入内存中以地址 CS:0000 为起始的代码段中:MOV BX,22 MOV 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) 重启 Deb
11、ug将指令 INT 3 在代码段地址 CS:100 中输入。输入 “r8.” 记录堆栈段和代码段的参数:SS:_ SP:_ CS:_ IP:_将堆栈段中 SS:FFE0 FFFF 的内容显示出来,记录堆栈段中的有效数据。地址 : _内容 : _执行 INT 3 指令,引起 CPU 的软件中断。相应的中断程序被调用。中断服务程序的最后一条指令是 IRET,它告诉 CPU 中断服务结束。一步步跟踪 INT 3 直到 IRET 指令被执行。注意寄存器 SP 中内容的变化,记录被推入堆栈的内容,以及中断程序终止时,弹出命令将什么内容送到什么地方?根据观察,能找到 INT 3 中断向量的内容么?中断服务程序的起始地址是什么?