【新书推荐】5.1节 16位汇编语言学习环境

第五章 16位汇编学习环境

         16位汇编语言的学习环境是建立在8086计算机的基础上的,我将借助于DosBox虚拟机来实现16位汇编语言学习环境的搭建。

5.1节 16位汇编语言学习环境

         本节内容:16位汇编学习环境的搭建。

         ■汇编语言程序设计编程调试过程:分为编辑、汇编、连接和调试四个步骤。

         ■16位汇编语言学习环境搭建:DosBox虚拟机、Notepad++文本编辑工具、MASM5.0汇编器、Link链接器、Lib库工具和debug调试器。

从这节开始,我们正式开始学习16位汇编语言程序设计。根据计算机发展的历程,我们按照16位汇编、32位汇编、Win32汇编和64位汇编的顺序学习。构建前后衔接,完整的知识体系,这也是系统学习任何一门技术的基本要求。

在学习的过程中,一定要动手实验,动脑思考,身边准备好纸和笔,切不可盲目自信或妄自菲薄。任何一门技术的学习和积累都需要一个长期的由量变到质变的过程。当我们认真完成所有的实验和练习,一定会收获满满,并为我们下一步的学习打下坚实的基础。好了,让我们开始吧。

5.1.1 汇编语言程序设计编程调试过程

第一步:编写源程序。

第二步:汇编源程序。

第三步:链接目标程序。

第四步:调试可执行程序。

图5-1 汇编语言程序设计编程调试过程

         我们把汇编语言程序设计编写调试过程分为四个步骤。如图5-1所示:

第一步编辑:在第一步编辑源程序之前,一定要先设计程序的结构,定义程序中需要使用的数据结构,并分析实现功能所需要的算法。请记住“程序=数据结构+算法”

         程序设计采用自顶向下的方法。先把程序分为几个大的功能模块,通常为:

数据定义——选择合适的数据结构;

功能实现——通过特定算法实现既定任务;

结果输出——屏幕输出、打印输出或者以文件形式保存到磁盘。

然后我们再将大的模块细分。我们将在第十章8086汇编语言程序设计基础的章节中详细讲解三种基本的程序设计结构(顺序结构、分支结构和循环结构),此处不再赘述。编写完源程序之后,将源程序保存为.ASM后缀名的源文件,之后就可以使用汇编器进行编译了。

第二步汇编:在16位汇编中,我们采用微软的MASM5.0汇编器进行编译。汇编器的作用是将程序员编写的由字符串构成的汇编语言源文件翻译成二进制机器语言。机器语言与汇编指令是一一对应的关系,翻译的过程即查表。编译完成后,会生成以.OBJ为后缀名的目标代码程序文件。

为什么编译后生成.OBJ中间文件,而不是直接生成二进制可执行文件.EXE程序呢?

这是因为当我们需要使用外部功能模块时(一般以函数调用的方式使用),需要将外部模块的.OBJ添加到我们的源程序中,这就需要第三步连接。

    ■第三步连接:使用链接器LINK.EXE将一个或多个.OBJ连接生成一个独立的.EXE二进制可执行程序。接下来就是最后一步调试。

    ■第四步调试:由于连接后生成的.EXE程序可能会存在问题,我们称之为BUG。需要借助调试工具Debug.exe单步跟踪调试,直到修正BUG,确保程序的正确性。

提示

         编译源程序之前的程序设计、数据定义和算法分析非常重要。作为一个合格的程序员,一定要严格按照既定的流程和步骤进行软件开发。这些流程和步骤是前人经验教训的总结。很多初学者往往会忽视流程的作用,认为按照流程作业比较麻烦,浪费时间。而事实恰恰相反,计算机语言和人类语言的区别在于,计算机语言需要严谨的逻辑,每一处细节都不能出错。人类的大脑暂且达不到这样的要求,所以要求程序员先使用纸和笔进行算法演算,写伪代码,画流程图。如果省略了前面的准备工作,直接编写代码,注定是漏洞百出。反复的修改和测试会浪费大量的时间,甚至导致彻底失败。初学者一旦养成坏的习惯,当意识到问题的严重性之后,往往很难改掉。切记悔不当初!

