[笔记] x86汇编语言:从实模式到保护模式之第四章 汇编语言和汇编软件

文章目录

  • [4.1 汇编语言程序](#4.1 汇编语言程序)
  • [4.2 NASM编译器](#4.2 NASM编译器)
    • [4.2.1 NASM的下载和安装](#4.2.1 NASM的下载和安装)
    • [4.2.2 代码的书写和编译过程](#4.2.2 代码的书写和编译过程)
    • [4.2.3 用HexView观察编译后的机器代码](#4.2.3 用HexView观察编译后的机器代码)
  • [4.3 配书文件包的下载和使用](#4.3 配书文件包的下载和使用)
  • 总结
  • 参考

4.1 汇编语言程序

前面的章节里已经简单介绍过汇编语言及其产生的背景,所以我们知道,汇编语言提供了机器指令的人工可读形式,或者说助记形式,而且与机器指令是一一对应的。

另外,不同的处理器具有不同的指令集和指令的操作方式,并因此形成了不同的处理器架构,比如英特尔的x86架构和摩托罗拉68K架构。因此,针对不同的处理器架构,汇编语言将提供不同的助记形式。实际上,即使是针对同一种处理器架构,也可能会有人使用本质上一样,但风格不同的助记形式。比如说,针对英特尔x86架构的处理器,就有AT&T和INTEL公司自己的风格。在本书中,我们将采用英特尔风格的汇编语言助记形式。

汇编语言助记形式特点及过程:

  • 用英文+寄存器的方式

    例如,mov ax,0x3f,mov是move的简化形式,意思是"移动"或者"传送"。至于"ax",很明显,指的就是寄存器AX。传送指令需要两个操作数,分别是目的操作数和源操作数,它们之间要用逗号隔开。在这里,AX是目的操作数,源操作数是3FH。

  • 操作数可以直接使用十六进制,例如0x3f,十进制63,二进制00111111B形式

  • 用汇编语言提供的符号书写的文本,叫作汇编语言源程序,为此,你需要一个字处理器软件,比如Windows记事本。

  • 要将汇编语言源程序转换成机器指令,这个过程叫作编译(Compile)。在编译的时候,汇编语言编译器的作用是将mov、add、ax、bx等这些符号组合起来,转换成类似于数值的机器指令,这个过程叫作汇编,这就是汇编语言的由来,也有人称之为组合语言。

  • 编译肯定还需要依靠一个软件,称为编译器,或编译软件.

  • 编写(记事本, asm)--> 编译(编译器)成机器指令(obj)--> 存放为二进制文件(exe)--> 加载文件到内存,处理器从内存取指令执行 (指令)

    字处理器软件生成的是汇编语言源程序文件。编译软件的任务是读取这些文件,将那些符号转变成二进制形式的机器指令代码。它把这些机器指令代码存放到另一个文件中,叫作二进制文件或者可执行文件,比如Windows里以".exe"为扩展名的文件,就是可执行文件。当需要用处理器执行的时候,再加载到内存里。

4.2 NASM编译器

现存的汇编语言编译器有多种,用得比较多的有:

  • NASM
  • MASM
  • FASM
  • TASM
  • AS86
  • GASM

本文主要以NASM编译器为主

4.2.1 NASM的下载和安装

NASM的全称是Netwide Assembler,它是可免费使用的开源软件。

下面是它的官方网站,从这里可以找到它的帮助和开发文档、源代码,以及DOS、Linux、MacOS、32位Windows、64位Windows下的安装包:

复制代码
https://www.nasm.us/

环境:

下载安装后记得将安装目录,添加到环境变量Path中

4.2.2 代码的书写和编译过程

使用nasm编写

编写过程:

  • 创建 .asm 文件 如example.asm
  • 将文件编译成机器代码
    • 具体打开cmd,cd 进入到example.asm所在文件夹
    • 执行nasm -f bin exam.asm -o exam.bin 参数解释:
      • -f参数的作用是指定输出文件的格式(Format)。这样,-f bin就是要求NASM生成的文件只包含"纯二进制"的内容。
      • exam.asm是源程序的文件名,它是将要被编译的对象
      • -o参数指定编译后输出(Output)的文件名。在这里,我们要求NASM生成输出文件exam.bin。
      • exam.bin是编译后输出文件
    • 会在当前目录找到exam.bin文件 这就是编译完成二进制文件

使用Nasmide编辑器

书作者推荐使用Nasmide编辑器软件,对应的资料中有该软件的安装包。

配置编译器路径

不细讲,都是编程老兵了,编辑器都是浮云。

4.2.3 用HexView观察编译后的机器代码

HexView

本节主要是看看在hexview中编译前的源文件和编译后的源文件

  • 有什么特点
    • 地址(左)+ 16进制(中) + ASCII 码值(右)组成,(图4-8)
  • 在文件中以十六进制是如何展示的
    • 以十六进制展示字符的ASCII码

下载地址:https://hexview.apponic.com/

用hexview打开编译后的二进制文件exam.bin

4.3 配书文件包的下载和使用

复制代码
https://www.lizhongc.com/

总结

如图4-8所示:

  • 源程序共有3行,每行第一个字符在文件内的偏移量分别是0,0x35, 0x40 (提示:每行首地址+偏移量
  • 该源程序文件的大小是0x49=0x40+9

参考

书资料:https://www.lizhongc.com/thread-1-1-1.html

习题答案:https://www.cnblogs.com/leec/p/8150645.html

相关推荐
Yawesh_best6 小时前
告别系统壁垒!WSL+cpolar 让跨平台开发效率翻倍
运维·服务器·数据库·笔记·web安全
资料,小偿7 小时前
4.1.2基于51单片机汇编语言出租车计价器proteus仿真出租车计价器,汇编语言51单片机
汇编·51单片机·proteus
Ccjf酷儿9 小时前
操作系统 蒋炎岩 3.硬件视角的操作系统
笔记
习习.y9 小时前
python笔记梳理以及一些题目整理
开发语言·笔记·python
在逃热干面10 小时前
(笔记)自定义 systemd 服务
笔记
DKPT11 小时前
ZGC和G1收集器相比哪个更好?
java·jvm·笔记·学习·spring
QT 小鲜肉12 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇
笔记·读书·孙子兵法
星轨初途13 小时前
数据结构排序算法详解(5)——非比较函数:计数排序(鸽巢原理)及排序算法复杂度和稳定性分析
c语言·开发语言·数据结构·经验分享·笔记·算法·排序算法
QT 小鲜肉14 小时前
【孙子兵法之上篇】001. 孙子兵法·计篇深度解析与现代应用
笔记·读书·孙子兵法
love530love16 小时前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui