【汇编语言】第六章 包含多个段的程序
前言
最近学了王爽教授写的《汇编语言》,整理一下学习笔记。
6.1 在代码段中使用数据
我们在之前的学习中都是用的内存单元中的数据,并没有很好的关注到数据本身,今天我们来具体说一下数据,先看这个问题:
编程计算下面8个数据的和,结果存在ax寄存器中:
0123h、0456h、0789h、0abch、0defh、0fedh、0cbah、0987h。
在处理这些数据之前首先是要将这些数据存储在一组地址连续的内存单元中,我们可以用指令一个个存储,但是存哪里呢?从规范的角度来讲,我们是不能自己随便决定存哪里的,应该让系统为我们分配,可要怎么做呢?话不多说,上代码:
看一下上面的代码:
dw,是定义字型数据,即“define word”。
在这里用dw 定义了8个字型数据,它们所占的内存空间的大小为16个字节。它们在代码段中,程序在运行时CS中存放代码段的段地址,dw定义的数据处于代码段的最开始,所以偏移地址为0,这8个数据就在代码段的偏移0、2、4、6、8、A、C、E处。
程序中bx存放加2递增的偏移地址,用循环来进行累加。让我们用Debug来跟踪一下:
从图中我们可以看出,DS=075A,程序从 076A: 0000 开始存放,但是当我们用u命令查看程序中的内容时发现,都是一些我们看不懂的指令,那我们写的程序去哪了呢?
是这样的,在程序之前有一个代码段,在代码中,前面的16个字节用来存放我们用dw 定义的数据,从第16个字节开始才是汇编指令所对于的机器码。
用d命令可以更清楚地查看程序中前16个字节的内容:
从076A: 0010查看程序中要执行的机器指令。
但是问题来了,现在CS: IP指向我们定义的数据段,而指令在代码段,所以我们还要设置IP为10h,从而使CS: IP 指向程序中的第一条指令。但这样一来的话,我们就必须用Debug来执行程序,若是直接执行程序,可能会出现问题。所以我们希望有一个入口直接通往我们执行的指令:
我们在程序中加了新内容,在第一条指令的前面加上了一个标号 start,在伪指令end后面同样加了这个标号。所以现在我们知道,end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。
现在我们来探讨一下原理性的问题,就是说,CPU如何知道哪一条指令是程序的第一条要执行的指令?
可执行文件由描述信息和程序组成,程序来源于源程序中的汇编指令和定义的数据,描述信息则主要是编译、连接程序对源程序中相关伪指令进行处理所得到的信息。我们在程序中用伪指令end描述了程序的结束和程序的入口。在编译、连接后,由 “end start” 指明程序入口,被转化为一个入口地址,存储在可执行文件的描述信息中,当程序被加载入内存之后,加载者从程序的可执行文件的描述信息中读到程序的入口地址,设置CS: IP。这样CPU就从我们希望的地址处开始执行。
6.2 在代码中使用栈
我们在存储定义的数据的时候,都是按顺序存放,但是因为种种原因,我们需要将这些数据逆序存放。我们可以利用栈来完成它,通过对这些数据入栈、出栈,从而实现数据的逆序存放。
我们将cs: 10~cs: 2F的内存空间当作栈来使用,初始状态下栈为空,所以要将ss: sp指向栈底,设置ss: sp指向cs: 30。
在代码段中定义了16个字型数据,数值都是0,程序加载后,将用32个字节空间来存放它们。所以我们在描述dw的作用时,可以说用它定义数据,也可以说用它开辟内存空间。
6.3 将数据、代码、栈放入不同的段
在前面的学习中,我们一直都是将代码、数据和栈放在了一个段里面,这样会显得程序很乱,而且当数据、代码和栈需要的容量超过一个段容量时,就不能将它们在放在一个段中了。所以说对于上一小节的问题,我们再更深地考虑一下:
从上面的程序中我们可以看到我们用了三个不同的段来分别放入代码,数据和栈,code段,data段,stack段。每个段名就相当于一个标号,代表段地址。这种定义只是我们的安排,CPU并不能理解,那它是怎么按照我们的安排工作呢?
CPU通过start入口找到我们的代码段,然后再通过我们指令中设定的ss:sp指向和ds指向决定哪个是栈段,哪个是数据段。也就是说,CPU完全靠程序中的指令,以及指令对CS: IP、SS: SP、DS等寄存器的设置来决定如何处理我们定义的段中的内容。
总结
以上为本人学习汇编语言时的摘录总结,主要内容来源于汇编语言(第四版) 王爽 著,大家若是感兴趣可以看看原书,很值得推荐,以上内容如果有什么错误的话,还请大家指正!
__EOF__

本文链接:https://www.cnblogs.com/Seversan-Sickle/p/17228241.html
关于博主:编程小萌新一名,希望从今天开始慢慢提高,一步步走向技术的高峰!
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix