包含多个段的程序
程序取得空间的方法两种
加载程序的时候为程序分配
程序在执行的过程中向系统申请
1>代码中使用数据
assume cs:code
code segment
dw 1235H ,0456H
mov bx,0
mov ax,0
code ends
end
程序入口点 cs:0 无法执行程序
可执行文件由描述信息+程序组成
描述信息主要由:编译,连接程序对源程序中的伪指令进行处理所得到的信息
end 的作用
用伪指令end描述程序的介绍和程序的入口,转化为描述信息存储在可执行文件中
当程序被加载内存后,加载者从执行的可执行文件的描述信息中读到程序的入口地址,设置cs:ip
总结
程序框架
assume cs:code
code segment
;
;
数据
;
;
start:
;
;
代码
;
;
code ends
end start
2>在代码中使用栈
assume cs:codesg
codesg segment
dw 0123h,1324h ;用dw定义2个字型数据,程序加载后,获得2个字的内存空间,存放2个字型数据
dw 0,0 ;在用dw定义2个字型数据,用来做栈空间用
start:
mov ax,cs
mov ss,ax
mov sp,8
;
;
mov ax 4c00h
int 21h
codesg ends
end start
作业
(1):
mov [bx],cs:[bx]
(2):
mov ax,cs
mov ss,ax
mov sp,26
mov ax,0
mov ds, ax
mov bx,0
mov cx, 8
s: push [bx]
mov cs:[bx],[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
3>将数据,代码,栈放入不同的段
1显得混乱
2一个段容量<=64kB
考虑用多段处理数
例如:
编写调试具有多段的程序
assume cs:codes,ds:data,ss:stack
data segment
dw 0123h,4567h ;0b4b:0 -23 ,0b4b:1 ,0b4b:2,0b4b:3
data ends
stack segment
dw 0,0,0,0
stack ends
codes segment
start:
mov ax,stack ;段名字为段地址0b5c
mov ss,ax
mov sp,16
mov ax,data ;0b5b
mov ds,ax
mov bx,0
mov cx,8
s: push [bx] ;传送到ds,将data段地址设置为ds,手工改变ds,ss的段地址,改变存储位置.data:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
codes ends
end start
段地址的引用
mov ax,data
mov ds,ax
mov ax,ds:[6]
不能用该指令
mov ds,data
8086不也许将一个数值直接送入段寄存器
mvo ds,data
实验二
assume cs:codes,ds:data,ss:stack
;;执行后
;;ds=es=0b4b
;;前266B****,,
;;程序start ss=cs=0b5b
;;由于开始数据段data=0b5b,物理地址为0b5b0(46512),占用了16B到46528
;;46528即0b5cH ,stack的段地址,物理地址为0b5cH,占用了16B到46544
;;段地址cs=0b5d,开始执行程序的执行地址
;;总结:
;;程序加载后ds=es=x,*cs=ss=x+10H,前256保留特殊用
;;在x+10处开始分配所需要的内存空间
;;伪指令cpu不认识,因此不改变ds,ss!cs会变(原因略)
;;开始分配data内存空间,将data的段名翻译成具体的段地址
;;开始分配stack内存空间,将stack的段名翻译成具体的段地址
;;改变cs段地址
data segment
dw 0123h,0456h,0789h,0abch,0fedh,0cbah,0987h ;0b4b:0 -23 ,0b4b:1 ,0b4b:2,0b4b:3
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
codes segment
start:
mov ax,stack ;段名字为段地址0b5c
mov ss,ax
mov sp,16
mov ax,data ;0b5b
mov ds,ax
push ds:[0] ;传送到ds,将data段地址设置为ds,手工改变ds,ss的段地址,改变存储位置.data:[bx]
push ds:[2]
pop ds:[0]
pop ds:[2]
mov ax,4c00h
int 21h
codes ends
end start
作业
256B
cs=0b5d
ds=0b5b
ss=0b5c
3