包含多个段的程序
程序获取所需要的内存空间:
- 在加载程序的时候为程序分配
- 在执行的过程中向系统申请(本课程中不讨论第二种方法)
在代码段中使用数据
我们可以用dw来定义字型数据
code segment
dw 0123h,0456h,0789h
...
code ends
在该代码段开头的三个字大小的内存空间,会被解释为汇编指令,我们在debug中用u指令可以看到这些机器码对应一些”莫名其妙的汇编指令“
为了让这些数据不影响正常指令进入的位置,我们需要一个标号,来告诉编译器真正的汇编指令从哪里进入,start的作用就是如此(start是告诉编译器,并不是告诉cpu),例如:
code segment
dw...
start:....
code ends
end start
start会让cs:ip指向汇编指令开始的地址。
在代码段中使用栈
我们还可以在段中使用栈,方法就是用dw定义一堆0,来达到申请内存空间的目的。然后可以通过ss:sp指向最后一个0后面的一个字的地址(栈底),把这段空间当作栈使用。
使用多个段
我们之前只是把数据和栈还有代码(汇编指令)都放在一个段中,这样做可能会引起结构不清晰的问题。我们可以用多个段来分别存储数据,代码和栈,例如
assume cs:code,ds:data,ss:stack
data segment
dw....
data ends
stack segment
dw 0,0,.....
stack ends
code segment
start:....
code ends
end start
这就是用多个段非常经典的一个程序
- 总之,cpu到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对cs:ip,ss:sp,ds等寄存器的设置来决定的