第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…...
SDMatte Web前端性能优化:大图片上传与预览的流畅体验实现
SDMatte Web前端性能优化:大图片上传与预览的流畅体验实现 1. 引言:大图片处理的用户体验痛点 在图像处理类Web应用中,用户上传大尺寸图片时常常面临几个典型问题:上传速度慢、页面卡顿、预览效果差。以SDMatte这样的智能抠图工…...
Qwen3-ASR-0.6B语音识别:开箱即用,支持多语言多方言
Qwen3-ASR-0.6B语音识别:开箱即用,支持多语言多方言 1. 为什么你需要一个开箱即用的语音识别方案 如果你正在寻找一个能快速上手的语音识别工具,可能会遇到这样的困扰:要么模型太大,部署起来太复杂;要么功…...
Face Swap API 集成与使用指南
在当今数字化时代,图像处理技术越来越受到开发者的关注。Face Swap API 是一个强大的工具,它能够将目标图像中的人脸与源图像中的人脸进行交换。本文将详细介绍如何集成和使用 Face Swap API,帮助你快速上手这项技术。 简介 Face Swap API …...
Phi-3-vision-128k-instruct代码生成辅助:将UI设计稿截图转换为前端代码描述
Phi-3-vision-128k-instruct代码生成辅助:将UI设计稿截图转换为前端代码描述 1. 引言:设计稿转代码的痛点与解决方案 每次拿到设计师发来的Figma或Sketch文件,前端开发者都要面对一个耗时的工作:把视觉设计转化为可运行的代码。…...
translategemma-4b-it开源可部署:MIT协议+完整权重公开,支持商用二次开发
translategemma-4b-it开源可部署:MIT协议完整权重公开,支持商用二次开发 1. 快速了解TranslateGemma-4b-it TranslateGemma是Google基于Gemma 3模型系列构建的轻量级开源翻译模型。这个4b-it版本特别适合想要在本地环境部署翻译服务的开发者和企业。 …...
免费获取数字资源的创新方法
免费获取数字资源的创新方法 在信息爆炸的时代,我们每天都被海量数字资源包围,却常常因付费墙、访问限制而望洋兴叹。你是否曾遇到这样的困境:发现一篇重要研究论文却被要求订阅付费?找到心仪的学习视频却被告知仅限会员观看&…...
据传某大厂西安研究所一个女员工,终身合同耗了三年不走,今年被hr带着保安抬出公司了。
点击上方“码农突围”,马上关注 这里是码农充电第一站,回复“666”,获取一份专属大礼包 真爱,请设置“星标”或点个“在看”这是【码农突围】的第 494 篇原创分享作者 l 突围的鱼来源 l 码农突围(ID:smarty…...
Android NFC开发实战:从基础到应用场景解析
1. Android NFC技术入门指南 第一次接触NFC开发时,我被这个看似简单却功能强大的技术深深吸引。NFC(近场通信)就像给你的手机装上了"电子触角",只需要轻轻一碰就能完成数据传输。与蓝牙、WiFi相比,NFC的最大…...
AI基础设施权力更迭:AWS Bedrock 凭什么在 2026 年让开发者集体“倒戈”?
声明:本文由AI编辑生成,内容仅供参考。文中涉及的行业判断、平台能力分析、商业趋势推演与产品价值描述,均基于公开资料、通用观察及示意性表达整理,不构成任何商业承诺、采购建议、投资建议或服务保证。实际产品能力、接口支持范…...
当AI能做一切,我们还剩下什么?
许多人以为,数字化就是用机器取代人。算法越来越聪明,自动化越来越普及,人的作用似乎正在被削弱。 事实恰恰相反。 数字化不是人的退场,而是人的升级。技术每向前推进一步,对人的要求就提高一层。机器负责执行…...
