第4章 汇编语言和汇编软件

第4章 汇编语言和汇编软件

该章主要介绍了汇编语言和汇编语言编译器的安装和使用。

汇编语言程序

该小节主要介绍了为什么要有汇编语言和汇编语言程序的一些基础写法。

书中有提到CPU有不同的架构汇编语言有不同的风格,那么不同的CPU架构和不同的汇编风格到底是什么关系呢?有些东西如果不了解全貌,感觉身在此山中呢!

为了厘清这些个东西,继续搜资料(资料链接参见文章尾部),最后整理出汇编风格、编译器和指令集这3类。

image

汇编风格、编译器和CPU(指令集)架构整理

备注:编译器和CPU(指令集)架构没有列全,这里主要是列一些主要的。

这三大类之间的关系是什么呢?因为编译器是将汇编代码编译成机器代码的程序,理论上来说编译器可以决定风格和支持的CPU架构,故列一个表格进行说明就清晰了。

image

不同的编译器的汇编风格和支持的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

几个进制之间列个表格就更加清楚了:

image

0x3F各进制之间的表示

其实B、O、D、H就是对应英文单词的首字母,英文好的话对变成帮助真的很大。

另外在网上搜索相关资料时,发现了汇编语言的层级介绍,遂摘录在此。

image

High Level and Low Level Language(来源参考文章末尾)

从图中可以看出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环境变量:

image

NASM配置环境变量

代码的书写和编译过程

书中作者自己编写了一个Nasmide软件编写汇编,只是我没有用,我自己习惯是用Visual Studio Code,然后在增强版的CMD工具 PowerShell 里进行编译。

Visual Studio Code我是安装这个插件:x86 and x86_64 Assembly,显示效果也不错:

image

Visual Studio Code编写汇编

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

image

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 打开,效果感觉也不错,如下图:

image

Visual Studio Code查看二进制文件

不得不说,Visual Studio Code 确实很强大。

配书文件包的下载和使用

作者提供了书籍配套的源码和工具包,除了源码编码是gb2312的,我都一一转成了utf-8,其他没有发现什么问题,真的是非常给力。

image

书籍配套的源码和工具包

本章习题

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

image

图片来源书籍

对应的源码是:

mov ax,0x3f          ;将0x3f传送到AX寄存器
add bx,ax
add cx,ax

如图4-8所示,请问:

  1. 源程序共有3行,每行第一个字符在文件内的偏移量分别是多少?
  • 第一行第一个字符m在文件内的偏移量是 0;
  • 第二行第一个字符a在文件内的偏移量是 0x35;
  • 第三行第一个字符a在文件内的偏移量是 0x40;

image

  1. 该源程序文件的大小是多少字节?
    最后一个字符的偏移地址是 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/409668.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

日常维护交换机,看看这些老网工怎么说

号主:老杨丨11年资深网络工程师,更多网工提升干货,请关注公众号:网络工程师俱乐部 晚上好,我的网工朋友。 交换机作为连接各个节点的核心设备,其稳定性和可靠性直接关系到整个网络系统的健康运行。 路由器…

vue开发区分开发环境和生产环境,以及预发布环境

vue开发区分开发环境和生产环境,以及预发布环境 在根目录创建 .env[mode] 文件,在项目执行 npm run dev 的时候vite会自动去读取.env.development文件里面的配置,执行npm runbuild进行打包之后也会自动将.env.production的内容打包进去&…

Kafka日志及常见问题

目录 1.Topic下的消息是如何存储的 1.1log文件追加记录所有消息 1.2index和timeindex加速读取日志信息 2.文件清理机制 2.1如何判断哪些日志文件过期了 2.2日志清理策略 3.Kafka的文件高效读写机制 3.1Kafka的文件结构 3.2顺序写磁盘 3.3零拷贝 3.3.1传统IO 3.3.2m…

【硬件操作入门】2--GPIO与门电路、二极管三极管、LED电路与操作

【硬件操作入门】2–GPIO与门电路(二极管&三极管)、LED电路与操作 文章目录 【硬件操作入门】2--GPIO与门电路(二极管&三极管)、LED电路与操作一、GPIO与门电路1.1、GPIO的应用1.2、GPIO引脚操作1.2.1 设置引脚为GPIO功能…

加速网络体验,Squid缓存代理:让浏览如飞,畅享无限网络速度!

作者简介:我是团团儿,是一名专注于云计算领域的专业创作者,感谢大家的关注 座右铭: 云端筑梦,数据为翼,探索无限可能,引领云计算新纪元 个人主页:团儿.-CSDN博客 目录 前言: squ…

[数据集][目标检测]建筑工地楼层空洞检测数据集VOC+YOLO格式2588张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2588 标注数量(xml文件个数):2588 标注数量(txt文件个数):2588 标注…

springboot项目读取 resources 目录下的文件的9种方式

