《汇编语言》- 读书笔记 - 第4章-第一个程序

news2024/12/23 18:14:32

《汇编语言》- 读书笔记 - 第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 segment
	mov ax, 0123H
	mov bx, 0456H
	add ax, bx
	add ax, ax
	
	mov ax,4c00H
	int 21H
codesg ends
end

1. 伪指令

汇编指令:会被编译为机器指令,最终为 CPU 所执行。
而伪指令:没有对应的机器指令,它被用来辅助编译器进行相关的编译工作。

1.1 segment ends 声明段

段名 segment
	 ; 代码... 
段名 ends

segmentends 是一对伪指令,功能是定义一个段,segment 说明一个段开始,ends 说明一个段结束。一个段必须有一个名称来标识。
一个汇编程序是由多个段组成的,指令数据,被划分到了不同的段中。
一个有意义的汇编程序中至少要有一个段,这个段用来存放代码。

1.2 end 结束标记

编译器在编译汇编程序的过程中,碰到了伪指end,就结束对源程序的编译。

1.3 assume 关联

用于将特定的与相关段寄存器建立关联。

assume cs:codesg

将代码段的段 codesg 和段寄存器 cs 联系起来。

2. 源程序中的“程序”

程序最先以汇编指令的形式存在源程序中,经编译、连接后转变为机器码,存储在可执行文件中。这个过程如图 4.2 所示。
在这里插入图片描述

3. 标号

汇编源程序中,除了汇编指令伪指令外,还有一些标号,比如codesg。它指代了一个地址。
比如 codesgsegment 的前面,作为一个段的名称,这个段的名称最终将被编译、连接程序处理为一个段的段地址

4. 程序的结构

源程序是由一些构成的。
任务: 编程运算 2^3。源程序应该怎样来写呢?

assume cs:abc	; 将 abc 和 cs 建立关联,当作代码段。
abc segment		; 定义一个段,名称为 abc
	mov ax,2		; 在段中写入汇编指令 1
	add ax,ax		; 在段中写入汇编指令 2
	add ax,ax		; 在段中写入汇编指令 3
					; 这里还缺程序返回指令,后面自己补上。
abc ends		; 段 abc 结束
end				; 指出程序在何处结束

5. 程序返回

程序原本只是躺在硬盘中的一坨二进制数据。
执行程序的流程:(这里讨论的是DOS系统)

  1. 程序A将程序B加载到内存。
  2. 程序A将CPU控制权交给程序B。
  3. 程序B执行。
  4. 程序B执行完毕,程序返回。交出CPU控制权。
  5. 程序A拿到CPU控制权,继续执行。

程序返回指令如下:(书上说先死记,后面会讲)

mov ax, 4c00H
int 21H

表4.1 与结束相关的概念

目的相关指令指令性质指令执行者
通知编译器一个段结束段名 ends伪指令编译时,由编译器执行
通知编译器程序结束end伪指令编译时,由编译器执行
程序返回mov ax,4c00H int 21H汇编指令执行时,由 CPU 执行

6. 语法错误和逻辑错误

语法错误:编译器能发现。
逻辑错误:跑起来看了效果才知道。

4.3 编辑源程序

任何你熟悉的文本编辑器都可以。

4.4 编译

  1. 将源文件保存得到 test.asm
  2. 编译:masm test.asm 得到目标文件 test.obj。(也可以直接输入masm 回车,交互式设置编译参数 )
    在这里插入图片描述

4.5 连接

连接的作用:

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

使用微软的 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 的执行过程(思考相关的问题)。

  1. 在提示符c:\后面输入可执行文件的名字 test,按 Enter 键。这时,请思考问题 4.1。
  2. l.exe 中的程序运行。
  3. 运行结束,返回,再次显示提示符“c:masm’。请思考问题 4.2。

问题 4.1

此时,有一个正在运行的程序将 test.exe 中的程序加载入内存,这个正在运行的程序是什么? 它将程序加载入内存后,如何使程序得以运行?

  1. 在 DOS 中直接执行 test.exe 时,是正在运行的 shell 程序 command,将其加载入内存。
  2. command 设置 CS:IP 指向test.exe 的第一条指令(即程序的入口),从而使 test.exe 得以运行。

