汇编语言05——包含多个段的程序

2024-09-01 04:08
文章标签 程序 汇编语言 05 多个

本文主要是介绍汇编语言05——包含多个段的程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

整理自fishcc论坛


安全的空间

通常来说,0:200~0:300这段空间是相对安全的,操作系统通常不会去占用

但这只有256个字节,当需要更多空间时,可以向操作系统申请


问题:

编程计算以下8个数据的和,结果存在ax 寄存器中:

0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H


程序:

assume cs:codesgcodesg 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
codesg endsend

程序中的指令就要对这8个数据进行累加,可这8个数据在哪里呢?

由于它们在代码段中,程序在运行的时候CS中存放代码段的段地址,所以我们可以从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。(待上机验证……)(无法正常运行的...木有入口)

程序中,我们用bx存放加2递增的偏移地址,用循环来进行累加。

在循环开始前,设置(bx)=0,cs:bx指向第一个数据所在的字单元。

每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在的字单元。
我们将前面的程序6.1编译、连接为可执行文件p61.exe,先不要运行,我们用debug加载查看一下。


程序第一行中的 “dw”的含义是定义字型数据。dw即define word。

在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。


如何让这个程序在编译后可以存系统中直接运行呢?

我们可以在源程序中指明界序的入口所在,具体做法见下面的程序6.2。

assume cs:codesgcodesg segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:  mov bx,0mov ax,0mov cx,8
s:      add ax,cs:[bx]add bx,2loop smov ax,4c00hint 21h
codesg endsend start

注意在程序6.2中加入的新内容,我们在程序的第一条指令的前面加上了一个标号start,而这个标号在伪指令end的后面出现。

 

探讨end的作用:

end 除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。

有了这种方法,我们就可以这样来安排程序的框架:

assume cs:code

code segment
:
数据
:
start:
:
代码
:
code ends

end start




 

在代码段中使用栈

 

完成下面的程序,利用栈,将程序中定义的数据逆序存放。

assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

?

code ends

end

 

程序思路

程序的思路大致如下:

程序运行时,定义的数据存放在cs:0~cs:15单元中,共8个字单元。依次将这8个字单元中的数据入栈,然后再依次出栈到这8个字单元中,从而实现数据的逆序存放。

问题是,我们首先要有一段可当作栈的内存空间。如前所述,这段空间应该由系统来分配。

我们可以在程序中通过定义数据来取得一段空间,然后将这段空间当作栈空间来用。

 

assume cs:codesg
codesg segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hdw 0,0,0,0,0,0,0,0  ;用dw定义8个字型数据,在程序加载后,将取得8个字的;内存空间,存放这8个数据。我们在后面的程序中将这段;空间当作栈来使用。
start:  mov ax,cs		mov ss,axmov sp,32		    ;设置栈顶ss:sp指向cs:32mov bx,0mov cx,8
s:      push cs:[bx]add bx,2loop s			    ;以上将代码段0~16单元中的8个字型数据依次入栈mov bx,0mov cx,8
s0:     pop cs:[bx]add bx,2loop s0	            ;以上依次出栈8个字型数据到代码段0~16单元中mov ax,4c00hint 21h
codesg endsend start			;指明程序的入口在start处

 

注意程序6.3中的指令:

mov ax,cs

mov ss,ax

mov sp,32

我们要讲 cs:16 ~ cs:31 的内存空间当作栈来用,初始状态下栈为空,所以 ss:sp要指向栈底,则设置ss:sp指向cs:32。

 

比如对于:dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H

我们可以说,定义了8个字型数据。

也可以说,开辟了8个字的内存空间,这段空间中每个字单元中的数据依次是:

0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。

因为它们最终的效果是一样的。


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

在前面的内容中,我们在程序中用到了数据和栈,我们将数据、栈和代码都放到了一个段里面。我们在编程的时候要注意何处是数据,何处栈,何处是代码。

 

这样做显然有两个问题:

(1)把它们放到一个段中使程序显得混乱;

(2)前面程序中处理的数据很少,用到的栈空间也小,加上没有多长的代码,放到一个段里面没有问题。

但如果数据、栈和代码需要的空间超过64KB,就不能放在一个段中(一个段的容量不能大于64 KB,是我们在学习中所用的8086模式的限制,并不是所有的处理器都这样)。所以,我们应该考虑用多个段来存放数据、代码和栈。

 

怎样做呢?

我们用和定义代码段一样的方法来定义多个段,然后在这些段里面定义需要的数据,或通过定义数据来取得栈空间。