1. 使用 ClassLoader.getResourceAsStream() 方法 InputStream inputStream getClass().getClassLoader().getResourceAsStream("file.txt"); 2. 使用 Class.getResourceAsStream() 方法 InputStream inputStream getClass().getResourceAsStream("/file.txt&…

JAVA-封装

目录 一、封装的概念 二、封装扩展之包 1. 包的概念 2.导入包中的类 3.自定义包 4.常见的包 三、访问限定符 在同一包中: 在不同包中:​编辑 一、封装的概念 面向对象程序三大特性:封装、继承、多态。而类和对象阶段,主…

网络安全——基础知识记忆梳理

1. SQL注入攻击 SQL注入攻击是一种常见的网络安全威胁,它利用Web应用程序中对用户输入的数据的不正确处理,攻击者可以在SQL查询中注入恶意代码,从而执行非授权的数据库操作。这种攻击方式可以导致数据泄漏、数据篡改、绕过认证等多种安全问题…

什么样的条件才会造就这样疯狂的末日期权?

今天带你了解什么样的条件才会造就这样疯狂的末日期权?末日期权一般是指期权合约快到期的一周或者最后三天,当然最后一天就是末日期权的疯狂。 末日期权是指那些接近到期日的期权。 由于剩余时间较短,这些期权的时间价值通常非常低&#xf…

MFC工控项目实例之七点击下拉菜单弹出对话框

承接专栏《MFC工控项目实例之六CFile添加菜单栏》 1、在SEAL_PRESSUREDlg.h文件中添加代码 class CSEAL_PRESSUREDlg : public CDialog { ...afx_msg void OnTypeManage(); ... } 2、在SEAL_PRESSUREDlg.cpp文件中添加代码 BEGIN_MESSAGE_MAP(CSEAL_PRESSUREDlg, CDialog)//…

快速排序与其例题

一、快速排序 1、简单介绍:快速排序(Quick Sort)是一种高效的排序算法,由计算机科学家Tony Hoare在1960年提出。它是基于分治法的排序算法,其基本思想和步骤如下: 基本概念 快速排序的核心思想是将待排序…

Debezium2.7 数据同步 MySQL/Oracle -- AI生成

Debezium是Red Hat开源的一个工具,用于实时捕获多种数据源(包括MySQL、PostgreSQL、SQL Server、Oracle等)的变更数据,并将这些数据作为事件流输出到Kafka等消息中间件中。通过Debezium,可以实现数据的实时同步和变更数…

【Qt】常用控件QCalendarWidget

常用控件QCalendarWidget的使用 QCalendarWidget表示一个日历 核心属性 属性说明 selectDate 当前选中的⽇期 minimumDate 最⼩⽇期 maximumDate 最⼤⽇期 firstDayOfWeek 每周的第⼀天(也就是⽇历的第⼀列) 是周⼏. gridVisible 是否显⽰表格的边框 selectionMode…

何为MethodHandles?

最近在梳理ThreadPoolExecutor,无意间看到其内部类Worker实现了一个名字叫做AbstractQueuedSynchronizer的抽象类。看到它,我便想起当年为了面试而疯狂学习这个知识点的场景。不过这种临时抱佛脚的行为,并未给我带来即时的收益。也是这次的疯…

软件上显示“mfc140.dll丢失”错误信息?那么mfc140.dll丢失该如何修复

mfc140.dll是 Microsoft Foundation Class (MFC) 库的一部分,这个库被用于基于 C 的 Windows 应用程序的开发。当 Windows 或软件上显示“mfc140.dll丢失”或“找不到 mfc140.dll”这类错误信息时,表示你的系统可能缺少与 Visual C 相关的组件或这些组件…

文本处理函数

1.文本的提取 left mid right 2.文本的查找与替换 replace,substitute 3.字符个数 len字符 lenb字节, office365好像没有此功能 4.数据的清理 clean , trim 5.找不同 exact

【Qt】多元素控件QTableWidget

多元素控件QTableWidget 使用QTableWidget表示一个表格控件,一个表格中包含若干行、每一个行又包含若干列。 表格中的每一个单元格,都是一个QTableWidget对象。 QTableWidget核心方法 方法说明 item(int row, int column) 根据⾏数列数获取指定的 Q…

WIN32实现远程桌面监控

文章目录 完整代码API简介调试代码 后记reference 完整代码 server.cpp #include <winsock2.h> #include <Ws2tcpip.h> #include <windows.h> #include <stdio.h> #include <vector> #pragma comment(lib, "ws2_32.lib")LRESULT CAL…

免费JSON在线解析工具网址

1&#xff0c;https://tool.juhe.cn/ JSON在线解析 (juhe.cn) 2&#xff0c;https://www.sojson.com/ JSON在线 | JSON解析格式化—SO JSON在线工具