汇编系列01-汇编语言简介

news2024/11/20 1:48:21

每天进步一点点,不要浮躁,沉下心来。

什么是汇编语言

我们知道CPU是经过精心设计的电路组成的,里面有很多微小的门电路,门电路是通过输入电平控制的,电平分为高低,我们用1表示高电平,0表示低电平,所以让CPU工作就需要给它输入01序列。CPU是通用的,通过不同的01序列组合,它可以做不同的事情,编写01序列就是所谓的机器码编成,而机器码编程对程序员要求太高了,程序中出错也不好排查(比如01010111写错成了01000111),于是人们用符号来代替01序列,比如用 mov eax,0x1来表示b8 01 00 00 00指令(注意,在汇编中的数字通常都用十六进制表示,一个十六进制数字表示4个bit,表示范围从0到F,即十进制的0到15,这儿的b8 01 00 00 00如果写成二进制就是1011100000000001000000000000000000000000,很明显,二进制长度太长了,不易阅读)。
用符号表示机器码的编程语言就是汇编语言。

汇编语言的风格和种类

CPU的架构

既然汇编语言就是二进制0101的符号化表示,而0101又是CPU这种硬件电路的输入,那么不同的厂商生产的CPU的电路支持的输入又不一样,支持的01序列(指令集)也不同,那么每种CPU架构的上的汇编也是不同的。
常见的CPU架构有X86(16位和32位)、X86_64、ARM、MIPS、RISC-V等等。我们现在平常用的64位CPU(Intel和AMD生产的)都是X86_64架构的。

汇编风格

汇编语言(汇编语言不区分大小写)的书写风格有两种,一种是Intel风格,一种是AT&T风格。比如同样的一段汇编可以写成:
在这里插入图片描述Intel风格的mov指令目的操作数在左边,源操作数在右边。
在这里插入图片描述AT&T风格的mov指令目的操作数在右边,源操作数在左边,并且有大量的百分号。

我个人比较喜欢Intel风格,很多资料也推荐Intel风格。在反汇编二进制程序的时候,可以设置反汇编的风格,比如在gdb中,可以通过
set disassembly-flavor intel或者set disassembly-flavor att进行风格的切换:

(gdb) set disassembly-flavor intel
(gdb) disassemble/r main
Dump of assembler code for function main:
   0x0000000000401110 <+0>:	b8 01 00 00 00	mov    eax,0x1
   0x0000000000401115 <+5>:	bf 01 00 00 00	mov    edi,0x1
   0x000000000040111a <+10>:	48 be 28 40 40 00 00 00 00 00	movabs rsi,0x404028
   0x0000000000401124 <+20>:	ba 0c 00 00 00	mov    edx,0xc
   0x0000000000401129 <+25>:	0f 05	syscall 
   0x000000000040112b <+27>:	b8 3c 00 00 00	mov    eax,0x3c
   0x0000000000401130 <+32>:	bf 00 00 00 00	mov    edi,0x0
   0x0000000000401135 <+37>:	0f 05	syscall 
   0x0000000000401137 <+39>:	66 0f 1f 84 00 00 00 00 00	nop    WORD PTR [rax+rax*1+0x0]
End of assembler dump.
(gdb) set disassembly-flavor att
(gdb) disassemble/r main
Dump of assembler code for function main:
   0x0000000000401110 <+0>:	b8 01 00 00 00	mov    $0x1,%eax
   0x0000000000401115 <+5>:	bf 01 00 00 00	mov    $0x1,%edi
   0x000000000040111a <+10>:	48 be 28 40 40 00 00 00 00 00	movabs $0x404028,%rsi
   0x0000000000401124 <+20>:	ba 0c 00 00 00	mov    $0xc,%edx
   0x0000000000401129 <+25>:	0f 05	syscall 
   0x000000000040112b <+27>:	b8 3c 00 00 00	mov    $0x3c,%eax
   0x0000000000401130 <+32>:	bf 00 00 00 00	mov    $0x0,%edi
   0x0000000000401135 <+37>:	0f 05	syscall 
   0x0000000000401137 <+39>:	66 0f 1f 84 00 00 00 00 00	nopw   0x0(%rax,%rax,1)
End of assembler dump.
(gdb) 

X86汇编(X86_64汇编)

平时说的x86汇编,在以前主要指16位和32位的。现在64位CPU很普遍了,64位的x86叫x86_64或x_64。
64位CPU的寄存器

