6.1 在代码段中使用数据

image-20211201201053000

解释一下,程序第一行中的“dw”的含义是定义字型数据。dw即“define word”。在这里,使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。

程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢?由于它们在代码段中,==程序在运行的时候CS中存放代码段的段地址,所以可以从CS 中得到它们的段地址。它们的偏移地址是多少呢?因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8个数据就在代码段的偏移0、2、4、6、8、A、C、E处。程序运行时,它们的地址就是CS:0、CS:2、CS:4、CS:6、CS:8、CS:A、CS:C、CS:E。==

实际上,在程序中,有一个代码段,在代码段中,前面的16个字节是用“dw”定义的数据,从第16个字节开始才是汇编指令所对应的机器码。

image-20211201201414004

可以从0B3D:0010查看程序中要执行的机器指令,如图6.3所示。

image-20211201201434444

怎样执行程序中的指令呢?用 Debug 加载后,可以将IP设置为 10h,从而使CS:IP指向程序中的第一条指令。然后再用t命令、p命令,或者是g命令执行。

如何让这个程序在编译、连接后可以在系统中直接运行呢?我们可以在源程序中指明程序的入口所在,具体做法如下。

image-20211201201548914

注意在程序6.2中加入的新内容,在程序的第一条指令的前面加上了一个标号 start,而这个标号在伪指令end的后面出现。这里,我们要再次探讨end的作用。end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在程序6.2中我们用end指令指明了程序的入口在标号start 处,也就是说,“mov bx,0”是程序的第一条指令。

归根结底,我们若要CPU 从何处开始执行程序,只要在源程序中用“end标号”指明就可以了。

6.2 在代码段中使用栈

完成下面的程序,利用栈,将程序中定义的数据逆序存放。

image-20211201203258367

我们要将cs:10~cs:2F的内存空间当作栈来用,初始状态下栈为空,所以ss:sp要指向栈底,则设置ss:sp指向cs:30。

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

image-20211201210531645 image-20211201210549077