5.1.2 16位汇编语言学习环境搭建

         在一堆枯燥的概念之后,终于到了激动人心的时刻了。我们可以编写自己的第一个程序了。但是在这之前,还需要搭建好必要的环境。16位汇编的环境包请在编程达人的官方网站编程达人、爱达人下载,或者在滴水逆向联盟论坛下载滴水逆向联盟论坛|VMP还原|逆向培训|TMD还原|VT调试器|怎么破解软件|外挂破解 - www.dtdebug.com。

         ■DOS操作系统环境

         因为我们现在普遍使用的是Windows 64位系统,而16位汇编程序需要在DOS系统环境下运行。所以我们需要安装DosBox虚拟机。安装的过程非常简单。点击运行DosBox0.74-win32-installer.exe。如图5-2所示,每次都选择Next下一步即可。接下来还需要安装源文件的文本编辑工具。

         ●DosBox安装完成后启动,开机界面如图5-3所示。

         ●DOS系统命令可以在命令行输入“help”命令查询。常用的命令有:CLS清屏、CD显示或更改当前路径。其他命令可以参考图5-4。

         ●接下来配置虚拟机内的编译环境路径。如图5-5所示,命令行输入“mount c d:\code\dos\masm”。表示将DosBox虚拟机的C盘根目录等同于真实机的当前编译环境路径。然后在命令行输入“c:”,将编译路径切换到虚拟机C盘根目录,就可以在此路径下进行编译链接和调试了。本机将16位汇编工具包放置在“d:\code\dos\masm”路径下作为当前编译环境,16位汇编源程序放置在“D:\code\dos\masm\asm”文件夹内。读者可以将其替换为自己机器内的编译路径。

图5-2 DosBox安装

图5-3 DOSBOX开机界面

图5-4 DOS系统命令

图5-5 DosBox编译环境路径设置

提示

         配置好DosBox虚拟机系统环境之后,我们会发现,每次重启DosBox虚拟机,都需要重新设置编译环境。为了简化这个步骤,可以添加一个批处理命令。具体方法如下:

         选中DosBox虚拟机桌面快捷方式,点击鼠标右键,点击“属性”,打开属性对话框后,点击“打开文件所在位置”菜单,在DosBox安装目录下找到批处理文件“DosBox 0.74 Options.bat”并打开。在批处理文件的结尾添加如下脚本命令:

mount c d:\code\dos\masm

c:

         根据每个人的工具包放置路径不同,指定自己的工具包路径。如果不需要使用此批处理命令,可以在脚本命令第一个字母前添加“#”屏蔽,如“#mount c d:\code\dos\masm”。

文本编辑工具:Notepad++

    汇编语言源程序的文本编写工具软件,可以使用记事本或任一文本编辑工具。从方便快捷的角度出发,我们推荐使用Nodtepad++文本编辑工具。如果读者有习惯偏好,可以使用其他自己喜欢的文本编辑工具。

         Notepad++。安装的过程同样非常简单,如图5-6所示,每次都选择下一步即可。   

图5-6 Notepad++安装

         ■MASM.EXE 5.0汇编器

MASM [/options]  [source(.asm)],[out(.obj)],[list(.lst)],[cref(.crf)] [;]

可选的命令动作选项由符号“/”引导。利用命令“MASM /HELP”可获得有关命令动作选项及其说明信息。

source(.asm)指定源程序,缺省扩展名为ASM。

out(.obj)指定输出的目标代码文件。缺省的文件名同源文件名,缺省的扩展名为OBJ。

list(.lst)指定输出的列表文件,缺省扩展名是LST。缺省情况下不生成列表文件。

cref(.crf)指定输出的交叉参考文件,缺省的扩展名是CRF。缺省情况是不生成交叉参考文件。

命令行最后的[;]表示其后的缺省项,按缺省处理。

举例说明:汇编程序HELLO.ASM,在当前路径下编译HELLO.ASM源程序。       

C>MASM HELLO     

         ■LINK.EXE 链接器

LINK  [/options]  [source(.obj)...],[out(.exe)],[mapfile(.map)],[library(.lib)...] [;]

可选的命令动作选项由符号“/”引导。利用命令“LINK /HELP”可获得有关命令动作选项及其说明信息。

source(.obj)指定目标代码文件,缺省扩展名为OBJ。可以有多个目标程序代码文件,文件标识间用加号间隔或者用空格间隔。

out(.exe)指定输出的可执行文件。缺省的文件名同第一个目标代码模块的文件名,缺省的扩展名为EXE。

mapfile(.map)指定输出定位图文件,缺省扩展名是MAP。缺省情况下不生成定位图文件。

library(.lib)指定连接时使用的库文件,缺省的扩展名是LIB。可以有多个库,库文件标识间加号间隔或者使用空格间隔。缺省情况下不使用库。

命令行最后的[;]表示其后的缺省项,按缺省设置处理。

C>LINK HELLO;

