《汇编语言》- 读书笔记 - 实验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是面向字节流协议?
传输层是网络协议中的重要层次之一,主要负责向两个主机中的进程之间的通信提供服务。传输层的主要功能包括复用和分用、流量控制、分段/重组和差错控制。传输层在终端用户之间提供透明的数据传输,向上层提供可靠的数据传输服务。 传输层的复用和分用功能…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
R 语言科研绘图第 55 期 --- 网络图-聚类
在发表科研论文的过程中,科研绘图是必不可少的,一张好看的图形会是文章很大的加分项。 为了便于使用,本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中,获取方式: R 语言科研绘图模板 --- sciRplothttps://mp.…...
