包含多个段的程序

news2024/11/17 17:29:19

文章目录

  • 包含多个段的程序
    • 在代码段中使用数据
    • 在代码段中使用栈
    • 将数据、代码、栈放入不同的段

包含多个段的程序

在代码段中使用数据

考虑这样一个问题,编程计算以下8个数据的和,结果存在ax 寄存器中:0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H。

代码:

assume cs:codesg
codesg segment
	dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  	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”的含义是定义字型数据。dw即define word。在这里,我们使用dw定义了8个字型数据(数据之间以逗号分隔),它们所占的内存空间的大小为16个字节。

这8 个数据在代码段的偏移地址为0、2、4、6、8、A、C、E处。

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

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

每次循环中(bx)=(bx)+2,cs:bx指向下一个数据所在的字单元。

请添加图片描述

查看内存单元地址可得cs:ip指向第一个字单元,此字单元被我们用来存储数据,计算机却误认为这是代码并从此处开始执行。

请添加图片描述

再次查询偏移地址为16的内存空间,这次得到的才是我们真正要执行的代码。

为了解决上述问题,我们可以给代码段添加一个开始标识符

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

再次调式可得程序会从偏移地址为16的位置开始执行代码。

在代码段中使用栈

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

代码示例:利用栈,将程序中定义的数据逆序存放

assume cs: codesg
codesg segment
	dw 0123h,0456h,0789h,0abch,0defh, 0fedh,0cbah,0987h
	dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
					;用dw定义16个字型数据,在程序加载后,将取得16 个字的
					;内存空间,存放这16个数据。在后面的程序中将这段
					;空间当作栈来使用
start:  mov ax,cs 
        mov ss,ax 
        mov sp,30h   ;将设置栈顶ss:sp指向cs:30
        
        mov bx,0
		mov cx,8
	
s:		push cs:[bx]
        add bx,2
        loop s		;以上将代码段0~15单元中的8个字型数据依次入栈
      
      	mov bx,0
        mov cx,8
s0: 	pop cs:[bx]
    	add bx,2
    	1oop s0		;以上依次出栈8个字型数据到代码段0~15单元中

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

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

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

这样做显然有两个问题:

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

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

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

代码示例

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

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

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

code segment
    start:  mov ax,stack
    		mov ss,ax
    		mov sp,20h		;设置栈顶ss:sp指向 stack:20
    		mov ax,data
            mov ds,ax		;ds指向data段
            mov bx,0		;ds:bx指向data段中的第一个单元
            
            mov cx,8 
    s:      push [bx]
            add bx, 2 
            loop s		;以上将data段中的0~15单元中的8个字型数据依次入栈
            
            mov bx,0
            mov cx,8 
    s0:		pop [bx]
            add bx,2
    		loop s0		;以上依次出栈8个字型数据到data段的0~15单元中
            
            mov ax,4c00h
            int 21h
code ends
end start

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1541882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中性点接地问题的matlab仿真与分析

1、内容简介 略 81-可以交流、咨询、答疑 2、内容说明 略电力系统的中性点接地方式通常是按电压等级 的高低来进行选取的, 我国中压电网普遍采用的有 3 种方式 :不接地 、经消弧线圈接地和经电阻接地。 电力系统在正常运行时, 对不同的中性点接地方式及其差异, 基本上没有…

海外媒体宣发:十大国外中文网站-大舍传媒

十大国外中文网站 1、欧洲时报 覆盖欧洲且较具影响力的华文媒体 国外中文新闻网站,欧洲时报文化传媒集团旗舰日报《欧洲时报》旗下官方网站,总部设在法国巴黎,创刊于1983年,现已成为唯一发行覆盖全欧、发行量最大、最具影响力的华…

ubuntu上一款好用的串口工具screen

看名字,你猜他是什么? 安装 sudo apt install screen 然后将USB串口接到虚拟机,执行dmesg命令查看串口设备名: 测试: sudo screen /dev/ttyUSB0 115200确实很简单。

Python入门(七)

递归 递归是函数调用其自身的操作。递归源自数学归纳法。数学归纳法(Mathematical Induction)是一种数学证明方法,常用于证明命题在自然数范围内成立。 计算1到100的和: def gaussian_sum(n): if n 1: return 1 else: return …

Spring Boot集成zxing实现生成二维码功能