C>LINK TEST1+TEST2,TEST;  TEST1和TEST2连接,生成的可执行程序存放在TEST.EXE中。

C>LINK ABC+DEF.LIB   把目标代码模块ABC.OBJ与库DEF.LIB内的函数(过程)连接,生成的可执行程序文件存放在ABC.EXE中。

C>LINK TEST1+TEST2+DEF.LIB ,ABC.EXE,GHI.MAP  把主目标模块TEST1.OBJ和TEST2.OBJ与库DEF.LIB内的函数(过程)连接,生成的可执行程序文件存放在ABC.EXE中,生成定位图文件GHI.MAP。

         动手实验6:汇编器masm.exe和链接器link.exe的使用方法

我们以第九章 8086汇编基础中的第一个汇编程序hello.asm为例。

第一步:编译源程序hello.asm,生成.obj文件。

        

如图5-7所示,命令行输入:“masm c:\asm\hello”。

         “masm”表示执行masm.exe汇编器,“c:\asm\hello”为参数,即hello.asm源文件的路径,默认缺省“.asm”后缀名。

         回车后,“Object filename [hello.OBJ]:”,表示编译后生成的OBJ文件名。直接回车,表示默认生成“hello.obj”。

         下一行 “Source listing [NUL.LIST]:”,表示编译后生成的list文件名。

         再下一行“cross-reference [NUL.CRF]:”,表示编译后生成的CRF文件名。

         List文件和CRF文件,我们在这里不再赘述,将在第三部分32位汇编中讲述。

图5-7 masm汇编器

         第二步:将.obj文件链接生成.exe二进制可执行文件。

         如图5-8所示,命令行输入“link hello”。

图5-8 link链接器

         “link”表示执行link.exe链接器,“hello”为参数,即当前路径下的hello.obj文件径,默认缺省“.obj”后缀名。

         回车后,“Run File [HELLO.EXE]:”,表示链接后生成的EXE文件名。直接回车,表示默认生成“HELLO.EXE”。

         下一行 “List File [NUL.MAP]:”,表示链接后生成的MAP文件名。

         再下一行“Libraries [.LIB]:”,表示链接时连接的LIB库。

         MAP文件,我们在这里不再赘述,将在第三部分32位汇编中讲述。

         LIB库和多个OBJ文件的链接,我们将在第二十七章子程序库中详细讲述。

注意

注意:除了微软的MASM汇编器之外,还有TASM、NASM等其他厂商的汇编器,不同厂商的汇编器及相应的链接器的语法会有差异,甚至完全不同,如GNU汇编。本书只涉及微软的汇编语言开发工具包。

本文摘自编程达人系列教材《X86汇编语言教程》。资料下载:www.bcdaren.com

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

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

相关文章

【React】react组件传参

【React】react组件传参 一、props:父组件向子组件传参1、将普通的参数作为props传递2、将jsx作为props传递(组件插槽) 二、自定义事件:子父组件向父组件传参三、context进行多级组件传参四、redux全局状态管理 一、props&#xf…

MySQL篇----第四篇

系列文章目录 文章目录 系列文章目录前言一、数据库的三范式是什么二、第一范式(1st NF - 列都是不可再分)三、第二范式(2nd NF- 每个表只描述一件事情)四、第三范式(3rd NF- 不存在对非主键列的传递依赖)五、数据库是事务前言 前些天发现了一个巨牛的人工智能学习网站,通…

C++迷宫游戏详解

个人主页:[PingdiGuo_guo] 收录专栏:[C干货专栏] 大家好呀,我是PingdiGuo_guo,今天我们来学习用C实现一个迷宫游戏。 目录 1.迷宫的具体步骤 1.1.迷宫的初始化 1.2.寻路算法 1.DFS算法 2.BFS算法 1.3.移动 2.总结 C迷宫游…

Javascript入门:第三个知识点:javascript里的数据类型、运算符

数字类型 123 //整数 123.1 //浮点数 1.123e3 //科学计数法 -10 //负数 NaN //not a number Infinity //无限大 以上的类型在javascript里都是数字类型 字符串类型 在开始之前,我需要先说明白两个知识点: console.log()是啥? let 与 v…

【C++初阶】C++入门(2)

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 文章目录 一、函数重载1.1 函数重载的概念1.2 函数重载的种类1.3 C支持函数重载的原理 二…

服务器常遇的响应状态码

服务器常遇的响应状态码 状态码 500 表示服务器内部错误。 这种状态码意味着服务器在尝试执行请求时遇到了意外情况。在处理这种状态码时,我们需要联系服务器管理员或服务提供商以获取更多信息。 处理方法:联系服务器管理员或服务提供商以获取更多信息…

