《汇编语言》- 读书笔记 - 第4章-第一个程序
《汇编语言》- 读书笔记 - 第4章-第一个程序
- 4.1 一个源程序从写出到执行的过程
- 4.2 源程序
- 程序 4.1
- 1. 伪指令
- 1.1 segment ends 声明段
- 1.2 end 结束标记
- 1.3 assume 关联
- 2. 源程序中的“程序”
- 3. 标号
- 4. 程序的结构
- 5. 程序返回
- 6. 语法错误和逻辑错误
- 4.3 编辑源程序
- 4.4 编译
- 4.5 连接
- 4.6 以简化的方式进行编译和连接
- 4.7 执行exe
- 4.8 谁将可执行文件中的程序装载进入内存并使它运行?
- 问题 4.1
- 问题 4.2
- 操作系统的shell
- 4.9 程序执行过程的跟踪
- 实验3 编程、编译、连接、跟踪
4.1 一个源程序从写出到执行的过程
- 第一步:编写汇编源程序。
- 第二步:对源程序进行编译连接。
可执行文件包含两部分内容- 程序(从源程序中的汇编指令翻译过来的机器码)和数据(源程序中定义的)
- 相关的描述信息(比如,程序有多大、要占用多少内存空间等)
- 第三步:执行可执行文件中的程序。

操作系统依照可执行文件中的描述信息,将可执行文件中的机器码和数据加载入内存,并进行相关的初始化(比如设置 CS:IP 指向第一条要执行的指令),然后由 CPU 执行程序。
4.2 源程序
程序 4.1
assume cs:codesg
codesg segmentmov ax, 0123Hmov bx, 0456Hadd ax, bxadd ax, axmov ax,4c00Hint 21H
codesg ends
end
1. 伪指令
汇编指令:会被编译为机器指令,最终为 CPU 所执行。
而伪指令:没有对应的机器指令,它被用来辅助编译器进行相关的编译工作。
1.1 segment ends 声明段
段名 segment; 代码...
段名 ends
segment 和 ends 是一对伪指令,功能是定义一个段,segment 说明一个段开始,ends 说明一个段结束。一个段必须有一个名称来标识。
一个汇编程序是由多个段组成的,指令、数据、栈,被划分到了不同的段中。
一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。
1.2 end 结束标记
编译器在编译汇编程序的过程中,碰到了伪指end,就结束对源程序的编译。
1.3 assume 关联
用于将特定的段与相关段寄存器建立关联。
assume cs:codesg
将代码段的段 codesg 和段寄存器 cs 联系起来。
2. 源程序中的“程序”
程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。这个过程如图 4.2 所示。

3. 标号
汇编源程序中,除了汇编指令和伪指令外,还有一些标号,比如codesg。它指代了一个地址。
比如 codesg 在 segment 的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址。
4. 程序的结构
源程序是由一些段构成的。
任务: 编程运算 2^3。源程序应该怎样来写呢?
assume cs:abc ; 将 abc 和 cs 建立关联,当作代码段。
abc segment ; 定义一个段,名称为 abcmov ax,2 ; 在段中写入汇编指令 1add ax,ax ; 在段中写入汇编指令 2add ax,ax ; 在段中写入汇编指令 3; 这里还缺程序返回指令,后面自己补上。
abc ends ; 段 abc 结束
end ; 指出程序在何处结束
5. 程序返回
程序原本只是躺在硬盘中的一坨二进制数据。
执行程序的流程:(这里讨论的是DOS系统)
- 程序A将程序B加载到内存。
- 程序A将CPU控制权交给程序B。
- 程序B执行。
- 程序B执行完毕,程序返回。交出CPU控制权。
- 程序A拿到CPU控制权,继续执行。
程序返回指令如下:(书上说先死记,后面会讲)
mov ax, 4c00H
int 21H
表4.1 与结束相关的概念
| 目的 | 相关指令 | 指令性质 | 指令执行者 |
|---|---|---|---|
| 通知编译器一个段结束 | 段名 ends | 伪指令 | 编译时,由编译器执行 |
| 通知编译器程序结束 | end | 伪指令 | 编译时,由编译器执行 |
| 程序返回 | mov ax,4c00H int 21H | 汇编指令 | 执行时,由 CPU 执行 |
6. 语法错误和逻辑错误
语法错误:编译器能发现。
逻辑错误:跑起来看了效果才知道。
4.3 编辑源程序
任何你熟悉的文本编辑器都可以。
4.4 编译
- 将源文件保存得到
test.asm - 编译:
masm test.asm得到目标文件test.obj。(也可以直接输入masm回车,交互式设置编译参数 )

