《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序
《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序
- 题目1
- 题目2
- 题目3
- 题目4
- 题目5
- 题目6
- 总结
题目1
将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题
assume cs:code, ds:data, ss:stack
data segmentdw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h ; 占16字节
data endsstack segmentdw 1,2,3,4,5,6,7,8 ; 占16字节
stack endscode segmentstart: mov ax, stack ; 获取栈段mov ss, ax ; 设置栈段mov sp, 16 ; 设置栈顶 ss:spmov ax, datamov ds, ax ; ds 指向 data 段push ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax, 4c00h int 21h
code ends
end start
- CPU 执行程序,程序返回前,data 段中的数据为多少?
答:数据没变。先入后出,保持了顺序。 - CPU 执行程序,程序返回前,cs= 076E 、ss= 076D 、ds= 076C 。
- 设程序加载后,code 段的段地址为 X,则 data 段的段地址为= X-2 ,stack 段的段地址为 X-1 。
题目2
将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题
assume cs:code, ds:data, ss:stack
data segmentdw 0123h,0456h
data endsstack segmentdw 1,2
stack endscode segmentstart: mov ax, stack ; 获取栈段mov ss, ax ; 设置栈段mov sp, 16 ; 设置栈顶 ss:spmov ax, datamov ds, ax ; ds 指向 data 段push ds:[0]push ds:[2]pop ds:[2]pop ds:[0]mov ax, 4c00h int 21h
code ends
end start
- CPU 执行程序,程序返回前,data 段中的数据为多少?
答:数据没变。先入后出,保持了顺序。 - CPU 执行程序,程序返回前,cs= 076E 、ss= 076D 、ds= 076C 。
- 设程序加载后,code 段的段地址为 X,则 data 段的段地址为= X-2 ,stack 段的段地址为 X-1 。
- 对于如下定义的段:如果段中的数据占N 个字节,则程序加载后,该段实际占有的空间为
n % 16 ? n + (16 - n % 16) : n
字节。
到网上看到别人的公式( N/16+1) * 16
,但当正好是16的倍数时,这个公式显示与观察到的效果不符。
name segment
...
name ends
观察程序加载后CX=0042与题目1中相同,可知虽然只声明了4个字节,但是系统还是按16字节分配了内存。
可以看到数据段
和栈段
都是16字节
。代码段
从076C:0020开始。
看下通过观察推测的结果:
[...Array(9527).keys()].map(n => `${n} = ${n % 16 ? n + (16 - n % 16) : n}`)
题目3
将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题
- CPU 执行程序,程序返回前,data 段中的数据为多少?
答:数据没变。先入后出,保持了顺序。 - CPU 执行程序,程序返回前,cs= 076C 、ss= 0770 、ds= 076F 。
- 设程序加载后,code 段的段地址为 X,则 data 段的段地址为= X+3 ,stack 段的段地址为 X+4 。
题目4
如果将(1)、(2)、(3)题中的最后一条伪指令“end start”改为“end”(也就是说不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。
答: 题目3的代码可以正常执行,因为代码段正好在程序开头。CS:IP指向第一行指令。
题目5
程序如下,编写 code 段中的代码,将 a
段和 b
段中的数据依次相加,将结果存到c
段中。
assume cs:codea segmentdb 1, 2, 3, 4, 5, 6, 7, 8 ; 占16字节
a endsb segmentdb 1, 2, 3, 4, 5, 6, 7, 8 ; 占16字节
b endsd segmentdb 0, 0, 0, 0, 0, 0, 0, 0 ; 占16字节
d endscode segment
start: mov ax, amov ds, axmov bx, 0 ; i = 0mov cx, 8 ; len = 8s: mov al, ds:[bx]add al, ds:[bx+16] ; 寄存器不够用,用偏移量来定位mov ds:[bx+16+16], al ; 寄存器不够用,用偏移量来定位 inc bx ; i++loop s ; i < len 循环mov ax, 4c00h int 21h
code ends
end start
c segment
编译不过,我就换成了d
- 程序加载后可以看到 CS:IP 指向 076F:0
[bx+16+16]
这种写法在第7章中会详细介绍。
题目6
程序如下,编写 code 段中的代码,用 push 指令将 a 段中的前 8 个字型数据,逆序存储到 b 段中。
assume cs:codea segment ; CS-3dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh ; 占32字节
a endsb segment ; CS-1dw 0,0,0,0,0,0,0,0 ; 占16字节
b endscode segment
start: mov ax, amov ds, axmov ax, bmov ss, axmov sp, 10h; 下面实现循环处理mov bx, 0 ; i = 0mov cx, 8 ; len = 8s: push [bx] ; a 中取出第一个,放到 b末尾。压栈是从底往上走的add bx, 2 ; i = i+2 字类型占两字节loop s ; i < len 循环mov ax, 4c00h int 21h
code ends
end start
总结
- 系统分配内存16字节起步。
- 定义段,即可声明内容空间。一回事。
- 知道段的定义顺序,又知道它们的大小,可以能过偏移量算出各段的位置。
相关文章:

《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序
《汇编语言》- 读书笔记 - 实验5 编写、调试具有多个段的程序 题目1题目2题目3题目4题目5题目6总结 题目1 将下面的程序编译、连接,用 Debug 加载、跟踪,然后回答问题 assume cs:code, ds:data, ss:stack data segmentdw 0123h,0456h,0789h,0abch,0def…...

剑指offer -- 二维数组中的查找
二维数组中的查找_牛客题霸_牛客网 (nowcoder.com) 暴力查找法: 是一种简单直接的解决方法,可以用于在二维数组中查找目标值。该方法的思路是遍历数组的每个元素,逐个与目标值进行比较。 具体步骤如下: 从数组的第一行第一列开始,…...

3. 自然语言处理NLP:具体用途(近义词类比词;情感分类;机器翻译)
一、求近义词和类比词 1. 近义词 方法一:在嵌入模型后,可以根据两个词向量的余弦相似度表示词与词之间在语义上的相似度。 方法二:KNN(K近邻) 2. 类比词 使用预训练词向量求词与词之间的类比关系。eg:man&a…...
Hibernate的FlushMode
一、Session中FlushMode的设置: 在事务开启前设置FlushMode属性,方法: // session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL)。Service public class TestService {Logger log LoggerFactory.getLogger(getClass());AutowiredEntityM…...

二线程序员的出路
最近长沙不太平。去年被动离职一拨人之后,HR一直强调降本增效,人人自危,挤走一拨人,反正会有大量内卷失败的一线程序员进来填坑。当然留就有人走,前同事除了几个出去搞培训创业(后面解散了)的之…...

MKS SERVO4257D 闭环步进电机_系列2 菜单说明
第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口,支持MODBUS-RTU通讯协议,内置高效FOC矢量算法,采用高精度编码器,通过位置反馈&am…...

使用Actor-Critic的DDPG强化学习算法控制双关节机械臂
在本文中,我们将介绍在 Reacher 环境中训练智能代理控制双关节机械臂,这是一种使用 Unity ML-Agents 工具包开发的基于 Unity 的模拟程序。 我们的目标是高精度的到达目标位置,所以这里我们可以使用专为连续状态和动作空间设计的最先进的Deep…...

黑马学生入职B站1年,晒出21K月薪:我想跳槽华为
现在的Z时代,嘴上说着不要,身体却很诚实。 前两天,黑马发布了《2022年度互联网平均薪资出炉!高到离谱!》,信息传输、软件和信息技术服务业薪资遥遥领先!Z时代举头望着天花板,故作潇…...

一文看懂GPT风口,都有哪些创业机会?
新时代的淘金者,低附加价值的创业要谨慎,高附加价值、低技术门槛创业也要谨慎,主干道边上的创业也要谨慎。不少朋友看完不淡定了,干什么都谨慎,回家躺平好了,我有个朋友,靠ChatGPT,半…...

chatgpt赋能python:Python中的不确定尾数问题
Python中的不确定尾数问题 Python作为一种高级编程语言,被广泛应用于数据科学、机器学习、Web开发等众多领域。然而,Python在处理浮点数时会出现一些不确定尾数的问题,给程序员和数据分析员带来不少麻烦。本篇文章将介绍Python中不确定尾数的…...

杜绝开源依赖风险,许可证扫描让高效合规「两不误」
目录 开源许可证及其常见类型 开源许可证扫描是软件研发过程中,不可或缺的工具 极狐GitLab 开源许可证扫描的优势与应用 Step 1:启用及设置许可证策略 Step 2:自动创建策略文件存放项目 Step 3:查看许可证合规情况 Step 4&…...

【sop】含储能及sop的多时段配网优化模型
目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 之前分享了含sop的配电网优化模型,链接含sop的配电网优化,很多同学在咨询如何增加储能约束,并进行多时段的优化,本次拓展该部分功能,在原代码的基础上增加储能模…...
nodjs使用阿里云镜像安装
要使用阿里云镜像来安装 npm 包,你需要按照以下步骤进行操作: 首先,确保你已经安装了 Node.js 和 npm。你可以在终端(或命令提示符)中输入以下命令来验证它们的安装: node -v npm -v如果显示了 Node.js 和…...

C++ Primer Plus 第二章习题
目录 复习题 1.C程序的模块叫什么? 2.#include 预处理器编译指令的用处? 3.using namespace std; 该语句是干什么用的? 4.什么语句可以打印一个语句"hello,world",然后重新换行? 5.什么语句可以用来创…...

两分钟学会 制作自己的浏览器 —— 并将 ChatGPT 接入
前期回顾 分享24个强大的HTML属性 —— 建议每位前端工程师都应该掌握_0.活在风浪里的博客-CSDN博客2分享4个HTML5 属性,开发必备https://blog.csdn.net/m0_57904695/article/details/130465836?spm1001.2014.3001.5501 👍 本文专栏:开发…...

HEVC中,mvd怎么写进码流的?
文章目录 Motion vector difference syntax 标准文档描述语义解释设计意义 Motion vector difference syntax 标准文档描述 语义解释 MvdL1[ x0 ][ y0 ][ compIdx ] L1列表的mvd x0,y0 表示亮度快左上角坐标 compIdx 0表示水平 compIdx 0表示垂直 mvd_l1_zero_flag:…...

隐形黑客潜入美国和关岛关键基础设施而未被发现
微软和“五眼联盟”国家周三表示,一个隐秘的组织成功地在美国和关岛的关键基础设施组织中建立了一个持久的立足点,而没有被发现。 这家科技巨头的威胁情报团队正在以伏特台风(Volt Typhoon)的名义跟踪这些活动,包括入侵后的凭证访问和网络系…...

设计模式—“接口隔离”
在组件构建过程中,某些接口之间直接的依赖常常会带来很多问题、甚至根本无法实现。采样添加一层间接(稳定)接口,来隔离本来互相紧密关联的接口是一种常见的解决方案。 典型模式有:Fascade、Proxy、Adapter、Mediator 一、Fascade 动机 上述A方案的问题在于组件的客户和…...

【C++学习】异常
🐱作者:一只大喵咪1201 🐱专栏:《C学习》 🔥格言:你只管努力,剩下的交给时间! 异常 🥮异常🍢自定义异常体系🍢C标准库的异常体系🍢异…...
如何理解TCP是面向字节流协议?
传输层是网络协议中的重要层次之一,主要负责向两个主机中的进程之间的通信提供服务。传输层的主要功能包括复用和分用、流量控制、分段/重组和差错控制。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。 传输层的复用和分用功能…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...