实验五

 

一:代码如下

经过编译连接后得到可执行文件a1.exe

若要得到相应的结果需要对程序进行运行

首先对其进行反汇编(首先代码所占的总字节数为cx=42h而除了分贝配栈段和地址段20h后所得到的代码长度应该为21h)查看各个命令所对应的代码段地址,以方便用-g命令对其运行

 

 

使用-d命令查看数据段

根据上面两个图即可得到data段数据已及各个寄存器的值

 

 

二:代码如下

 经过编译连接后便可得到可执行文件a2.exe

经过查看后可以得到代码的数cx=42h而除去赋值的命令所得到的code段的代码条数应该为42h-8h=3ah

经过反汇编后

 可以看出反汇编的范围扩大了;虽然数据段和栈段中所定义的数据减少了但是所得到的结果仍然与实验一的结果一样

猜想数据段和栈中的数据以默认16个字节为一组的方式进填充了

将data段中的赋值语句dw  0123h,0456h;删除后重新进行编译连接所得到得结果如下图

 

命令减少了10h;于是乎便可得到最后一题的结果

 

 经过g命令和的命令即可查看内存中的值已及寄存器的值

 

 

 

 三:代码如下图所示

经过编译和连接后我们可以得到可执行文件a3.exe

 

首先进行反汇编:可以看出代码数为44h根据实验2中的结论得代码段中的命令所占的字节数为24h

于是可以得到

使用g命令进行运行随后使用d命令查看内存

于是结果如下图

 

 四:(1)

修改代码经过编译连接后反汇编

文件a1运行失败

 (2)

文件a2运行失败

(3)

文件a3运行成功

原因:当没有知名的程序入口时end指令便会从当前的cs:ip值开始进入程序而实验1和2中前面都有一段赋值语句

所以实际的代码段的ip地址已经不是end所进入的数值(当前的ip为0)。我们知道实验1和2中代码开始段应为23以一

为例反汇编得

五:编写代码如下

 

经过编译连接等步骤得到可执行文件

总共有5b个字节于是反汇编要29如下图

 

并运行程序

 

 

查看运行结果 

 

 

 

 

 

 

六:实验代码如图所示(不知为何当s:后面的push为[ax]时程序一直有错误(前面和后面的指令也都为相应的ax))

bebug后得到了

所以可以知道是几代码段的长度为(64+15-16-32)1f于是进行反汇编

执行g命令和d命令查看代码

 

 

 

 

 

 

 

 

 

 

 

 

 实验小结

1.16位汇编中的-u命令需要输入从起始位置到终止位置的地址,否则默认反汇编显示32个字节的地址如下图少了int21h

 2.16位汇编不能使用ax间址寻址,只有BX、BP、SI、DI才可以。32位程序才可以用任意32位寄存器间址寻址。

 疑惑:实验3中的精确反汇编位数为何不是23而是21

posted @ 2018-11-23 23:05  Assembly123  阅读(147)  评论(1编辑  收藏  举报