4.5 连接
连接的作用:
- 根据需要将源程序分为多个来编译,得到多个目标标文件后,再连接生成一个可执行文件;
- 程序中调用了某个库文件中的子程序,需要将这个库文件和该程序生成的目标文件连接到一起,生成一个可执行文件;
- 一个源程序编译后,得到了存有机器码的目标文件,目标文件中的有些内容还不能直接用来生成可执行文件,连接程序将这些内容处理为最终的可执行信息。所以,在只有一个源程序文件,而又不需要调用某个库中的子程序的情况下,也必须用连接程序对目标文件进行处理,生成可执行文件。
使用微软的 Overlay Linker3.60 连接器,文件名为 link.exe

4.6 以简化的方式进行编译和连接
末尾加分号 ; 表示都用默认参数:
masm test.asm;
link test.obj;
当然还有更简化的,我们直接用 ML.exe

4.7 执行exe

我们的 test.exe 只是对寄存器进行操作。直接执行是看不到效果的,debug调试一下,就能看到效果了。(作者说后面会介绍输出到屏幕的程序,不过要几章之后去了)

4.8 谁将可执行文件中的程序装载进入内存并使它运行?
我们在前面讲过,在 DOS 中,可执行文件中的程序 P1 若要运行,必须有一个正在运行的程序 P2,将 P1 从可执行文件中加载入内存,将 CPU 的控制权交给它,P1 才能得以运行;当 P1 运行完毕后,应该将 CPU 的控制权交还给使它得以运行的程序 P2。
按照上面的原理,再来看一下 4.7 节中 test.exe 的执行过程(思考相关的问题)。
- 在提示符
c:\后面输入可执行文件的名字test,按 Enter 键。这时,请思考问题 4.1。 - l.exe 中的程序运行。
- 运行结束,返回,再次显示提示符“c:masm’。请思考问题 4.2。
问题 4.1
此时,有一个正在运行的程序将 test.exe 中的程序加载入内存,这个正在运行的程序是什么? 它将程序加载入内存后,如何使程序得以运行?
- 在 DOS 中直接执行
test.exe时,是正在运行的 shell 程序 command,将其加载入内存。 command设置 CS:IP 指向test.exe的第一条指令(即程序的入口),从而使test.exe得以运行。
问题 4.2
程序运行结束后,返回到哪里?
- 程序运行结束后,返回到
command。
操作系统的shell
操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为 shell外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作。
DOS 中有一个程序command.com,这个程序在 DOS 中称为命令解释器,也就是 DOS 系统的shell。
DOS 启动时,先完成其他重要的初始化工作,然后运行command.com,command.com运行后,执行完其他的相关任务后,在屏幕上显示出由当前盘符和当前路径组成的提示符,比如:c:\或“c:\windows`等,然后等待用户的输入。
用户可以输入所要执行的命令,比如,cd、dir、 type 等,这些命令由command执行,command 执行完这些命令后,再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。
如果用户要执行一个程序,则输入该程序的可执行文件的名称,command首先根据文件名找到可执行文件,然后将这个可执行文件中的程序加载入内存,设置 CS:IP 指向程序的入口。此后,command暂停运行,CPU运行程序。程序运行结束后,返回到command中,command再次显示由当前盘符和当前路径组成的提示符,等待用户的输入。
在 DOS 中,command处理各种输入:命令或要执行的程序的文件名。我们就是通过command来进行工作的。

4.9 程序执行过程的跟踪
在 DOS 系统中EXE 文件中的程序的加载过程

debug test.exe

CX:存放程序的长度。
DS:存放程序所在内存区的段地址。
CS:CS = DS + 10H。
PSP:此内存区的前256字节(100H),是DOS用来与程就进行通信的。
程序:PSP之后就是程序。物理地址:SA16 + 0 + 256 = SA * 16 + 1616 +0 = (SA+16) * 16 + 0
段地址:偏移地址表示为 SA+10H:0
- 单步执行用
T - 执行到
int 21用P,正常执行结束会显示Program terminated normally,然后回到debug中。(因为是 Debug 加载程序进内存执行的)
实验3 编程、编译、连接、跟踪
《汇编语言》- 读书笔记 - 实验3 编程、编译、连接、跟踪
相关文章:
《汇编语言》- 读书笔记 - 第4章-第一个程序
《汇编语言》- 读书笔记 - 第4章-第一个程序 4.1 一个源程序从写出到执行的过程4.2 源程序程序 4.11. 伪指令1.1 segment ends 声明段1.2 end 结束标记1.3 assume 关联 2. 源程序中的“程序”3. 标号4. 程序的结构5. 程序返回6. 语法错误和逻辑错误 4.3 编辑源程序4.4 编译4.5 …...
AI工具 ChatGPT-4 vs Google Bard , PostgreSQL 开发者会pick谁?
在人工智能 (AI) 进步的快节奏世界中,开发人员正在寻找最高效和突破性的解决方案来加快和提高他们的工作质量。对于 PostgreSQL 开发人员来说,选择理想的 AI 支持的工具以最专业的方式解决他们的查询至关重要。 近年来,人工智能工具的普及率…...
【网络】基础知识1
目录 网络发展 独立模式 网络互联 局域网LAN 广域网WAN 什么是协议 初识网络协议 协议分层 OSI七层模型 TCP/IP四层(或五层)模型 OSI和TCP/IP对比 网络传输流程 什么是报头 局域网通信原理 同网段的主机通讯 跨网段的主机通讯 数据包封装…...
chatgpt赋能python:Python倒序range的完整指南
Python倒序range的完整指南 Python是一种高级编程语言,很多人认为它非常容易学习和使用。其中一个非常有用的功能是range()函数,可以生成数字序列。然而,有时候我们需要以相反的顺序生成这个数字序列,这时候倒序range()函数就派上…...
工作笔记!
搭建tomcat Tomcat详细使用教程 tomcat配置用戶名和密碼 tomcat设置外网能访问_tomcat让别人通过网络访问 如何在windows开端口_windows开放端口命令 tomcat进Manager 403 Access Denied You are not authorized to view this page_tomcat报错you are not_ferry_cai 关于依…...
java设计模式之享元设计模式的前世今生
享元设计模式是什么? 享元设计模式是一种结构型设计模式,它的目的是在大规模重复使用相似对象时提高内存利用率和性能。它通过共享对象的公共部分来减少所需要的内存,从而在系统中同时存在更多的对象。 享元设计模式通过将对象分为可共享的内…...
RESTful:理解REST架构风格、RESTful API
一、REST架构风格 REST(英文Representational State Transfer)是一种基于客户端和服务器的架构风格,用于构建可伸缩、可维护的Web服务。REST的核心思想是,将Web应用程序的功能作为资源来表示,使用统一的标识符&#x…...
网络面试题:什么是 TCP/IP?
目录标题 什么是 TCP/IP?1) 网络接口层:2) 网络层:3) 传输层:4) 应用层: 2.数据包3.网络接口层4.网络层1) IP:2)地址解析协议 ARP3)子网 5 传输层1)UDP:2)TCP: 6 应用层运行在TCP协议上的协议:运行在UDP协议上的协议&…...
毫米波雷达模块在自动驾驶系统中的关键功能
随着自动驾驶技术的快速发展,毫米波雷达模块作为一项关键技术,为自动驾驶系统提供了重要的感知和决策能力。毫米波雷达模块通过实时探测和跟踪周围环境中的车辆、行人和障碍物,提供精确的距离和速度信息,帮助自动驾驶车辆做出准确…...
关于开发中对端口(port)的几点理解
一、服务端的端口是固定的,客户端的端口是随机的 客户端端口是随机的,比如访问百度,系统为浏览器分配了个端口1024。过一会重开电脑,访问了新浪,可能还是用1024端口,我不关浏览器,还要再开一个浏…...
qt 5.14.2 arm 交叉环境搭建过程
主要参考 https://blog.csdn.net/anmo_moan/article/details/126960630 https://blog.csdn.net/a648642694/article/details/89302843 1 下载编译器&设置 1.1 gcc-linaro-12.2.1-2023.01-x86_64_arm-linux-gnueabihf.tar.xz 下载编译器 1.2. /home/zsf/arm linaro 压缩包…...
apt remove purge的区别 删除包的同时删除配置文件
1、apt remove purge的区别 查看 man apt apt remove:删除软件包,不删除配置文件。这么做的目的是将来再次安装这个包时 原来的配置文件会自动加载供使用。也可以避免误删除包,配置文件还在的话,重新安装一次软件包就可以恢复到…...
电商|跨境电商如何选择API接口和ERP
随着跨境电商企业规模升级,平台提供的卖家后台系统往往无法满足有一定规模的店铺和独立站卖家。日常运营中,中大型跨境电商往往面临以下几种挑战: 多店铺、多平台订单管理难 库存数据集成难,经常缺货 物流管理难,手…...
测试人员的启蒙指南
文章目录 一. 了解测试1. 生活中的测试场景2. 什么是软件测试3. 实战练习 二. 软件测试和软件开发的区别三. 软件测试和软件调试的区别四. 软件测试的发展五. 软件测试的岗位六. 一个优秀的软件测试人员具备的素质 本篇中介绍测试人员是干什么的, 起到启蒙和了解的作用, 重点是…...
Linux工具:vim常用快捷键
1、拷贝行(一般模式下) 拷贝当前行 将光标移动到指定行,yy 移动到想要粘贴的行,p 即可把拷贝的行粘贴到该行下方 拷贝n行 将光标移动到指定行,比如拷贝5行,5yy 移动到想要粘贴的行,p 即可把拷贝的几行粘贴到该行下方…...
TA-lib第三方库安装问题
因为学习的需要,用到Talib库做写指标分析,但是百度了好久,说是去要某某网站下载对应版本的文件进行本地安装,但是把…404 Not found 然后通过查找,Ta-lib库的安装已经迁移到这里了 https://github.com/TA-Lib/ta-lib-p…...
接口测试的测试要点
接口测试的测试要点,你知道都有哪些吗? 接口测试是软件测试中的重要组成部分,它的目的是评估接口的质量和可靠性,以保证系统的正常运行。在进行接口测试时,必须要考虑到以下几个方面: 测试用例的编写 测试…...
直流电机 PID 控制系统仿真研究(Simulink实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
第三章 向量与线性方程组
引言 题型总结中推荐例题有蓝皮书的题型较为重要,只有吉米多维奇的题型次之。码字不易,如果这篇文章对您有帮助的话,希望您能点赞、评论、收藏,投币、转发、关注。您的鼓励就是我前进的动力! 知识点思维导图 补充&…...
数组题目总结 -- 花式遍历
目录 一. 反转字符串中的单词思路和代码:I. 博主的做法II. 东哥的做法III. 其他做法1补充知识点: IV. 其他做法2 二. 旋转图像思路和代码:I. 博主的做法II. 东哥的做法 三. 旋转图像(逆时针旋转90)思路和代码ÿ…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...