问题 4.2

程序运行结束后,返回到哪里?

  1. 程序运行结束后,返回到 command

操作系统的shell

操作系统是由多个功能模块组成的庞大、复杂的软件系统。任何通用的操作系统,都要提供一个称为 shell外壳)的程序,用户(操作人员)使用这个程序来操作计算机系统进行工作。


DOS 中有一个程序 command.com,这个程序在 DOS 中称为命令解释器,也就是 DOS 系统的 shell


DOS 启动时,先完成其他重要的初始化工作,然后运行 command.comcommand.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 21P,正常执行结束会显示Program terminated normally,然后回到 debug中。(因为是 Debug 加载程序进内存执行的)

实验3 编程、编译、连接、跟踪

《汇编语言》- 读书笔记 - 实验3 编程、编译、连接、跟踪

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

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

相关文章

Electron 我与你,今天不谈技术谈感情!

目录 前言一、无知二、初见三、再见四、相遇五、行动总结 前言 今天不谈技术,谈谈我和 Electron 的缘分。可能有人觉得,或许有些人认为,和一个框架谈感情这不是疯了吗?但是,我相信每个开发者都会有同样的经历&#xf…

数字化浪潮下,运维绕不开的需求升级

伴随企业数据中心规模化、复杂度、设备多样性的发展,运维也迎来史无前例的巨大挑战,运维的重要性被推向高点,对运维平台而言无疑是最好的时代,充分利用大数据和人工智能技术融合来解决实际问题,建立数据要素全周期管理…

XSS基础环境及实验演示教程(适合新手)

目录 前言 环境说明: 1、轻量级 Web 服务器 PHP 2、易受XSS攻击的PHP程序 3、非持久性 XSS 攻击 4、窃取会话cookie 5 注入表单窃取密码 前言 花了一点时间,做了一个“XSS基础环境及实验演示教程”,当然教程很简单,适合刚接触和安…

Electron 如何创建模态窗口?

目录 前言一、模态窗口1.Web页面模态框2.Electron中的模态窗口3.区分父子窗口与模态窗口 二、实际案例使用总结 前言 模态框是一种常用的交互元素,无论是在 Web 网站、桌面应用还是移动 APP 中,都有其应用场景。模态框指的是一种弹出窗口,它…

leetcode 1383. Maximum Performance of a Team(团队的最大performance)

