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

news2024/11/15 11:03:27

第五章 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.coloradmin.cn/o/1429894.html

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

相关文章

手机云控制发电机组 有网络随时随地操控监控运行

GenCloudTM 发电机组云控系统简介 Ver2.0 目录 公司简介…… …………………………… ………………………………………………1概 述…… …………………………… ………………………………………………1主要功能及特点………… …………… ………… ………………………………

JAVA基础 队列

排队取奶茶 时间限制:1.000S 空间限制:128MB 题目描述 假设有一家奶茶店,现在有一些人在排队等待取奶茶,同时也有人在取奶茶。 请你设计一个程序模拟这种情况下的奶茶队列管理。 假设每个人取奶茶的时间非常短,可…

【算法与数据结构】718、1143、LeetCode最长重复子数组 最长公共子序列

文章目录 一、718、最长重复子数组二、1143、最长公共子序列三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、718、最长重复子数组 思路分析: 第一步,动态数组的含义。 d p [ i ] [ j ] dp[i]…

《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(5)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第II篇 第4章 PCIe总线概述(4) 4.1.2 PCIe总线使用的信号 PCIe设备使用两种电源信号供电,分别是Vcc与Vaux,其额定电压为3.3V。其中Vcc为主电源,PCIe设备…

【前端web入门第三天】02 CSS字体和文本

文章目录: 1.字体 1.1 字体大小 1.2 字体粗细 1.3 字体样式 1.4 行高 1.5 字体族 1.6 font 复合属性 2. 文本 2.1 文本缩进2.2 文本对齐方式2.3 文本修饰线2.4 color文字颜色 1.字体 1.1 字体大小 属性名: font-size属性值:文字尺寸,PC端网页最常用的单位px …

java通过反射获取表名以及表的全部字段

目录 前言获取表名获取表字段获取表字段并且以object类返回 前言 市面上找了一下能够获取表名和表字段的方法,最后结果不是很理想,于是自己写一套 获取表名 //获取表名public static String getTableName(Object object) {Field[] fields object.getC…

python_蓝桥杯刷题记录_笔记_全AC代码_入门2

前言 现在正式进入蓝桥杯的刷题啦,用python来做算法题,因为我之前其实都是用C来做题的,但是今年的话我打算换python来试试,很明显因为也才这学期接触python 加上之前C做题也比较菜,所以我打算用python重新来做题&#…

Navicat的使用教程,操作详解

这篇文章主要针对mysql数据库。 在使用Navicat之前,首先要确保你在本地已经安装好了,mysql数据库,安装教程可以参考我的另一篇博文 在windows平台上mysql的安装教程-CSDN博客 1.Navicat连接你的数据库 连接名,随便写&#xff0c…

TCP/IP详细介绍以及TCP/IP寻址

目录 ​编辑 1. TCP/IP 介绍 2. 计算机通信协议(Computer Communication Protocol) 3. 什么是 TCP/IP? 4. 在 TCP/IP 内部 5. TCP 使用固定的连接 6. IP 是无连接的 7. IP 路由器 8. TCP/IP 9. TCP/IP 寻址 10. IP地址 …

Linux下新建用户

新建用户 sudo adduser -m username添加密码 sudo passwd username设置权限 sudo vi /etc/sudoers在user privilege这一行,仿照root,另起一行,添加上 设置命令解释器 sudo vi /etc/passwd找到新建用户名,将sh改为bash vi中…

在Linux中如何理解页表和进程地址

1、进程地址是进程读取资源的窗口 2、页表决定了进程真实拥有的资源情况 3、合理的对进程地址空间页表进行资源划分,就可以对进程的资源进行分类 这个过程应该如何去理解呢请看下面的图 我们知道程序被加载到进程中,会产生相应的PCB,并且…

react 之 useCallback

简单讲述下useCallback的使用方法,useCallback也是用来缓存的,只不过是用于做函数缓存 // useCallbackimport { memo, useCallback, useState } from "react"const Input memo(function Input ({ onChange }) {console.log(子组件重新渲染了…

python_蓝桥杯刷题记录_笔记_全AC代码_入门4

题单目录 1.P1914 小书童——凯撒密码 2.P1028 [NOIP2001 普及组] 数的计算 3.P1036 [NOIP2002 普及组] 选数 4.P1149 [NOIP2008 提高组] 火柴棒等式 5.P1217 [USACO1.5] 回文质数 Prime Palindromes 6.P1478 陶陶摘苹果(升级版) 7.P1618 三连击&…

第二代视频换脸工具facefusion

GitHub - facefusion/facefusion: Next generation face swapper and enhancer官方地址 1.环境安装 Windows - FaceFusion Windows Python winget install -e --id Python.Python.3.10 PIP python -m ensurepip --upgrade GIT winget install -e --id Git.Git

【Go语言成长之路】安装Go

文章目录 安装Go一、下载Go语言安装包二、删除以前安装的Go版本三、添加/usr/local/go/bin到环境变量内四、确认安装成功 安装Go Note: 这里只演示安装Linux版本的Go,若为其它版本,请按照官网的安装教程进行安装即可。 一、下载Go语言安装包 ​ 在浏览…

1Panel应用推荐:青龙定时任务管理平台

1Panel(github.com/1Panel-dev/1Panel)是一款现代化、开源的Linux服务器运维管理面板,它致力于通过开源的方式,帮助用户简化建站与运维管理流程。为了方便广大用户快捷安装部署相关软件应用,1Panel特别开通应用商店&am…

STM32--USART串口(1)串口协议

一、通信接口 全双工:通信双方能够同时进行双向通信; 半双工:通信双方能够进行双向通信,但不能同时通信; 单工:只能从一个设备到另一个设备; 同步:接收方可以在时钟信号的指引下进…

银行数据仓库体系实践(8)--主数据模型设计

主数据区域中保留了数据仓库的所有基础数据及历史数据,是数据仓库中最重要的数据区域之一,那主数据区域中主要分为近源模型区和整合(主题)模型区。上一节讲到了模型的设计流程如下图所示。那近源模型层的设计在第2.3和3这两个步骤…

市场分析:共享wifi项目怎么样?

共享WiFi项目怎么样?这是很多人都想知道的问题。随着移动互联网的快速发展,WiFi已经成为人们生活中必不可少的一部分。而共享WiFi项目则通过为用户带来了更加便捷、快速的上网体验。那么,共享WiFi项目到底怎么样呢? 人们对网络的需…

Linux软件编程以及IO输入输出——linux——day1

Linux软件编程以及其IO输入输出 Linux软件编程 linux是操作系统的内核 主要有以下几个功能: ①管理CPU ②管理内存 ③管理硬件设备 ④管理文件系统 ⑤任务调度 shell指令 shell命令主要保护Linux内核(用户和Linux内核不直接操作,通过操作Shell,Shell和内核交互…