第4章 汇编语言和汇编软件
第4章 汇编语言和汇编软件
该章主要介绍了汇编语言和汇编语言编译器的安装和使用。
汇编语言程序
该小节主要介绍了为什么要有汇编语言和汇编语言程序的一些基础写法。
书中有提到CPU有不同的架构,汇编语言有不同的风格,那么不同的CPU架构和不同的汇编风格到底是什么关系呢?有些东西如果不了解全貌,感觉身在此山中呢!
为了厘清这些个东西,继续搜资料(资料链接参见文章尾部),最后整理出汇编风格、编译器和指令集这3类。

备注:编译器和CPU(指令集)架构没有列全,这里主要是列一些主要的。
这三大类之间的关系是什么呢?因为编译器是将汇编代码编译成机器代码的程序,理论上来说编译器可以决定风格和支持的CPU架构,故列一个表格进行说明就清晰了。

该书汇编主要采用NASM编译器,Intel的风格,支持x86和x86-64架构,这下就清晰多了,知道自己学习的是其中哪个汇编了,位于整体中的哪个位置了。
书中列举了一些例子,这里摘录如下:
mov ax,3FH ;将立即数3EH传送到寄存器ax中
add bx,ax ;将寄存器bx的内容和寄存器ax的内容相加,结果在bx中
add cx,ax ;将寄存器cx的内容和寄存器ax的内容相加,结果在cx中
3FH最后个H字母表明这是一个十六进制数,但是很多高级语言中,都是添加0x前缀:
mov ax,0x3F
作者提到为什么是用0x?没有找到原因。我尝试去找了一下,找到一篇 stackexchange 上一篇文章,链接见文末,大概得意思就是说:
- BCPL语言 使用了#b表示二进制、#o表示八进制、 #x 表示十六进制;
- B语言 放弃了 # 这种方式,采用 0 作为前缀表示八进制。又因为当时八进制和机器架构更加适合,所以就没有设计十六进制的表示方式。
- C语言 时代十六进制和机器架构更合适,所以结合B语言和BCPL语言就用了0x表示了。
作者如果有看到这篇文章,能否请我喝杯咖啡哈?
如果不习惯十六进制,0x3F也可以用二进制和十进制代替:
mov ax,63 ;十进制,末尾可以加D如63D,也可以不加。
mov ax,00111111B ;二进制末尾要加1个B
几个进制之间列个表格就更加清楚了:

其实B、O、D、H就是对应英文单词的首字母,英文好的话对变成帮助真的很大。
另外在网上搜索相关资料时,发现了汇编语言的层级介绍,遂摘录在此。

从图中可以看出Assembly Language处于机器语言和高级语言之间,但是据我了解,现在也有高级语言直接翻译成机器语言了,不用经过汇编了。如C、Ruby、Go、Java、C#等。
NASM编译器
该小节介绍了NASM的安装和使用,以及用什么IDE编写汇编和如何查看编译后二进制编码。
NASM的下载和安装
NASM的全称是Netwide Assembler,它是可免费使用的开源软件,并且可以支持Linux、Windows、MacOS等多平台。
NASM官网:https://www.nasm.us
然后跟着书本讲解,进行操作交作业。我的电脑是Win10,所以下载了Windows 64位的,并安装在了:D\Env\NASM 目录。
然后配置Path环境变量:

代码的书写和编译过程
书中作者自己编写了一个Nasmide软件编写汇编,只是我没有用,我自己习惯是用Visual Studio Code,然后在增强版的CMD工具 PowerShell 里进行编译。
Visual Studio Code我是安装这个插件:x86 and x86_64 Assembly,显示效果也不错:

PowerShell 一开始敲命令还挺麻烦的,但是敲了第一次后,可以通过 ctrl+r 进行历史命令查找还是挺方便的。

常用命令格式:
nasm -f bin exam.asm -o exam.bin -l exam.lst
- f bin:表示生成的文件只包含纯二进制的,只有处理器能够识别的代码。
- -o:输出的二进制文件,运行就是用这个文件。
- -l:输出的汇编列表文件,方便debug用。
用HexView观察编译后的机器代码
生成二进制文件后,调试的时候经常会需要查看二进制文件,所以如果能转成16进制查看就比较友好。
书中作者介绍了 HexView 软件可以进行查看,我还是习惯用 Visual Studio Code ,想着是否有插件支持,于是在插件库搜索 Hex,发现了 Hex Editor 这个插件,安装后:
右击文件 -> Open With -> 多了一个Hex Editor选项 选择 Hex Editor 打开,效果感觉也不错,如下图:

不得不说,Visual Studio Code 确实很强大。
配书文件包的下载和使用
作者提供了书籍配套的源码和工具包,除了源码编码是gb2312的,我都一一转成了utf-8,其他没有发现什么问题,真的是非常给力。

本章习题
开始写作业了。作业要用到图4-8,摘录在此。

对应的源码是:
mov ax,0x3f ;将0x3f传送到AX寄存器
add bx,ax
add cx,ax
如图4-8所示,请问:
- 源程序共有3行,每行第一个字符在文件内的偏移量分别是多少?
- 第一行第一个字符m在文件内的偏移量是 0;
- 第二行第一个字符a在文件内的偏移量是 0x35;
- 第三行第一个字符a在文件内的偏移量是 0x40;