n个工程师,长度为n的speed数组和efficiency数组。 每次最多选k个工程师,取出k个对应的speed和efficiency数字。 performancesum(k个speed) ✖ min(k个efficiency) 可以理解为k个人一起干,效率按最慢的人算(一个环节干不完其他人都…

Linux——IO之系统接口+文件描述符详解

IO 文件再次理解系统接口文件操作理解文件描述符 fd 文件再次理解 文件 文件内容 文件属性 其中文件属性也是数据–>即便你创建一个空文件,其也是要占据磁盘攻坚的。 文件操作 文件内容的操作 文件属性的操作 有可能在操作文件的过程中即改变文件的内容&…

Linux---echo命令、反引号`、tail命令、重定向符

1. echo命令 可以使用echo命令在命令行内输出指定内容 语法:echo 输出的内容 无需选项,只有一个参数,表示要输出的内容,复杂内容可以用 ”” 包围 带有空格或 \ 等特殊符号,建议使用双引号包围。 如果不使用双引号…

华为OD机试真题 Java 实现【统计匹配的二元组个数】【2023Q2 200分】

一、题目描述 给定两个数组A和B,若数组A的某个元素A[i]与数组B中的某个元素B[j]满足 A[i] B[j],则寻找到一个值匹配的二元组(i, j)。 请统计在这两个数组A和B中,一共存在多少个这样的二元组。 二、输入描述 第一行输入数组A的长度M&…

复习之[ 查询帮助 ] 和 [ 输入输出管理 ]

1.查询命令用途--whatis # whatis 命令 : 查询命令的用法 -如果结果出现nothing , 有两种情况: (1)查询数据库没有更新,此时输入命令 mandb更新数据库即可。 (2)查询的命令不存在。 2.获得命令的简要帮…

想学渗透,如何入门?

首先 渗透是计算机技术应用的一种,脱离不了基础,您需要学会一门编程语言,任何与计算机相关的都是从学习编程语言开始的,让你对计算机有个初步的认识,将您认识的数字转化为用0和1表示的编码。这个阶段推荐学习Python&a…

​LeetCode解法汇总LCP 33. 蓄水

目录链接: 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目: https://github.com/September26/java-algorithms 原题链接:力扣 描述: 给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水&…

华芯微特SWM34-IO速度优化

对比测试了一下IO翻转速度在各种函数调用的情况下的差异 CPU运行速度150Mhz,SDRAM开 直接调用翻转函数 while(1) {GPIO_InvBit(GPIOA, PIN0); }速度大约5Mhz,主要是因为函数调用开销和函数内部的移位和异或操作,增加了指令的运行数量。 vo…

这是JWT 简单使用

JWT 是 Json Web Token的缩写 JSON Web Tokens - jwt.ioJSON Web Token (JWT) is a compact URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is digitally signed using JSON Web Sig…

6-索引

目录 1.什么是索引? PS:数据库引擎简介(InnoDB VS MyISAM) 2.为什么需要索引? PS:存储数据模组 PS:查询数据存储的目录: 3.索引的作用 PS:索引 VS 书的目录 4.索…

PostgreSQL 源码部署

文章目录 说明1. 准备工作1.1 源码包下载1.2 解压安装目录1.3 安装依赖包1.4 添加用户1.5 创建数据目录 2. 编译安装2.1 源码编译2.2 配置环境变量2.3 初始化数据库2.4 启动数据库2.5 连接数据库 3. 参数调整3.1 配置 pg_hba3.2 监听相关2.4 日志文件2.5 内存参数 说明 本篇文…

db2常用命令/db2常见报错

文章目录 一、前言二、db2服务端常用命令2.1 启动/停止数据库2.2 连接数据库2.3 查看schema下所有表名2.4 查看表结构2.5 删除表数据2.6 导入导出del/ixf文件2.6.1 del与ixf区别 三、db2客户端常用命令3.1 查看schema下所有表及每个表的记录数3.2 修改表字段,对表字…

WPF中集合ObservableCollection<T>的使用

C#集合类ObservableCollection<T> 类似于泛型列表类List<T>&#xff0c;表示一个动态数据收集&#xff0c;该集合在添加或删除项或刷新整个列表时提供通知。 所在命名空间&#xff1a;System.Collections.ObjectModel 继承关系&#xff1a; public class Obser…

APP软件开发详细流程如何?

在互联网技术发达的今天&#xff0c;APP已经深入到我们生活的方方面面了&#xff0c;从购物、家政、洗车、教育到美容、旅游、餐饮等等&#xff0c;都可以通过各种各样的APP软件来实现&#xff0c;使我们的生活更加便捷化、智能化。不过&#xff0c;很多感兴趣的朋友对于APP软件…

亚马逊云科技宣布全面推出Amazon Aurora I/O-Optimized集群配置

自亚马逊云科技Amazon Aurora于2014年推出以来&#xff0c;成千上万的客户选择Aurora来运行其要求最严苛的应用程序。Aurora在全球范围内提供无与伦比的高性能和可用性&#xff0c;完全兼容MySQL和PostgreSQL&#xff0c;成本仅为商用数据库的十分之一。 许多亚马逊云科技客户受…

电竞小程序系统开发功能有哪些?

电竞小程序系统开发功能有哪些&#xff1f; 1、电竞资讯。对于电竞爱好者来说&#xff0c;每一场电竞比赛的相关信息都是不容错过的&#xff0c;因此用户可以通过小程序直接了解近期电竞相关资讯&#xff0c;例如&#xff1a;赛程安排、直播平台、参赛团队、比赛规则等&…