具体代码如下:

assume cs:code,ds:data,ss:stack


data segment
dw 0123H,0456H,0789H,0defH,0fedH,0cbaH,0987H,1213H
data ends


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


code segment
start:mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
s:push [bx]
add bx,2
loop s

mov bx,0
mov cs,8
s0:pop [bx]
add bx,2
loop s0

mov ax,4c00h
int 21h
code ends
end start

程序中“data”段中的数据“0abch”的地址就是:data:6。

我们要将它送入bx中,就要用如下的代码:

mov ax,data

mov ds,ax

mov bx,ds:[6]

我们不能用下面的指令:

mov ds,data

mov ax,ds:[6]

 

其中指令“mov ds,data” 是错误的,因为8086CPU不允许将一个数值直接送入段寄存器中。

程序中对段名的引用,如指令“mov ds,data”中的“data”,将被编译器处理为一个表示段地址的数值。

“代码段”、“数据段”、“栈段”完全是我们的安排。

 

一、我们在源程序中为这三个段起了具有含义的名称,用来存放数据的段我们将其命名为“data”,用来放代码的段我们将其命名为“code”,用来作栈空间的命名为“stack”。

 

二、我们在源程序中用伪指令

“assume cs:code,ds:data,ss:stack”将cs、ds和ss分别和code、data、stack段相连。

这样做了之后,CPU不会将 cs指向 code,ds 指向 data,ss 指向stack,

 

三、若要CPU按照我们的安排行事,就要用机器指令控制它,源程序中的汇编指令是CPU要执行的内容。

那么,CPU如何知道去执行它们?

我们在源程序的最后用“end start”说明了程序的入口,这个入口将被写入可执行文件的描述信息,可执行文件中的程序被加载入内存后,CPU的CS:IP被设置指向这个入口,从而开始执行程序中的第一条指令。

标号“start”在“code”段中,这样CPU就将code段中的内容当作指令来执行了。

 

我们在code段中,使用指令:

mov ax,stack

mov ss,ax

mov sp,16

设置ss指向stack,设置ss:sp指向stack:16, CPU 执行这些指令后,将把stack段当做栈空间来用。

CPU若要访问data段中的数据,则可用 ds 指向 data 段,用其他的寄存器(如:bx)来存放 data段中数据的偏移地址。

 

总之,CPU到底如何处理我们定义的段中的内容,是当作指令执行,当作数据访问,还是当作栈空间,完全是靠程序中具体的汇编指令,和汇编指令对CS:IP、SS:SP、DS等寄存器的设置来决定的。







这篇关于汇编语言05——包含多个段的程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125900

相关文章

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟 开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚 第一站:海量资源,应有尽有 走进“智听

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

忽略某些文件 —— Git 学习笔记 05

忽略某些文件 忽略某些文件 通过.gitignore文件其他规则源如何选择规则源参考资料 对于某些文件,我们不希望把它们纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。通常它们都是些自动生成的文件,比如日志文件、编译过程中创建的临时文件等。 通过.gitignore文件 假设我们要忽略 lib.a 文件,那我们可以在 lib.a 所在目录下创建一个名为 .gi

《x86汇编语言:从实模式到保护模式》视频来了

《x86汇编语言:从实模式到保护模式》视频来了 很多朋友留言,说我的专栏《x86汇编语言:从实模式到保护模式》写得很详细,还有的朋友希望我能写得更细,最好是覆盖全书的所有章节。 毕竟我不是作者,只有作者的解读才是最权威的。 当初我学习这本书的时候,只能靠自己摸索,网上搜不到什么好资源。 如果你正在学这本书或者汇编语言,那你有福气了。 本书作者李忠老师,以此书为蓝本,录制了全套视频。 试

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例

系列文章目录 1.基于SSM的洗衣房管理系统+原生微信小程序+LW参考示例 2.基于SpringBoot的宠物摄影网站管理系统+LW参考示例 3.基于SpringBoot+Vue的企业人事管理系统+LW参考示例 4.基于SSM的高校实验室管理系统+LW参考示例 5.基于SpringBoot的二手数码回收系统+原生微信小程序+LW参考示例 6.基于SSM的民宿预订管理系统+LW参考示例 7.基于

Spring Roo 实站( 一 )部署安装 第一个示例程序

转自:http://blog.csdn.net/jun55xiu/article/details/9380213 一:安装 注:可以参与官网spring-roo: static.springsource.org/spring-roo/reference/html/intro.html#intro-exploring-sampleROO_OPTS http://stati