- 该源程序文件的大小是多少字节?
最后一个字符的偏移地址是 0x49,所以源程序文件大小就是 0x49+1=0x50 字节了。(偏移地址从0开始计算)
参考资料
- 处理器架构、指令集和汇编语言,三者有何关系? - young cc的回答 - 知乎
- 编程语言-2-处理器架构、指令集和汇编语言_指令集和芯片 汇编的区别-CSDN博客
- 不同汇编语言的对比_汇编语言版本区分-CSDN博客
- 常见CPU架构、产品、指令集、特点 - 程序员老吴的文章 - 知乎
- Introduction to Assembly Language with Examples - Just Code
- history - Where and when did the 0x convention for hexadecimal literals originate? - Retrocomputing Stack Exchange
相关文章:
第4章 汇编语言和汇编软件
第4章 汇编语言和汇编软件 该章主要介绍了汇编语言和汇编语言编译器的安装和使用。 汇编语言程序 该小节主要介绍了为什么要有汇编语言和汇编语言程序的一些基础写法。 书中有提到CPU有不同的架构,汇编语言有不同的风格,那么不同的CPU架构和不同的汇…...
网络安全在2024好入行吗?
前言 024年的今天,慎重进入网安行业吧,目前来说信息安全方向的就业对于学历的容忍度比软件开发要大得多,还有很多高中被挖过来的大佬。 理由很简单,目前来说,信息安全的圈子人少,985、211院校很多都才建立…...
C++练习
要求 1. 函数命名清晰 使用描述性的命名,准确反映函数的功能。例如,使用 CalculateSum() 而不是 sum()。避免使用缩写或模糊不清的名字,确保变量和函数名有明确的含义。 2. 参数传递 根据需要选择按值传递、按引用传递或按指针传递。如果…...
3. GIS后端工程师岗位职责、技术要求和常见面试题
本系列文章目录: 1. GIS开发工程师岗位职责、技术要求和常见面试题 2. GIS数据工程师岗位职责、技术要求和常见面试题 3. GIS后端工程师岗位职责、技术要求和常见面试题 4. GIS前端工程师岗位职责、技术要求和常见面试题 5. GIS工程师岗位职责、技术要求和常见面试…...
Linux学习笔记(4)----Debian压力测试方法
使用命令行终端压力测试需要两个实用工具:s-tui和stress sudo apt install s-tui stress 安装完成后,在终端中启动 s-tui实用工具: s-tui 执行后如下图: 你可以使用鼠标或键盘箭头键浏览菜单,然后点击“压力选项(Str…...
xml详解
一、XML是什么 XML(可扩展标记语言)是一种非常常用的数据存储和交换格式。 二、XML 的基本结构 声明 XML 文件通常以 XML 声明开始,例如:<?xml version"1.0" encoding"UTF-8"?>。它指定了 XML 的版…...
C140 杨辉三角
C140 杨辉三角 题目题解(94)讨论(102)排行面经 new 简单 通过率:29.57% 时间限制:1秒 空间限制:256M 知识点C工程师牛客 校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,…...
C++字符串操作中的陷阱
休对故人思故国,且将新火试新茶。诗酒趁年华。 ——《望江南超然台作》【宋】苏轼 目录 正文: 首先我们要明白出现问题的原因: 1. 缓冲区溢出 2. 错误的字符串声明方式 3. 缺乏对NULL指针的检查 解决方案: 下期预告:C字符串…...
最值求解 | 管理类联考数学专项
日期内容2024.9.5新建2024.9.6曦曦求最值完结 实数求最值至少至多抽屉原理工程问题线性规划一次性绝对值求最值 参考: b站跟着曦曦老师玩转【最值】...
C++_继承详解
继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。继承呈现了面向对象程序设计的层次结构,之前我们接触的复用都是函数复用,今天我们所讨…...
区块链开发解决方案有哪些
区块链开发解决方案概述 区块链开发解决方案旨在利用区块链技术构建和开发新型应用和系统,以解决各种业务问题和提升效率。区块链作为一种基于密码学的分布式账本技术,通过将交易和数据记录在不可篡改的区块中,并通过网络中的多个节点共同验…...
Express与SQLite集成教程:轻松实现数据库操作
Express使用SQLite的教程可以大致分为以下几个步骤。以下是一个详细的指南,帮助你在Express项目中集成SQLite数据库。 1. 安装必要的库 首先,你需要在你的Express项目中安装sqlite3库。打开终端或命令提示符,切换到你的项目目录,…...
Transforms的常见用法
文章目录 一、封装函数与普通函数的用法区别二、Image.open()打开图片的格式三、ToTensor打开图片格式四、ToTensor使用五、Normalize归一化使用六、Resize的使用七、Compose - Resize 使用八、RandomCrop() 随机裁剪用法 一、封装函数与普通函数的用法区…...
js 创建 React 项目
起因(目的): js 很久没写了。 react js 之前粗略看过, 最近又需要用到, 继续学习, 记录 积累。 1. 新建 React 项目 的几种方法。 官方建议使用 next 来创建 React 项目, 但是我觉得太复杂了。以后再看看. npx create-next-applatest # !!! 不建议使…...
WPF 中常用 `Transform` 类的介绍、使用示例和适用场景
WPF 中常用 Transform 类的介绍、使用示例和适用场景 使用场景解释代码示例示例代码解释 Transform 类描述使用示例适用场景TranslateTransform用于沿 X 轴或 Y 轴平移(移动)元素。xml <TranslateTransform X"50" Y"100" />移…...
ElasticSearch-DSL
查询所有 match_all 分页查询 from size深分页查询 Scroll指定字段排序 sort返回指定字段_sourcematch 短语查询 match_phrase多字段查询 multi_matchquery_string simple_query_string 关键词查询 Term 结构化搜索 前缀查询 prefix通配符查询 wildcard范围查询 range多 id 查…...
Learn ComputeShader 07 Post Processing
这次我们将使用计算机着色器对图像进行后处理。 要进行后处理需要将渲染图像从cpu传递给gpu,并在gpu对图像进行处理然后传回cpu。 首先创建一个后处理基类BasePP 首先声明需要用到的属性。 using System.Collections; using System.Collections.Generic; using …...
初始QT!
作业:了解QT文件夹初始代码的意义 QT core gui #QT工程所需得类库 core是核心库 gui图形化界面相关库类 greaterThan(QT_MAJOR_VERSION, 4): QT widgets #版本超过4.0会加上widgetsCONFIG c11 #该编辑器支持c11后的版本 # The following define makes you…...
全国大学生数据建模比赛——深度学习
全国大学生数学建模比赛中,深度学习可以成为解决复杂问题的有力手段。 一、深度学习的优势在比赛中的体现 强大的模式识别能力:深度学习模型,如卷积神经网络(CNN)和循环神经网络(RNN)࿰…...
Qt技巧(二)-滑动界面,轮询控件,循环操作控件
在Qt界面开发过程中,我们常常要对同类部件,具有同样功能的一系列部件进行操作,比如: 这个页面该怎么设计,中间的几个选项该怎么操作? 我们在主工程中添加一个设计师界面类,类名设置为“BrandF…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
