第六章 包含多个段的程序
前面的程序中,只有一个代码段.现在有一个问题是,如果程序需要用其他空间来存放数据,使用哪里呢?在第五章中,我们说0:200~0:2FF是相对安全的,可这段空间的容量只有256个字节,如果我们需要的空间超过256个字节该怎么办呢?

在操作系统的环境下,合法的通过操作系统取得的空间都是安全的,因为操作系统不会让一个程序所用的空间和系统自己的空间相冲突.在操作系统允许的情况下,程序可以取得任意容量的空间.

程序取得所需的空间的方法有两种,一是加载程序的时候为程序分配,再就是程序在执行的过程中向系统申请.

上面是从内存空间获取的角度上,谈定义段的问题.我们再从程序规划的角度来谈一下定义段的问题.大多数有用的程序,都要处理数据,使用栈空间,当然也都必须有指令,为了程序设计上的清晰和方便,我们一般也都定义不同的段来存放他们.

6.1 在代码中使用数据

从规范的角度上来讲,我们是不能自己随便决定哪段空间可以使用的,应该让系统来为我们分配.我们可以在程序中,定义我们系统处理的数据,这些数据就会被编译,连接程序作为程序的一部分写到可执行文件中.当可执行文件中的程序被加载入内存时,这些数据也同时被夹在如内存中.与此同时,我们要处理的数据也就自然而然的获得了存储空间.

程序6.1
assume cs:code
code segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hmov bx,0mov ax,0mov cx,8s:add ax,cs:[bx]add bx,2loop smov ax,4c00hint 21h
code ends
end

程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢?由于他们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以可以从CS中得到他们的段地址.他们的偏移地址是多少呢?因为用dw定义的数据处于代码段的最开始,所以偏移地址为0,这8个数据就在代码段的偏移0,2,4,6,8,A,C,E处.程序运行时,他们的地址就是CS:0,…CS:E.

怎么样执行程序中的指令呢?用Debug加载后,可以将IP设置为10h,从而使CS:IP指向程序的第一条指令.然后再用t命令,p命令或者是g命令执行.

可是这样一来,我们就必须用Debug来执行程序.程序6.1编译,连接成可执行文件后,在系统中直接运行可能会出现问题,因为程序的入口处不是我们所希望执行的指令.如何让这个程序在编译连接后可以在系统中直接运行呢?我们可以在源程序中指明程序的入口所在.

从前面的课程中,我们已经知道了在单任务系统中,可执行文件的程序执行过程如下:

  1. 有其他的程序,将可执行文件的程序加载入内存
  2. 设置CS:IP指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行
  3. 程序运行结束后,返回到加载者

归根结底,我们若要CPU从何处开始执行程序,只要在原程序中用"end标号"指明就行了.

6.2 在代码段中使用栈

我们首先要有一段可当作栈的内存空间.如前所述,这段空间应该由系统来分配.可以在程序中通过定义数据来取得一段空间,然后将这段空间当做栈空间来用.程序如下:

assume cs:codesg
codesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0,0,0,0start: mov ax,csmov ss,axmov sp,30hmov bx,0mov cx,8s:push cs:[bx]add bx,2loop smov bx,0mov cx,8s0:pop cs:[bx]add bx,2loop s0mov ax,4c00hint 21h
codesg ends
end start

我们将要cs:10~cs:2F的内存空间当做栈来用,初始状态下栈为空,所以ss:sp要指向栈底,则设置ss:sp指向cs:30.

6.3 将数据,代码,栈放入不同的段

在前面的内容中我们在程序中用到了数据和栈,将数据,栈和代码都放到了一个段里面.我们在编程的时候要注意何处是数据,何处是栈,何处是代码.这样做显然有两个问题:

  1. 把它们放到一个段中使得程序先得混乱
  2. 前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题.但如果数据,栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都是这样)

所以,应该考虑用多个段来存放数据,代码和栈

程序6.4
assume cs:code,ds:data,ss:stack
data segmentdw 0123h,0456h,0789h,0defh,0feedh,0cbah,0987h
data ends
stack segmentdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
stack ends
code segment
start:  mov ax,stackmov ss,axmov sp,20hmov ax,datamov ds,axmov cx,8s:   push [bx]add bx,2loop smov bx,0mov cx,8s0:  pop[bx]add bx,2loop s0mov ax,4c00hint 21hcode ends
end start

