第6章 包含多个段的程序

在代码段中使用数据

之前提到的那一段安全的空间只有256字节,我们需要超过256个字节的空间该怎么办?在操作系统的环境中,合法地通过操作系统取得地空间都是安全的,因为操作系统不会让一个程序所用的空间和其他程序以及系统自己的空间相冲突。
程序取得所需空间的两种方法:
1.在加载程序的时候为程序分配
2.在程序执行的过程中向系统申请
我们若要一个程序在被加载的时候取得所需的空间,则必须要在源程序中做出说明
当可执行文件中的程序被加载入内存时,这些定义的数据同时也被加载入内存。与此同时,我们要处理的数据自然而然地获得了存储空间
dw 0123h,"dw"的含义是定义字形数据即define word
编程计算0123h、0456h、0789h、0abch、0defh、0cbah、0987h的和,结果存在ax中

点击查看代码
assume cs:code

code segment
	dw 0123h,0456h,0789h,0abch,0defh,0cbah,0987h
  start:	mov bx,0
  		mov ax,0
          
          	mov cx,8
      s:	add ax,cs:[bx]
      		add bx,2
          	loop s
          
          mov ax,4c00h
          int 21h
code ends
end start

start这个标号在end后出现。伪指令end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。end指令指明了程序的入口在标号start处
伪指令end描述了程序的结束和程序的入口。在编译、链接后,由"end start"指明的程序入口,被转化为一个入口地址,存储在可执行文件的描述信息中
利用这种方法可以安排程序框架
assume cs:code
code segment
数据
start:
代码
code ends
end start

在代码段中使用栈

我们需要栈空间,当然也要由系统分配,正如上面定义数据,数据就能载入内存。所以可以在程序中通过定义数据来取得一段空间,然后将这段空间作为栈空间使用
dw 0,0,0,0,0,0,0,0
之后合理设置栈顶ss:sp,这段空间就可以当作栈空间
所以描述dw的作用时,可以说用它定义数据,也可以说用它开辟内存空间

将数据、代码、栈放入不同空间将数据、代码、栈放入不同空间

上述内容将他们放在一起程序显得混乱,用到栈空间也小,代码不长,放在一个段没问题(8086模式一个段的容量不能大于64kb)
所以考虑用多个段存放数据、代码

点击查看代码
assume cs:code,ds:data,ss:stack
data segment
	dw 0123h,0456h,0789h,0abch,0defh,0cbah,0987h
data ends

stack segment
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends

code segment
start:	mov ax,stack
				mov ss,ax
        mov sp,20h
        
        mov ax,data
        mov ds,ax
        
        mov bx,0
        
        mov cx,8
    s:	push [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
code ends
end start

定义多个段的方法和定义一个段方法一样
对段地址的引用:在程序中段名就相当于一个标号,它代表了段地址
我们定义了三个段,作用如同的名字含义,但是计算机不知道
我们只需设置start的位置在code段(cs:ip),ss:sp指向栈顶,ds指向data段,其他寄存器如bx存放data段中数据的偏移地址,即可按照我们的含义分段了

posted @ 2022-01-26 17:42  摸鱼的Beck  阅读(46)  评论(0)    收藏  举报