Ubuntu中rosdep update报错的解决办法

1.问题: Ubuntu22.04系统下面,rosdep update总是报错 2.方法 2.1 方法一 a.直接访问raw.githubusercontent.com不可行,按一下网址查询raw.githubusercontent.com的ip地址 多个地点ping[raw.githubusercontent.com]服务器-网站测速-站长工…

计算机网络——链路层(1)

计算机网络——链路层(1) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家, [跳转到网站](https://www.captainbed.…

C语言第十七弹---指针(一)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 指针 1、内存和地址 1.1、内存 2、指针变量和地址 2.1、取地址操作符(&) 2.2、指针变量和解引用操作符(*)…

Tiktok东南亚商家如何通过直播活动提高直播流量和转化率?

一、什么是直播活动? 直播活动是帮助卖家在直播中有效推广商品和店铺的促销活动。 您报名参加直播活动后,您的直播将以活动品牌的形式突出展示。 您可以同时参与商品活动和直播活动,在直播中给买家提供超值优惠。 如何参加直播活动? 二、如何准备直…

[SWPUCTF 2021 新生赛]include

他让我们传入一个flag值 我们传入即可看到代码部分 传入一个php的伪类即可 得到经过Base64加密的flag,解密即可

Python基础知识:Python注释及print函数、input函数

在Python中,注释是对相应代码的解释,以增加代码的可读性,让用户能够更好地理解相应代码的含义。注释通过在相应代码后面加上“#”号来实现。比如以下代码 data.describe()#对数据集进行描述性分析 其中data.describe()为需要被执行的代码&a…

LED点阵屏(基于51单片机)

师从江科大 LED点阵屏 LED点阵屏由若干个独立的LED组成,LED以矩阵的形式排列,以灯珠亮灭来显示文字、图片、视频等。 LED点阵屏分类 按颜色:单色、双色、全彩 按像素:8*8、16*16等(大规模的LED点阵通常由很多个…

MySQL原理(三)锁定机制(2)表锁行锁与页锁

前面提到,mysql锁按照操作颗粒分类,一般认为有表级锁、行级锁、页面锁三种。其实还有一种特殊的全局锁。 锁场景问题全局锁全库逻辑备份加了全局锁之后,整个数据库都是【只读状态】,如果数据库里有很多数据,备份就会花…

BUUCTF-Real-ThinkPHP]5.0.23-Rce

漏洞介绍 这个版本容易存在我们都喜欢的rce漏洞! 网站为了提高访问效率往往会将用户访问过的页面存入缓存来减少开销。而Thinkphp 在使用缓存的时候是将数据序列化,然后存进一个 php 文件中,这使得命令执行等行为成为可能! ThinkP…

MySQL 数据库表的增删改查(基础版)

目录 1 前言(CRUD)2 新增(Create)2.1 全列插入2.2 指定列插入2.3 关于日期和时间的插入 3 查询(Retrieve)3.1 全列查询3.2 指定列查询3.3 查询字段为表达式3.4 取别名3.5 去重3.6 排序3.7 条件查询3.8 分页查询 4 更新(Update)5 删除(Delete) 1 前言(CRUD) CRUD : …

Springboot 自定义参数配置化,密钥,密码,文件保存路径

application.properties 和 application.yml 都是一样的配置方法,只是格式不一样 定义配置文件 server.port8080 image.save.pathE:\ #自定义文件保存路径读取配置文件 Value("${image.save.path}")private String filePath;//E:\优化配置文件 如果我参…

HashMap的扩容机制

HashMap简介 HashMap在底层数据结构上采用了数组+链表+红黑树,通过散列映射来存储键值对数据因为在查询上使用散列码(通过键生成一个数字作为数组下标,这个数字就是hash code)所以在查询上的访问速度比较快…

Redis实现登录的优化

目录 1 前言 2 实现步骤 2.1 软件环境准备 2.1.1 Redis的安装 2.1.2 在pom.xml中添加依赖 2.1.3 在application.yml中进行相关配置 2.2 StringRedisTemplate的常用方法 2.2.1 获取operations 2.2.2 主要方法 2.3 令牌主动失效机制 2.3.1 登录时将令牌存入Redis 2.…

分发饼干(c++题解)

题目描述 你是一位很棒的 OIer,想要给你的同学一些小饼干。但是,每个同学最多只能给一块饼干。对每个同学 ,都有一个胃口值 ,这是能让同学满足胃口的饼干的最小尺寸;并且每块饼干 ,都有一个尺寸 。如果 &a…