学习汇编的常用工具

汇编器

将汇编语言文本翻译成0101序列的工具叫做汇编器(高级语言中有所谓的编译器将高级语言文本编译成机器码或者汇编代码)。
常见的汇编器有NASM(Netwide Assembler)、MASM(Microsoft Macro Assembler)、GAS(GNU Assembler)等,推荐用NASM,各个操作系统都可以用,免费的。

调试器

GDB(LLDB),可以调试C、C++语言等语言,可以通过反汇编机器码看到汇编程序与C、C++语言的对应关系。
在这里插入图片描述通过GDB调试C程序,查看其汇编可以搞清楚很多底层本质,比如函数的调用参数是怎么传递的,等等。

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

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

相关文章

MySQL基础查询操作

文章目录&#x1f68f; Select语句&#x1f680; 一、SQL底层执行原理&#x1f6ac; &#xff08;一&#xff09;、查询的结构&#x1f6ac; &#xff08;二&#xff09;、SQL语句的执行过程&#x1f6ad; 1、WHERE 为什么不包含聚合函数的过滤条件&#xff1f;&#xff08;面试…

Python | Leetcode刷题日寄Part05

欢迎交流学习~~ LeetCode & Python 系列&#xff1a; &#x1f3c6; Python | Leetcode刷题日寄Part01 &#x1f50e; Python | Leetcode刷题日寄Part02 &#x1f49d; Python | Leetcode刷题日寄Part03 ✈️ Python | Leetcode刷题日寄Part04 Python|Leetcode刷题日寄Par…

【企业服务器LNMP环境搭建】nginx安装

1、介绍&#xff08;官方网址&#xff1a;nginx news &#xff09; 1.1 常见用法 1) web服务器软件 httpd http协议 同类的web服务器软件&#xff1a;apache nginx(俄罗斯) IIS(微软 fastcgi) lighttpd(德国) 2)代理服务器 反向代理 3)邮箱代理服务器 IMAP POP3 SMTP 4)负载均…

前端ES6异步编程技术——Promise使用

Promise是什么 官方的定义是&#xff1a;Promise是ES6新推出的用于进行异步编程的解决方案&#xff0c;旧方案是单纯使用回调函数来解决的。对于开发人员来说&#xff0c;我们把promise当作一个普通的对象即可&#xff0c;使用它可以用来封装一个异步操作并可以获取其成功/失败…

Spring Cloud(微服务)学习篇(六)

Spring Cloud(微服务)学习篇(六) 2 Sentinel实现流量规则(控制台版) 2.1 变更pom.xml(shop-user-server项目)代码 2.1.1 加入如下依赖 <!--熔断限流--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-…

稀疏子空间聚类——对超像素聚类

如何使用&#xff1a;超像素分割算法进行过分割——>对所有的超像素样本提取新特征(包括对比度增强直方图特征、超像素样本邻域纹理特征、基于先验知识的位置信息特征)——>采用距离约束优化的稀疏子空间聚类算法(对超像素样本进行聚类) 在超像素分割中构造自适应相似度系…

【linux】:进程状态(僵尸进程等)以及环境变量

文章目录 前言一.进程状态 进程的优先级二.环境变量总结前言 本篇文章是接着上一篇【linux】:进程概念的后续&#xff0c;对于有基础的同学可以直接看这篇文章&#xff0c;对于初学者来说强烈建议大家从上一篇的概念开始看起&#xff0c;上一篇主要解释了冯诺依曼体系以及操…

将 Visual Studio Code 设置为3dmax Maxscript脚本编辑器的方法详解

Visual Studio Code对Autodesk 3dMax脚本语言 (MaxScript) 支持 本教程给大家分享Visual Studio Code对Autodesk 3dMax 脚本语言 (MaxScript) 支持。 MXSPyCOM项目&#xff1a;允许从外部代码编辑器编辑和执行3dMax MaxScript和Python文件。 功能特性 语法高亮。语法错误检查语…

x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建

文章目录[toc]关于 docker 版本查看是否开启 experimental 功能开启 experimental 功能查看当前环境平台拉取一个 arm 平台的容器运行一个 arm 平台的容器整一个 qemu-user-static注册可支持的架构解释器尝试启动 arm64 镜像尝试启动 ppc64le 镜像后台运行 arm64 容器build 一个…