1.二维码介绍 二维码QR Code(Quick Response Code) 由Denso公司于1994年9月研制的一种矩阵二维码符号,它具有一维条码及其它二维条码所具有的信息容量大、可靠性高、可表示汉字及图象多种文字信息、保密防伪性强等优点。 ZXing 一个支持在图像中解码和生成条形码(如…

项目1-加法计算器

1.创建项目 2.导入前端代码 2.1 static包内 2.2 测试前端代码是否有误 显示成功说明无误 2.3 定义用户接口 请求路径:calc/sum 请求方式:GET/POST 接口描述:计算两个整数相加 请求参数: 参数名类型是否必须备注num1Integer是参与计算的第…

代码随想录算法训练营Day56 ||leetCode 583. 两个字符串的删除操作 || 72. 编辑距离

647. 回文子串 dp[i][j]表示第i位开始&#xff0c;第j位结束的字符串是否为回文串 class Solution { public:int countSubstrings(string s) {vector<vector<bool>> dp(s.size(), vector<bool>(s.size(), false));int result 0;for (int i s.size() - 1…

【WEEK4】 【DAY5】AJAX - Part Two【English Version】

2024.3.22 Friday Following the previous article 【WEEK4】 【DAY4】AJAX - Part One【English Version】 Contents 8.4. Ajax Asynchronous Data Loading8.4.1. Create User.java8.4.2. Add lombok and jackson support in pom.xml8.4.3. Change Tomcat Settings8.4.4. Mo…

深入探索C语言动态内存分配:释放你的程序潜力

&#x1f308;大家好&#xff01;我是Kevin&#xff0c;蠢蠢大一幼崽&#xff0c;很高兴你们可以来阅读我的博客&#xff01; &#x1f31f;我热衷于分享&#x1f58a;学习经验&#xff0c;&#x1f3eb;多彩生活&#xff0c;精彩足球赛事⚽ &#x1f31f;感谢大家的支持&#…

Rust egui(3) 增加多个tab

话说不知道咋写&#xff0c;要不直接上git patch吧。代码都是移植的官方demo&#xff0c;核心改动就是把原来的line_demo换成了plot_demo&#xff0c;里面实现多个ui&#xff0c;然后点击tab标题会切换不同的ui。 如下图&#xff0c;Lines和Markers两个不同的标签对应不同的ui。…

基于Google云原生工程师的kubernetes最佳实践(二)

目录 二、应用部署篇 为deployment打上丰富的label,以便selecting 使用sidecar容器部署agent、proxy等组件 使用init container处理依赖关系,而不要用sidecar 镜像tag使用版本号,不要用latest或空tag 为pod设置readiness和liveness探针 不要给所有服务都使用LoadBalance…

eNSP实验一(静态)

目录 命名更改 子网划分 配置IP DHCP配置 配置静态路由 NET设置 Telnet及端口映射 浮动静态路由 命名更改 <Huawei>system-view Enter system view, return user view with CtrlZ. [Huawei]sysname R1 [R1] 1、R6为ISP&#xff0c;接口IP地址均为公有地址(12.0…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端&#xff0c;支持打包为安卓&#xff0c;苹果&#xff0c;小程序。包括文章模块&#xff0c;用户模块&#xff0c;支付模块&#xff0c;聊天模块&#xff0c;商城模块等基础功能&#xff0c;包含VIP会员&#xff0c;付费阅读等收费体系&#xff0c…

蓝桥杯第十五届抱佛脚(二)竞赛中的数据结构

蓝桥杯第十五届抱佛脚&#xff08;二&#xff09;内置数据结构 文章目录 蓝桥杯第十五届抱佛脚&#xff08;二&#xff09;内置数据结构在竞赛中常见的数据结构数组(Array)链表(Linked List)栈(Stack)队列(Queue)树(Tree)映射(Map) 内置数据结构的快速使用迭代器&#xff08;It…

stm32知识总结--简单复习各部件

目录 内部结构 部件介绍 配置步骤 之前学了很多部件&#xff0c;配置了很多参数&#xff0c;但是没有很系统地把他们连接在一起&#xff0c;今天这个图里简洁描述了资源与资源之间的关系。 内部结构 部件介绍 黑框部分为CPU、内部有一个内核专门处理事件&#xff0c;所有的…

【Node.js】zlib

gzip 和 deflate 的基本使用 const zlib require("zlib"); const fs require(fs)// 压缩 1. createGzip .gz 2. createDeflate .deflate // const readStream fs.createReadStream(index.txt) // const writeStream fs.createWriteStream(index.txt.gz) // rea…

更换 Jenkins 插件下载源(解决 Jenkins 插件安装失败)【图文详细教程】

Jenkins 插件安装失败的情况 这里提一下&#xff0c;Jenkins 插件安装失败&#xff0c;不一定是下载源的问题&#xff0c;还有可能你下载的 Jenkins 的版本与插件的版本不匹配&#xff0c;Jenkins 的版本较低&#xff0c;而安装的插件是为新的 Jenkins 版本准备的&#xff0c;此…

web CSS笔记1

CSS(Cascading Style Sheets) 美化样式 CSS通常称为CSS样式表或层叠样式表&#xff08;级联样式表&#xff09;&#xff0c;主要用于设置HTML页面中的文本内容&#xff08;字体、大小、对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式、边距等&#xff09;以及…

前端学习之用css和html做一个仿淘宝的导航栏

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>仿淘宝界面案例</title><style>/* 最外层盒子 */.container{width: 270px;height: 385px;border: 1px solid rgb(255, 208, 0);bord…

探秘 RabbitMQ 的设计理念与核心技术要点

目录 一、消息中间件介绍 1.1 消息中间件的作用 二、RabbitMQ 2.1 核心概念 2.2 生产者发送消息过程 2.3 消费者接收消息过程 2.4 RabbitMQ 为何要引入信道(channel) 2.5 消费模式 一、消息中间件介绍 消息队列中间件&#xff08;message queue middleWare, MQ&#xff09;指…