Chinaunix首页 | 论坛 | 博客
  • 博客访问: 497325
  • 博文数量: 161
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-25 01:20
文章分类

全部博文(161)

文章存档

2011年(44)

2010年(47)

2009年(48)

2008年(22)

我的朋友

分类:

2009-08-28 23:05:16

包含多个段的程序
程序取得空间的方法两种
加载程序的时候为程序分配
程序在执行的过程中向系统申请

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
阅读(620) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-06-05 02:21:01

大连法律咨询在线 http://www.fabowang.com 大连律师在线咨询 http://www.fabowang.com 大连法律顾问网 http://www.fabowang.com 大连律师咨询 http://www.fabowang.com