Libgdx 导入blender 3D动画

导入blender3D模型可以看上篇libgdx导入blender模型 本篇3D动画在上篇的基础上。 具体参考官网 3D 动画和蒙皮 blender动画参考 八个案例教程带你从0到1入门blender【已完结】 打开上次的blender的&#xff0c;选则物体属性 点击位置和旋转x&#xff0c;y&#xff0c;z后面…

一个好的工程项目管理软件所包含的主要功能

工程项目管理软件哪个好&#xff1f;借助Zoho Projects强大的工程项目管理软件&#xff0c;您的团队可以在预算范围内按时交付。从质量保证到预算规划&#xff0c;Zoho Projects的工程项目管理平台旨在推动切实的成果是Zoho Projects工程项目管理软件的优势。 高质量的可交付成…

骨传导耳机是什么意思,骨传导耳机的好处具体有哪些

​在这个全民都是手机的时代&#xff0c;各种蓝牙耳机&#xff0c;入耳式耳机&#xff0c;真无线耳机等各种款式琳琅满目。而骨传导耳机是一种全新的科技产物&#xff0c;顾名思义就是通过头骨振动将声音传至外耳内的耳机。由于无需入耳&#xff0c;不会对耳朵造成任何影响。那…

Linux用户空间与内核空间通信(Netlink通信机制)

一&#xff0c;什么是Netlink通信机制 Netlink是linux提供的用于内核和用户态进程之间的通信方式。但是注意虽然Netlink主要用于用户空间和内核空间的通信&#xff0c;但是也能用于用户空间的两个进程通信。只是进程间通信有其他很多方式&#xff0c;一般不用Netlink。除非需要…

JVM详解——执行引擎

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;耶瞳空间 一&#xff1a;执行引擎介绍 “虚拟机”是一个相对于“物理机”的概念&#xff0c;这两种机器都有代码执行能力&#xff0c;其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和…

程序、进程、线程的基本概念、信号量的PV操作、前趋图的PV操作

程序、进程、线程的基本概念 进程控制块PCB的组织方式&#xff1a;顺序方式、链接方式、索引方式、Hash。 在JVM 中进程与线程关系 进程&#xff1a; 拥有资源的独立单位。可以被独立调度。可以分配资源。 线程&#xff1a; 可以被独立调度。同一进程中的多个线程&#xff0c;…

Java高效率复习-SpringMVC[SpringMVC-2]

SpringMVC获取请求参数 SpringMVC获取请求参数的两种方式↓ 通过ServletAPI获取请求参数 将HttpServletRequest作为控制器方法的形参&#xff0c;此时HttpServletRequest类型的参数表示封装了当前请求的请求报文的对象 通过request的API——getParameter(String s)方法来获取…

LQB,手打,PCF8591,ADDA转换,AD1是光敏电阻,AD3是电位器,DA输出

在上述at24c02de 基础上&#xff0c;添加三个函数 一个是读取通道1光敏电阻的数据&#xff1b; 一个是读取通道3的电压&#xff1b; 一个是输出DA的数据。。 5V的AD DA。 如果读入的电压是5V&#xff0c;输入AD&#xff0c;就是255&#xff1b; 如果是0V&#xff0c;就是00000…

05 比特币价格的含义

2009年1月&#xff0c;在赫尔辛基的一台小型服务器上&#xff0c;「中本聪」创建了一份简陋的开源代码&#xff0c;比特币的首个区块在这一天诞生。自此之后的十余年间&#xff0c;比特币和以其为代表作的区块链技术&#xff0c;踏上了波谲云诡的大航海征途。比特币的价格是指比…

Android---进程间通信机制3

1 服务如何注册到 SM 中 getIServiceManager().addService(name, service, false); getIServiceManger --- new ServiceManagerProxy(new BinderProxy()) BinderInternal.getContextObject --- 返回 BinderProxy 对象 ProcessState::self()->getContextObject: 创建一个 BpB…

k8s学习之路 | Day19 k8s 工作负载 Deployment(上)

文章目录1. Deployment 基础1.1 什么是 Deployment1.2 简单体验 Deployment1.3 Deployment 信息描述1.4 如何编写 Deployment2. Deployment 简单特性2.1 赋予 Pod 故障转移和自愈能力2.2 更新 Deployment2.3 回滚 Deployment2.4 暂停、恢复 Deployment 的上线过程2.5 Deploymen…