实验五:编写、调试具有多个段的程序

任务一:

(1)将任务一代码写入记事本并保存于masm文件并在masm环境下生成可执行文件t1.exe,截图如下:

(2)在debug环境下调试t1.exe,用r命令查看各寄存器的值,截图如下:

(3)可知cs值为15f5,用u命令反汇编实验代码,可知在程序执行前,用g命令运行,再用d命令查看data段中的值,截图如下:

①CPU执行程序前,程序返回前,可知data段中的值不变。

②CPU执行程序前,程序返回前,cs=15f5,ss=15f4,ds=15f3

③设程序加载后,code段的段地址为X,则data段的段地址为:X-2,stack的段地址为:X-1

任务二:

(1)将程序代码写入记事本截图如下:

(2)在debug环境下调试t1.exe,并用r查看各寄存器的值,u命令进行反汇编,g命令执行截图如下:

①CPU执行程序,程序返回前,data段中的数据不变。

②CPU执行程序,程序返回前,cs=15F5,ss=15F4,ds=15F3。

③设程序加载后,code段的段地址为X,则data段的段地址为:X-2,stack的段地址为:X-1

④对于定义的段,如果段中的数据占N个字节,则程序加载后,这段实际占有的空间为:若N不满16个或为16字节则为一段,N满16但不满32也分配32字节

即 a=Nmod16,若a=0,则空间为 (N\16)*16,若a≠0,则空间为 (N\16+1)*16

任务三:

(1)将程序代码写入记事本截图如下:

(2)在debug环境下调试t1.exe,用r命令查看各寄存器的值,u命令反汇编,g命令执行截图如下:

①CPU执行程序,程序返回前,data段中的数据不变。

②CPU执行程序,程序返回前,cs=15F3,ss=15F7,ds=15F6。

③设程序加载后,code段的段地址为X,则data段的段地址为:X+3,stack的段地址为:X+4

任务四:

(1)分别执行三个程序看结果截图如下:

第一个程序反汇编截图:

可知u命令反汇编代码之后发现不是我们输入的代码,可知运行失败

第二个程序反汇编截图:

反汇编之后可以看到也不是我们输入的代码段,运行失败。

第三个代码反汇编截图:

可知反汇编后使我们输入的代码段,运行成功

将伪指令“end start”改为“end”后只有第三个程序可以正确执行,因为没有指明程序段入口,CPU默认从头执行,只有最后一个代码从头

执行可以不需要指明程序段入口。

任务五:

将代码补全并写入记事本截图如下:

(2)在debug环境下调试t1.exe,分别查看段c运行程序前后的值截图如下:

实现了数据依次相加

任务六:

(1)将代码补全写入记事本截图如下:

(2)在debug环境下调试t1.exe,分别查看程序运行前后段b中的值截图如下:

实现了将a段中的前八个字型数据逆序存储到b段中

总结:这一次的实验  让我了解了汇编程序中的嵌套使用,也就是多个段的结合使用,一个程序中可以放多个不同的段

也学会了  “end 标号”表示的是要让CPU从标号处开始执行,如果不加标号,程序段直接以“end”结尾则默认CPU从头开始执行

而在有些拥有多个段的程序中,不加标号,程序不能正确运行。

在CPU 程序执行前,也可以查看寄存器cs,ss,ds的值是否有逻辑关系。

猜你喜欢

转载自www.cnblogs.com/nxdzy/p/10003979.html