#pragma once
/* 29-包含多个段的程序01
前面我们写的程序中,只有一个代码段。
现在有一个问题是如果程序需要用其他空间来海放数据我们使用哪里呢?
第5章中,我们讲到要使用一段安全的空间。我们说0:200~0:300是相对安全的,.
可这段空间的容量只有256个字节,如果我们需要的空间超过256个字节该怎么办呢?
放心,系统妈妈会给的。怎么给呢?我们粗略地讲下,但这不是必须要会的听过就行。
对于使用多个段的问题,我们先简单说到这里,下面我们将以这样的顺序来深入地讨论多个段的问题:
(1)在一个段中存放数据、代码、栈,我们先来体会一下不使用多个段时的情况
(2)将数据、代码、栈放入不同的段中。.
在代码段中使用数据
考虑这样一个问题,编程计算以下8个数据的和,结果存在ax寄存器中:
0123H , 0456H , 0789H , OabcH , OdefH OfedH ,OcbaH,0987H。
在前面的课程中,我们都是累加某些内存单元中的数据,并不关心数据本身。
可现在我们要累加的就是已经给定了数值的数据。
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ;此处定义了8个字型数据 数据和数据之间用 逗号, 分隔.
mov bx,0
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
codesg ends
end
dw 即 define word 定义字型数据 定义字节数据就是 db 即 defind Byte
解释一下,程序第一行中的“dw”的含义是定义字型数据。dw 即 define word。 定义字节数据就是 db ,即 defind Byte
在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。
程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢?
由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从CS中得到它们的段地址.. (cs:codesg 表示该段是代码段,codesg segment 到 codesg ends 中声明 的数据都在该段也就是cs 段中 )
这8个数据的偏移地址是多少呢?因为用dw定义的数据处于代码段的最开,所以偏移地址为0,这8个数据就在始代码段的偏移0、2、4、6、8、A、C、E处。
程序运行时它们的地址就是CS:0、CS:2、CS:4、CS:6、CS:8、CS:A、CS:C、CS:E。(待上机验证.......)
我们将前面的程序编译、连接为可执行文件29-1.exe,先不要运行,我们用debug加载查看一下。来,我们上鸡去!!
如何让这个程序在编译后可以存系统中直接运行呢?
我们可以在源程序中指明界序的入O所在,具体做法见下面的程序.
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,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
codesg ends
end start
注意在上面程序中加入的新内容,我们在程序的第一条指令的前面加上了一个标号start,而这个标号在伪指令end的后面出现。之前已经说明了end 标号 是表示这个标号处是 一个程序开始的地方,为什么要标记一个开始点呢?因为
CPU在执行程序的时候,由于我们把该程序的数据都定义在了代码段,而从dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h 这段代码只是声明数据,被翻译成代码段的指令后,就会出现 错误指令,导致整个程序的指令都变乱了
,当我们设定了程序入口后,就从入口开始翻译,才可以正确的翻译指令.
探讨end的作用.end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。CPU 知道入口是通过 end 来寻找的.
实验五
编写、调试具有多个段的程序
这一章的理论内容不是很多,但有些知识却是要在实践中掌握。这个实验,既是一次实践,也是学习内容。必须完成这个实验,才能继续向下学习。
*/