实验2 汇编源程序编写与汇编、调试
一、实验结论
实验过程中使用到的盘符注明为v。
实验一:
实验任务(1):使用任意一款文本编辑器,编写8086汇编源程序ex1.asm。源代码如下:
;ex1.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov byte ptr ds:[0], 1 mov byte ptr ds:[1], 1 mov byte ptr ds:[2], 2 mov byte ptr ds:[3], 2 mov byte ptr ds:[4], 3 mov byte ptr ds:[5], 3 mov byte ptr ds:[6], 4 mov byte ptr ds:[7], 4 mov ah, 4ch int 21h code ends end
编写过程使用到的是自带的记事本
进入Dos虚拟机,注册盘符为V并且对ex1.asm进行汇编
对生成的目标文件ex1.obj进行和库的连接,生成可执行文件
运行生成的可执行文件ex2.asm,可以发现屏幕上靠右的地方出现了本来不存在的图标(蓝绿笑脸和蓝色心和红色方块)
生成的相关文件截图如下
下面开始调试Debug
首先使用-r命令查看寄存器的相关内容,可以看到CX对应的值
需要查看PSP的值,需要使用到-d命令,因为一次性默认查看128个字节,而需要的是256个字节,因此需要制定查看范围直接到00ff
根据之前的查看寄存器结果,可知寄存器CS的值是076A,而IP的值是0000,CX的值是0031,因此范围是0-30,所以精准反汇编的范围如下
第16行是mov ah,4c。根据上图所示,目标所在处的偏移地址是002D
似乎并没有显示出对应的之前的图像,这可能是屏幕被刷新了。
实验任务(2):使用任意一款文本编辑器,编写8086汇编源程序ex2.asm。源代码如下:
; ex2.asm assume cs:code code segment mov ax, 0b810h mov ds, ax mov bx, 0 mov ax, 101H mov cx, 4 s: mov [bx], ax add bx, 2 add ax, 101H loop s mov ah, 4ch int 21h code ends end
编写过程同样使用记事本
对ex2.asm进行汇编,得到对应的目标文件ex2.obj
继续把目标文件和库文件连接,得到对应的可执行文件ex2.exe
执行可执行文件ex2.exe,屏幕的同样的上方靠右的位置出现了一组和实验任务一种完全相同的图案
具体的生成文件截图如下
开始调试Debug,使用-r命令查看各个寄存器的值
这时CS的值是076A,IP的值是0000,CX的值是001C,因此,精确反汇编的范围是0:1B
执行单步调试,使用-p和-t和-g命令,对于loop指令和int中断指令进行不同的调试对比
在loop指令之前都是不需要注意的,可以一起执行,不需要单步调试
现在执行到了LOOP指令之前,所在地址是076A:0016,现在使用-p调试
然后回到之前的地方,这一次使用-t调试
区别在于使用-p执行时直接执行到下一条指令,但是使用-t单步调试时,会跳转到CS:000E的地址,因为两个面向的对象是不同的,-t是针对语句,-p是针对整个任务。
现在需要调试到执行int中断指令之前,地址是076A:0018。
同样首先使用-p进行调试
之后使用-t单步调试
用-p命令自动执行,形成一个指令循环
更改mov cx,4到mov cx,8之后
重新汇编连接
重新执行之后
在同样的开始的地方生成了更多的图标,观察可知,前面四个图标和之前是完全相同的。
重新调试,执行到中断指令之前
和之前进行对比,AX和BX的值发生了变化,整体是一个次数的翻倍,因为循环次数从4变成了8,是一个2倍关系
实验任务一和实验任务二做下来之后的总结是,两个实现的效果应该是一致的,但是ex2.asm使用到了loop指令,循环执行,我觉得整体上可能更加高效,在处理更多的数据填入的情况下ex2.asm的代码更具有泛用性
实验任务(3):综合使用loop,[bx],编写完整汇编程序,实现向内存b800:07b8开始的连续16个字单元重复填充字数据 0237H。
编写汇编源程序 给出运行结果截图 如程序编写正确,预期结果如图所示。
首先编写程序
;ex3.asm assume cs:code code segment mov bx,0b800h mov ds,bx mov cx,16 mov ax,0237h mov bx,07b8h s: mov [bx],ax add bx,2 loop s mov ax,4c00h int 21h code ends end
同样使用的是记事本
进行汇编连接
执行结果应该符合之前的要求
生成的文件相关
更改成0239H
这次使用了cls清屏
显示的是绿色的9,颜色相同,数字不同
更改成0437的场合
重新进行汇编连接
清屏之后运行
显示的是红色的7,数字相同,颜色不同
可以很清楚地看到,前面两个字段控制的是显示的颜色,后面两个字段控制的是显示的内容,即高位存放字体颜色,低位存放文字内容
实验任务(4):
编写完整汇编源程序,实现向内存0:200~0:23F依次传送数据0~63(3FH)。
先编写程序
; ex4.asm assume cs:code code segment mov bx,0000h mov ds,bx mov ax,0000H mov bx,0200h mov cx,0040h s: mov [bx],ax inc bx inc ax loop s mov ax,4c00h int 21h code ends end
使用记事本
汇编连接
生成的相关文件
运行生成的可执行文件,并且进行调试,使用-d命令查看对应内存空间的内容
先查看CX的值
得到目标地址为076A 0000:0018,进行精确反汇编
使用-t进行调试
使用-p进行调试
根据之前的结果可知,数据已经按照要求存入了指定的内存空间。
实验任务(5):
教材实验4(3)(P121)
下面的程序的功能是将“mov ax,4c00h”之前的指令复制到内存0:200处,补全程序。上机调试,跟踪运行结果。
assume cs:code code segment mov ax,_____ mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,_____ s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
;exn.asm assume cs:code code segment mov ax,code mov ds,ax mov ax,0020h mov es,ax mov bx,0 mov cx,0018h s: mov al,[bx] mov es:[bx],al inc bx loop s mov ax,4c00h int 21h code ends end
填写如上
连接汇编
运行测试,开始Debug
根据CX CS IP的值进行反汇编
调试到LOOP指令之前
-p调试一步
-t调试
-d查看0-200内存
和之前相对比,可以发现程序已经装入了内存之中。
第一空填写code的原因是要把代码装入内存当中,代码和数据源是同源的。
第二空填写0018h是因为所需要装入的数据量,即指令经过-u命令查看后发现占了24个字节,而CX的初始值为001D,因此填入0018H
二、实验总结
(1)本次实验后掌握了根据CX精确反汇编,和使用g命令断点调试。
(2)填充字段到内存中,高位字段存放字颜色,低位字段存放字内容。
(3)实验中遇到的问题是那些图标单步调试未显示,可能是刷新了的原因。
(4)loop循环可以用于简化任务,节省代码量。