【新书推荐】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.mfbz.cn/a/366244.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vulnhub billu b0x

0x01 环境搭建 1. 从官方下载靶机环境,解压到本地,双击OVF文件直接导入到vmware虚拟机里面。2. 将虚拟机的网络适配器调成NAT模式,然后开机即可进行操作了。 0x02 主机发现 nmap -sn 192.168.2.0/24 成功获取靶机IP为192.168.2.129。 0x0…

sqli.labs靶场(23关到28a关)

23、第二十三关 id1单引号闭合 找位置1 and 12 union select 1,2,3 爆库:1 and 12 union select 1,2,database() 爆表名:1 and 12 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemasecurity 爆字段&#…

【大数据】Flink SQL 语法篇(二):WITH、SELECT WHERE、SELECT DISTINCT

Flink SQL 语法篇(二) 1.WITH 子句2.SELECT & WHERE 子句3.SELECT DISTINCT 子句 1.WITH 子句 应用场景(支持 Batch / Streaming):With 语句和离线 Hive SQL With 语句一样的,语法糖 1,使用…

谷歌seo搜索引擎优化需要做什么?

当你要做谷歌seo,经手一个你之前没有接触过的网站,你首先要做的就是分析网站当前的流量数据,如果是新站自然不需要这一步,不过数据分析依旧是件很重要的事情,做seo不懂得分析数据相当于白做 再来就是你要了解网站所在的…

卸载Ubuntu双系统

卸载Ubuntu双系统 我们卸载Ubuntu双系统,可能出于以下原因: 1、Ubuntu系统内核损坏无法正常进入 2、Ubuntu系统分配空间不足,直接扩区较为复杂 3、以后不再使用Ubuntu,清理留出空间 123无论出于哪种原因,我们都是要…

柔性电流探头方向判断有哪些方法?干货分享!

柔性电流探头方向判断的方法干货分享!从理论到实践,助您成为专业人士!干货收藏,快看起来吧!      柔性电流探头方向判断一直是电力行业测试中的关键问题之一,确切地判断电流方向对于测试电力系统的稳定…

【GitHub项目推荐--一个由OpenAI提供支持的聊天机器人和虚拟助手的构建平台】【转载】

Botpress Botpress是一个开源项目,它提供了一个平台,用于构建、部署和管理基于人工智能的聊天机器人和虚拟助手 github地址: https://github.com/botpress/botpress Botpress的介绍 Botpress是一个开源项目,它提供了一个平台&…

ROS2 Humble学习笔记 (2)

本文发表于个人的github pages。因csdn本身显示插件和转载过程中导致显示不太友好。建议大家阅读原文。想查看完整内容,请移步到ROS2 Humble学习笔记2。 本文篇幅较长,可抽空按照章节阅读。本文只作为对入门教程的一种浮现和提升。 一、前言 在上一篇…

Spring框架——主流框架

文章目录 Spring(轻量级容器框架)Spring 学习的核心内容-一图胜千言IOC 控制反转 的开发模式Spring快速入门Spring容器剖析手动开发- 简单的 Spring 基于 XML 配置的程序课堂练习 Spring 管理 Bean-IOCSpring 配置/管理 bean 介绍Bean 管理包括两方面: Bean 配置方式基于 xml 文…

2023年上-未来几年我要做什么

1月份,离职。 2月份,春节休假回来,中旬去参加了一个月的瑜伽培训,学会了倒立、鹤蝉。。。。 3月份,瑜伽培训结束,开始收拾房子,并调研各类项目。 4月份,参与了朋友的区块链项目 …

echarts step line

https://ppchart.com/#/ <template><div class"c-box" ref"jsEchart"></div> </template><script> import * as $echarts from echarts // 事件处理函数 export default {props: {// 需要传递的数据data: {type: Array,defa…

Day06-Linux下目录命令讲解及重要文件讲解

Day06-Linux下目录命令讲解及重要文件讲解 1. Linux目录文件1.1 Linux系统目录结构介绍1.1.1 Linux与Windows目录结构对比 1.2 重要的Linux配置文件介绍1.2.1 /etc系统初始化及设置相关重要文件1.2.2 /usr目录的重要知识介绍------应用程序目录1.2.3 /var目录下的路径知识-----…

thinkphp项目之composer快速安装使用

引言 由于项目的需求&#xff0c;thinkphp项目使用到composer。网上搜索有一堆的教程使用&#xff0c;根据自己的需要摸索了下。 步骤 1. 安装phpstudy v8&#xff0c;这个经常用的运行环境&#xff0c;方便好多开发者。安装教程一步一步到最后就行。 2. 安装composer组件&a…

Github 2F2【解决】经验帖-PPHub登入

最近在做项目时,Github总是出问题,这是一经验贴 Github 2F2登入问题【无法登入】PPhub 2F2是为了安全,更好的生态 启用 2FA 二十八 (28) 天后,要在使用 GitHub.com 时 2FA 检查 物理安全密钥、Windows Hello 或面容 ID/触控 ID、SMS、GitHub Mobile 都可以作为 2F2 的工…

CTF特训(二):青少年CTF-MISC部分WP

FLAG&#xff1a;当觉得自己很菜的时候&#xff0c;就静下心来学习 专研方向:MISC&#xff0c;CTF 每日emo&#xff1a;听一千遍反方向的钟&#xff0c;我们能回到过去吗&#xff1f; CTF特训(二)&#xff1a;青少年CTF-MISC部分WP&#xff1a; 文章目录 CTF特训(二)&#xff1…

LeetCode:283. 移动零

283. 移动零 1&#xff09;题目2&#xff09;代码方法一&#xff1a;两层for循环方法二&#xff1a;使用双指针 3&#xff09;结果方法一结果方法二结果 1&#xff09;题目 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的…

计算机毕业设计 | SpringBoot 房屋租赁网 房屋租赁平台(附源码)

1&#xff0c;绪论 1.1 背景调研 在房地产行业持续火热的当今环境下&#xff0c;房地产行业和互联网行业协同发展&#xff0c;互相促进融合已经成为一种趋势和潮流。本项目实现了在线房产平台的功能&#xff0c;多种技术的灵活运用使得项目具备很好的用户体验感。 这个项目的…

day24打卡

day24打卡 思路&#xff1a;画出决策树&#xff0c;暴力枚举。子集问题 决策树&#xff1a; 函数头&#xff1a;void dfs(int n, int k, int pos) 函数体&#xff1a; ​ 出口&#xff1a;全局变量count k 保存结果到全局变量ret中 ​ 子问题&#xff1a;从pos位置向后变…

Linux服务详解

如有错误或有补充&#xff0c;以及任何改进的意见&#xff0c;请在评论区留下您的高见&#xff0c;同时文中给出大部分命令的示例&#xff0c;即是您暂时无法在Linux中查看&#xff0c;您也可以知道各种操作的功能以及输出 如果觉得本文写的不错&#xff0c;不妨点个赞&#x…

C++ //练习 3.36 编写一段程序,比较两个数组是否相等。再写一段程序,比较两个vector对象是否相等。

C Primer&#xff08;第5版&#xff09; 练习 3.36 练习 3.36 编写一段程序&#xff0c;比较两个数组是否相等。再写一段程序&#xff0c;比较两个vector对象是否相等。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /******…
最新文章