欢迎来到DIVCSS5查找CSS资料与学习DIV CSS布局技术!

是时候关注我们一波了<微信公众号渗透云笔记>

包含多个段的程序

前面说道,如果要使用安全的内存空间,0:200~0:2FF是相对安全得内存空间,可是这段空间只有256字节,如果需要的空间大于256字节该怎么办呢?

在操作系统允许的情况下,程序可以取得任意容量的空间。

取得空间的方法有两种。

  • 加载程序时为程序分配
  • 执行过程中向系统申请(这里不讨论)

若要一个程序在加载时取得所需的空间,则必须在源程序做出说明。

上面是从内存空间获取的角度上,谈定义段的问题。为了可读性、功能设计,一般一额定义不同的段来存放。

关于段的问题,我们将以这样的顺序讨论多个段的问题:

  • 在一个段中存放数据、代码、栈;
  • 将数据、代码、栈放入不同的段中。

在代码段中使用数据

我们可以在程序中,定义我们希望处理的数据,数据作为程序的一部分一同被编译、链接写到可执行文件中。

考虑这样一个问题,编程计算8个数据的和,结果存放在AX寄存器中,下面是用我们前面知识写出的代码。

汇编干货第三章

 

这里出现了一个新的指令dw,dw即“define word”,在这里,定义了8个字型数据,占用16字节的内存空间。

使用Debug调试程序,不运行,发现一个问题,程序所在的内存区为075C:0(DS=075C),前256字节存放着PSP,程序的存放位置应为076C:0,使用U指令查看确发现有点不对。

实际上,看到其实是有dw定义的数据,从第16字节开始才是汇编指令对应的机器码。

汇编干货第三章

 

汇编干货第三章

 

怎样执行程序中的指令呢?在Debug中,可以手动修改IP寄存器的值,从而使CS:IP指向程序的另一条指令。

这样一来,在系统运行时就会出现问题,程序的入口不是我们希望执行的指令。

借助伪指令可以通知编译器程序的入口。

汇编干货第三章

 

有了这个指令,可以仿照这个模板写出更多的程序,start上面安排数据,start和end start之间安排代码。

在代码段中使用栈

汇编干货第三章

 

这里的检测点没做出来,看视频才想通的,后来发现这个题目第一眼没看懂。

检测点考察dw定义的数据在内存空间的位置,理解了这一点,题目就可以做出来了。

注释未知的指令,在debug模式中运行可以直观的感受到到这一点。

将数据、代码、栈放入不同的段

前面的内容中,我们将数据、栈和代码都放到了一个段里面,编程的时候需要注意何处是数据,何处是栈,何处是代码。显然这样有问题:

  • 程序混乱
  • 8086的段空间限制只有64KB

下面的程序用不同的段实现了上面的功能

汇编干货第三章

 

  • 对于不同的段,使用不同的段名联系不同的段寄存器。
  • 注意红线的部分,段名相当于一个标号,代表了段地址,8086CPU不允许将一个数值送入段寄存器,因此使用其它寄存器中转
  • “代码段”、“数据段”、“栈段”完全是我们的安排
  • CPU如何处理定义的段的内容,取决与程序中具体的汇编指令。
  • 段名只是为了阅读性
  • cs:code等代码将段名和寄存器联系起来
  • end start指明了程序的入口,CS:IP指向这个入口,从而执行程序的第一条指令

编写、调试具有多个段的程序

这里是两个检测点,为了理解不同段在内存空间中的排列,一个段在内存空间中最小单位为16字节。

限于篇幅原因,我这里介绍比较最后的一个实验。

程序如下,编写code段的代码,用push指令将a段中的前8个字型数据逆序存储在b段中。

汇编干货第三章

 

写出程序很容易,不过这不是我要说的重点。

汇编干货第三章

如需转载,请注明文章出处和来源网址:http://www.divcss5.com/rumen/r58592.shtml