1. 在代码段中使用数据
dw命令
- 定义字型数据。
- dw == define word
- 例如:
这样dw 0123H, 0456H
会把数据存在cs段的最开始,因为dw是代码段的第一行
db命令
- 类似dw,但是是定义字节型数据。
start标志代表cpu从哪里开始读取指令
- 例如上图,这样cpu就不会从dw开始读取,而是从
mov bx, 0
开始读取 - 因为一开始的dw是设置字型内存,从dw下边开始才是代码执行,所以要加上start
- 所以end出来通知编译器结束,还能通知编译器程序入口位置。
2.在代码段中使用栈
- 通过dw定义申请到内存空间,然后将这一段内存空间当栈使用
- 这里申请了八个字空间,把栈的段地址和偏移地址赋值,相当于把那段内存空间当栈使用
3.将数据、代码、栈放入不同的段
- stack是一个地址,但是不会在一开始就和ds绑定,需要
mov ax,stack mov ss,ax
这样 - 由于assum是伪指令,
所以cpu是看不懂的,所以cs:code,ds:data只是绑定,但是cpu不会设置。 - CPU会把
end start
的start的标号指向的那条指向入口,设置CS:IP - assume只是对编译器编译程序起作用,并不能对段寄存器进行实际的赋值。assume的目的是为了在编译时确定变量的段地址。
- 因为段总是16的倍数,所以如果段中的数据占N字节,程序加载后,实际占的空间是
16*(N/16+1)
注意这里的是向下取整,地板除。 - 编译器在编译的时候是从上往下的,所以程序段相对位置不同,段地址也不同,而且每一段程序段占的空间一定是16的倍数,这个和段寄存器寻址的原理有关。