开发日记-20190914 关键词 汇编语言王爽版 第六章
第六章 包含多个段的程序
前面的程序中,只有一个代码段.现在有一个问题是,如果程序需要用其他空间来存放数据,使用哪里呢?在第五章中,我们说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编译,连接成可执行文件后,在系统中直接运行可能会出现问题,因为程序的入口处不是我们所希望执行的指令.如何让这个程序在编译连接后可以在系统中直接运行呢?我们可以在源程序中指明程序的入口所在.
从前面的课程中,我们已经知道了在单任务系统中,可执行文件的程序执行过程如下:
- 有其他的程序,将可执行文件的程序加载入内存
- 设置CS:IP指向程序的第一条要执行的指令(即程序的入口),从而使程序得以运行
- 程序运行结束后,返回到加载者
归根结底,我们若要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 将数据,代码,栈放入不同的段
在前面的内容中我们在程序中用到了数据和栈,将数据,栈和代码都放到了一个段里面.我们在编程的时候要注意何处是数据,何处是栈,何处是代码.这样做显然有两个问题:
- 把它们放到一个段中使得程序先得混乱
- 前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题.但如果数据,栈和代码需要的空间超过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 关键词 汇编语言王爽版 第六章相关推荐
- 开发日记-20190914 关键词 汇编语言王爽版 第四章
第四章 第一个程序 4.1 一个源程序从写出到执行的过程 第一步:编写汇编源程序 使用文本编辑器,用汇编语言编写汇编源程序 这一步工作的结果是产生一个储存源程序的文本文件. 第二步:对源程序进行编译程 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第七章第八章
第七章 更灵活的定位内存地址的方法 7.1 and和or指令 (1)and指令:逻辑与指令,按位进行与运算 (2)or指令:逻辑或指令,按位进行或运算 7.2 关于ASCII码 一个文本编辑过程中,就 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第五章
第五章 [BX]和loop指令 5.2 Loop指令 loop指令的格式是:loop标号,CPU执行loop指令的时候,要进行两步操作, (cx)=(cx)-1 判断cx中的值,不为零则转至标号处执行 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第三章
第三章 寄存器(内存访问) 3.1 内存中字的存储 CPU中,用16位寄存器来存储一个字.高8位存放高位字节,低八位存放低位字节.在内存存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字 ...
- 开发日记-20190914 关键词 汇编语言王爽版 第二章
第二章 寄存器 一个典型的CPU由运算器,控制器,寄存器(CPU工作原理)等器件构成,这些器件靠内部总线相连.前一章所说的总线,相对于CPU内部来说是外部总线.内部中心实现CPU内部各个器件之间的联系 ...
- 开发日记-20190915 关键词 汇编语言王爽版 第十一章
第十一章 标志寄存器 CPU内部的寄存器中,有一种特殊的寄存器(对于不同的处理器,个数和结构都可能不同)具有以下三种作用. (1)用来存储相关的指令的某些执行结果 (2)用来为CPU执行相关的指令提供 ...
- 开发日记-20190915 关键词 汇编语言王爽版 第十三章
第十二章 内中断 任何一个通用的CPU,比如8086,都具备一种能力,可以在执行完当前正在执行的指令之后,检测到从CPU外部传送过来或内部产生的一种特殊信息,并且可以立即对所接收的信息进行处理.这种特 ...
- 开发日记-20190915 关键词 汇编语言王爽版 第十章
第十章 CALL和RET指令 call 和ret指令都是转移指令,他们都修改IP,或同时修改CS和IP.他们经常被共同用来实现子程序的设计. 10.1 ret和retf ret指令用栈中的数据,修改I ...
- 开发日记-20190915 关键词 汇编语言王爽版 第九章
第九章 转移指令的原理 可以修改IP或同事修改CS和IP和指令统称为转移指令.概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令. 8086CPU的转移行为有以下几类: 只修改IP时,称为段 ...
最新文章
- 面试题31.连续子数组的最大和
- 室外定位_为什么老师应该走出自己的舒适区而进入室外
- 字符流中第一个只出现一次的字符
- 奇妙的数字 小明发现了一个奇妙的数字。它的平方和立方正好把0~9的10个数字每个用且只用了一次。你能猜出这个数字是多少吗?
- unity安装到一半失败
- mysql +cobar_Cobar源码解析(一)
- 【Matlab函数知识点合集】新手入门第十四天
- 为什么感觉现在电脑病毒少了?
- (转)罗振宇跨年演讲:哪来直接登顶的人生,只有不断迭代的历程
- wps教鞭功能_你未必知道的WPS神奇功能
- JAVA一些方法技巧
- TensorFlowX.Y核心基础与AI模型设计开篇
- java中fido_一文读懂华为FIDO2指纹/3D 面容登录技术
- 【从零开始学微服务】01.微服务的过去与现在
- Win10安装ST-Link驱动
- python抽奖简单小程序游戏_用Python做个年会抽奖小程序吧
- 情人节!原来程序员也可以那么浪漫!
- 从原生到黑科技:闲鱼 Flutter 图片优化经历了什么?
- 构建统一平台消除“数据烟囱”“信息孤岛”
- linux中 ex是什么命令,Linux ex命令
热门文章
- SpringCloud中Feign的适配器的实现方案
- 第三讲,我们来谈谈:“二进制的负数”
- curl命令查看耗时
- case when判断大于某值_Python 代码判断逻辑太复杂?这里有几条最佳实践和技巧...
- 电脑耳机声音小怎么调大_录自媒体vlog视频声音小怎么办,看兰哥怎样不花钱就解决...
- python两台电脑文件传输_python实现简单socket程序在两台电脑之间传输消息的方法...
- mysql int 默认值 为ull_mysql的 约束 数据库设计 数据库 存储 触发器 mysql 权限问题...
- linux 下编写.sh文件,不间断执行某文件
- Java性能优化推荐书!RocketMQ消息丢失场景及解决办法
- 今晚我们通宵学习SpringCloud!涨姿势!