任务一:
(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的值是否有逻辑关系。