多个代码段的程序
这种思想即: 将程序分为代码段,数据段,栈段
为规范内存的使用,程序员是不能随便决定内存空间的使用,应该让系统进行分配例如 数据段的并且连接的程序段.
数据段指令dw(define word):
dw 1020h,2123h,0f212h //定义字数据 若是在程序开头定义,则其偏移地址分别为0 2 4. 按照字符编址的.
//传输数据的宽度,则是能找到字符数据的地址位数.即可寻址范围
要注意: 定义的字数据段的数据长度和偏移地址的关系. 偏移地址以字符为单位编址,就先把定义的数据段计算出占多少字符.再加上当前偏移地址,并用16进制进行表示.
同时,定义了这些数据,也等价于申请了一定的内存空间.
多段框架通过end 标记//来指明代码段执行的入口
将栈段,数据段,代码段分别处理
assume cs:code,ds:data,ss:stack //这一句只是提醒编译器,而无任何实质性作用
data segment
dw 0123h , 0223h , 0323h , 0254h ,0fff2h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax,stack //stack段 地址
mov ss,ax //设置栈段寄存器
mov sp,1Ch //设置栈偏移地址(最大地址,栈底)
mov ax,data //data段 地址
mov ds,ax //设置数据段的段寄存器
mov bx,0
mov cx,8
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
这段程序中,stack ,data , code ,start均为可变的名称。assume 只是关联了寄存器和段名并未让寄存器真正的赋值。cpu会根据end start 中start的标志来明确cs:ip的执行接口。分开段写目前有两个优点:1,有标志代表stack,data的入口地址。 2,容易区分
但是在过程中,其在内存中的分布依然是连续的。内存的分配和段的位置是相关的。
汇编中不能使用//进行注释
网友评论