开发日记-20190914 关键词 汇编语言王爽版 第六章相关推荐

  1. 开发日记-20190914 关键词 汇编语言王爽版 第四章

    第四章 第一个程序 4.1 一个源程序从写出到执行的过程 第一步:编写汇编源程序 使用文本编辑器,用汇编语言编写汇编源程序 这一步工作的结果是产生一个储存源程序的文本文件. 第二步:对源程序进行编译程 ...

  2. 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章

    第七章 更灵活的定位内存地址的方法 7.1 and和or指令 (1)and指令:逻辑与指令,按位进行与运算 (2)or指令:逻辑或指令,按位进行或运算 7.2 关于ASCII码 一个文本编辑过程中,就 ...

  3. 开发日记-20190914 关键词 汇编语言王爽版 第五章

    第五章 [BX]和loop指令 5.2 Loop指令 loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作, (cx)=(cx)-1 判断cx中的值,不为零则转至标号处执行 ...

  4. 开发日记-20190914 关键词 汇编语言王爽版 第三章

    第三章 寄存器(内存访问) 3.1 内存中字的存储 CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低八位存放低位字节.在内存存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字 ...

  5. 开发日记-20190914 关键词 汇编语言王爽版 第二章

    第二章 寄存器 一个典型的CPU由运算器,控制器,寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连.前一章所说的总线,相对于CPU内部来说是外部总线.内部中心实现CPU内部各个器件之间的联系 ...

  6. 开发日记-20190915 关键词 汇编语言王爽版 第十一章

    第十一章 标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同)具有以下三种作用. (1)用来存储相关的指令的某些执行结果 (2)用来为CPU执行相关的指令提供 ...

  7. 开发日记-20190915 关键词 汇编语言王爽版 第十三章

    第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...

  8. 开发日记-20190915 关键词 汇编语言王爽版 第十章

    第十章 CALL和RET指令 call 和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP.他们经常被共同用来实现子程序的设计. 10.1 ret和retf ret指令用栈中的数据,修改I ...

  9. 开发日记-20190915 关键词 汇编语言王爽版 第九章

    第九章 转移指令的原理 可以修改IP或同事修改CS和IP和指令统称为转移指令.概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令. 8086CPU的转移行为有以下几类: 只修改IP时,称为段 ...

最新文章

  1. 面试题31.连续子数组的最大和
  2. 室外定位_为什么老师应该走出自己的舒适区而进入室外
  3. 字符流中第一个只出现一次的字符
  4. 奇妙的数字 小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?
  5. unity安装到一半失败
  6. mysql +cobar_Cobar源码解析(一)
  7. 【Matlab函数知识点合集】新手入门第十四天
  8. 为什么感觉现在电脑病毒少了?
  9. (转)罗振宇跨年演讲:哪来直接登顶的人生,只有不断迭代的历程
  10. wps教鞭功能_你未必知道的WPS神奇功能
  11. JAVA一些方法技巧
  12. TensorFlowX.Y核心基础与AI模型设计开篇
  13. java中fido_一文读懂华为FIDO2指纹/3D 面容登录技术
  14. 【从零开始学微服务】01.微服务的过去与现在
  15. Win10安装ST-Link驱动
  16. python抽奖简单小程序游戏_用Python做个年会抽奖小程序吧
  17. 情人节!原来程序员也可以那么浪漫!
  18. 从原生到黑科技:闲鱼 Flutter 图片优化经历了什么?
  19. 构建统一平台消除“数据烟囱”“信息孤岛”
  20. linux中 ex是什么命令,Linux ex命令

热门文章

  1. SpringCloud中Feign的适配器的实现方案
  2. 第三讲,我们来谈谈:“二进制的负数”
  3. curl命令查看耗时
  4. case when判断大于某值_Python 代码判断逻辑太复杂?这里有几条最佳实践和技巧...
  5. 电脑耳机声音小怎么调大_录自媒体vlog视频声音小怎么办,看兰哥怎样不花钱就解决...
  6. python两台电脑文件传输_python实现简单socket程序在两台电脑之间传输消息的方法...
  7. mysql int 默认值 为ull_mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题...
  8. linux 下编写.sh文件,不间断执行某文件
  9. Java性能优化推荐书!RocketMQ消息丢失场景及解决办法
  10. 今晚我们通宵学习SpringCloud!涨姿势!