x86汇编基础

news2025/1/23 12:16:13

目录

CPU架构与指令集

x86 / x64 

CPU操作模式

寄存器

数据类型

数据传送与访问

算数逻辑与运算逻辑

跳转指令和循环指令

栈与函数调用


这一部分更详细的内容可以参考我的专栏:C与汇编

CPU架构与指令集

        CPU即中央处理单元(Central Processing Unit ),有时也简称为处理器( processor ),其作用是从内存中读取指令,然后解码和执行。CPU架构就是CPU的内部设计和结构,也叫作微架构( Microarchitecture ),由一堆硬件电路组成,用于实现指令集所规定的操作或者运算。

        指令集架构(Instruction Set Architecture,ISA)简称指令集,包含了一系列的操作码( opcode ),以及由特定CPU执行的基本命令。指令集在CPU中的实现称为微架构,要想设计CPU,首先决定
使用什么样的指令集,然后才是设计硬件电路。根据指令集的特征,通常可分为CICS和RISC两大阵营
        由于指令集是一堆二进制数据,非常不利于阅读和理解,于是有人就发明了汇编语言( Assemblylanguage),用类似人类语言的方式对指令集进行描述,每条汇编指令都有对应的指令.再往后,C/C++等高级语言的诞生更加方便了程序的编写,推动了信息化和互联网的普及。

x86 / x64 

PC端最常见的架构——x86架构以及扩展的x64架构。汇编语言是人类与计算机交互过程中的底层,和汇编语言关系最密切的,莫过于计算机的中央处理器。

  • x86架构是最广为人知的处理器架构,主要包括Intel的IA-32、Intel 64处理器以及AMD的AMD与AMD64处理器。
  • x86-64处理器架构包括了Intel的x86-64架构和AMD 的amd6架构,我们可以将其看为x86指令集的64位扩展。

CPU操作模式

对于x86处理器而言,有三个最主要的操作模式:保护模式,实地址模式,系统管理模式。此外还有一个保护模式的子模式,称为虚拟8086模式。

  • 保护模式是处理器的原生状态,此时所有的指令和特性都是可用的,分配给程序的独立内存区域称为内存段,处理器将阻止程序使用自身段以外的内存区域。为了模拟8086处理器,在虚拟8086模式下,操作系统可以在实体CPU中划分多个8086 CPU,这也是早期虚拟机的来源。
  • 实地址模式是早期Intel处理器的编程环境,该模式下程序可以直接访问硬件及其实际内存地址,而没有经过虚拟内存地址的映射,方便了驱动程序的开发。
  • 系统管理模式为操作系统提供了诸如电源管理或安全保护等特性机制。

对于x86-64处理器而言,还引入了一种名为IA-32e的操作模式。该模式包含两个子模式,分别为兼容模式和64位模式,在兼容模式下现有的32位和16位程序无须重新编译;在64位模式下,处理器将在64位的地址空间下运行程序。

寄存器

寄存器:从8位处理器到16位处理器,再到32位以及64位处理器,寄存器的名称也有一些变化。

不同位数处理器寄存器名称:

在64位模式下,操作数的默认大小仍然为32位,且有8个通用寄存器;当给每条汇编指令增加REX(寄存器扩展)的前缀后,操作数变为64位,且增加了8个带有标号的通用寄存器(R8~R15 )。

此外,64位处理器还有两个不容忽视的特点:

  1. 64位与32位有着相同的标志位状态;
  2. 64位模式下不能访问通用寄存器的高位字节(如AH、BH、CH及 DH )。
     

数据类型

整数常量:一个数字需要前缀后缀加以区分,十六进制下,前缀加0,后缀加h

浮点数常量:x86架构中有单独的浮点数寄存器和浮点数指令来处理相关浮点数常量。通常以十进制表示浮点数,而以十六进制编码浮点数。浮点数中至少包含一个整数和一个十进制的小数点,以下均为合法的浮点数:“1.”、“+2.3”、“-3.14159”、“26.E5”

字符串常量:字符串的存储往往时存储一个指针,指向字符串的地址


 

数据传送与访问

MOV指令的基本格式中:第一个参数为目的操作数,第二个参数为源操作数

MOV指令支持从寄存器到寄存器、从内存到寄存器、从寄存器到内存、从立即数到内存和从立即数到寄存器的数据传送,但不支持从内存到内存的直接传输,想要完成从内存到内存的数据传送,必须使用一个寄存器作为中转。

在编写汇编语言时,可能会出现将较小的操作数扩展为较大操作数的情况,这时就需要对操作数进行全零扩展或符号扩展。

算数逻辑与运算逻辑

最简单的算术运算指令是INC和 DEC,分别用于操作数加1和操作数减1。这两条指令的操作数既可以是寄存器,也可以是内存。

学习在介绍算术运算指令前,需要了解补码的知识。计算机底层的数据表示均是以补码表示的。两个机器数相加的补码可以先通过分别对两个机器数求补码,然后再相加得到。在采用补码形式表示时,进行加法运算可以把符号位和数值位一起进行运算(若符号位有进位则直接舍弃),结果为两数之和的补码形式。对于机器数的补码减法可以利用与其相反数的加法实现。

ADD指令将长度相同的操作数进行相加操作。

SUB指令为减法操作,将从目的操作数中减去源操作数。

NEG指令是把操作数转换为二进制补码,并将操作数的符号位取反。

在汇编语言中存在标志位寄存器,使用SUB、ADD等指令都可能会造成整数溢出、符号位等标
志位发生变化,因此进位标志位、零标志位、符号标志位、溢出标志位,辅助标志位,奇偶标志位都将根据存入的输入发生变化。
 

跳转指令和循环指令

一般情况下,CPU是顺序加载并执行程序的。但是,指令集中会存在一些条件型指令,将根据CPU的标志位寄存器决定程序控制流的走向。

在x86汇编语言中,每一个条件指令都隐含着一个跳转指令。跳转指令有两种最基本的类型:

  • 无条件跳转就是无论标志位寄存器为何值,都会跳转;
  • 条件跳转则是当满足某些条件时,程序出现分支,各类分支结构可以组合成不同的程序逻辑。

JMP指令是无条件跳转指令,在编写汇编语言时需要使用一个标号来标识,汇编器在编译时就会将该标号转换为相应的偏移量。一般情况下,该标号必须和JMP指令位于同一函数中,但使用全局标号则不受限制。

JMP指令也可以创建一个循环,也就是在循环结束时用JMP指令再跳回循环开始的位置。由于JMP是无条件跳转,所以除非使用其他方式退出,该循环将一直运算下去。

LOOP指令也可以创建一个循环代码块,ECX寄存器为循环的计数器(实地址模式中略有不同,CX寄存器是LOOP指令与LOOPW指令的默认循环计数器,ECX寄存器为LOOPD指令的循环计数器,64位的x86汇编语言LOOP指令使用RCX为默认循环计数器),每经过一次循环,ECX的值将减去1。

LOOP指令执行分为两步,第一步是ECX值减1;第二步将ECX与0进行比较,如果ECX不为0,则跳转到标号地址处;如果ECX为0,则不发生跳转,执行LOOP指令的下一条指令。在使用LOOP指令前,如果将ECX的值设为0,那么在执行LOOP指令时,ECX的值减去1后实际上为FFFFFFFFh,这将是一个非常大的循环,因此我们在编写x86汇编语言的过程中一般情况不需要显式地改变ECX寄存器的值,特别是存在循环嵌套的情况时。


 

栈与函数调用

栈是先进后出的数据结构

栈空间是计算机内存中一段确定的内存区域,也有着一些指针指向相应的内存地址,在x86架构中这个指针位于ESP寄存器,而在x86-64平台上为RSP寄存器。在计算机底层,栈主要的几个用是:

  1. 存储局部变量;
  2. 执行CALL 指令调用函数时,保存函数地址以便函数结束时正确返回;
  3. 传递函数参数。
     

关于这一部分可以参考我的专栏:C与汇编

详细介绍函数调用机制,调用约定,常用的指令

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

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

相关文章

虚拟机联网

桥接 桥接模式就是虚拟机与你的电脑平起平做,都有同样的IP,且与你的电脑在同一网段下,就能够上网。 电脑的IP的地址 虚拟机的ip地址 设置vm1的ip地址与网关与电脑相同 如果出现ssh连接虚拟机不成功的问题,无其他问题时&#xff0…

2023-09-27 LeetCode每日一题(餐厅过滤器)

2023-09-27每日一题 一、题目编号 1333. 餐厅过滤器二、题目链接 点击跳转到题目位置 三、题目描述 给你一个餐馆信息数组 restaurants,其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息…

Python经典练习题(四)

文章目录 🍀第一题🍀第二题🍀第三题 🍀第一题 题目:打印出如下图案(菱形): 我们首先分析一下,本题实现的步骤主要有两个,分别是前四行和后三行 前四行:第一…

数据结构--二叉树(2)

文章目录 二叉树的存储结构二叉树的链式结构二叉树的遍历结点个数寻找二叉树的某个结点二叉树的层遍历判断是否为完全二叉树 上一节 二叉树的堆链接入口 二叉树的存储结构 对于二叉树的存储,有两种存储方式:一种是顺序存储,另一种是链式存储…

linux 清除卸载jenkins

1、停服务进程 查看jenkins服务是否在运行,如果在运行,停掉 查看服务 ps -ef|grep jenkins 停掉进程 kill -9 XXX2、查找安装目录 find / -name "jenkins*"3、删掉相关目录 删掉相关安装目录 rm -rf /root/.jenkins/# 删掉war包 rm -rf /…

服务断路器_Resilience4j异常比例熔断降级

给coud-consumer-feign-order80添加resilience4j依赖 修改yml文件 resilience4j.circuitbreaker:configs:default:# 熔断器打开的失败阈值failureRateThreshold: 30# 默认滑动窗口大小,circuitbreaker使用基于计数和时间范围欢动窗口聚合统计失败率slidingWindowS…

如何写公众号推文?公众号文章写作步骤分享

一篇优质的公众号文章,不仅能提升品牌知名度,增强用户粘性,还能引导潜在客户,实现商业价值。那么,如何才能写出一篇引人入胜的公众号文章呢?本文伯乐网络传媒将为您详细解析写公众号文章的步骤,…

模块接口测试

单元测试是代码正确性验证的最重要的工具,也是系统测试当中最重要的环节。也是唯一需要编写代码才能进行测试的一种测试方法。在标准的开发过程中,单元测试的代码与实际程序的代码具有同等的重要性。每一个单元测试,都是用来定向测试其所对应…

【笔记】Splay

【笔记】Splay 目录 简介右旋左旋 核心思想操作a. Splayb. 插入c. 删除 信息的维护例题AcWing 2437. SplayP3369 【模板】普通平衡树 简介 Splay 是一种平衡树,并且是一棵二叉搜索树(BST)。 它满足对于任意节点,都有左子树上任意…

fdbus之CBaseMessage

总体介绍 这个类是一个很重要的的类,fdbus中传递对象就是这个类的实例,该类中包含了很多重要的信息。可以这样理解,再fdbus的通信中,这个类的地位至关重要。他们的通信的内容就是该类定义的一些信息。 虽然CFdbBaseObject定义了…

如何进一步全面提高项目估算精准度?

项目估算非常重要,这直接关系着项目的成本和收入,如果估算不准确,将为项目带来较大风险。一般软件规模可以用多种方式进行估算,但是用功能点估算方式更准确,而自动估算让估算更快速,我们以CoCode开发的估算…

初识网络编程

一、概述 地球村:亦称世界村,是通过电子媒介将世界紧密联系起来的形象表达,是信息网络时代的集中体现 TCP和UDP: TCP:打电话 -->连接 -->接了 -->通话 UDP:发送完即可 -->接收 计算机网络&a…

QQ表情包存储位置解析

一些常见的设备和系统的QQ表情包存储位置: Windows系统: 路径:C:\Users[用户名]\Documents\Tencent Files[QQ号码]\Image\Image\CustomFace 在这个文件夹中,您可以找到所有自定义的QQ表情包。 Android系统: 路径&am…

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

软件架构的演化和维护

软件架构的演化和维护 定义 定义 顶不住了,刷题去了,不搞这个了,想吐。。。

STM32Cube 开发之读写内部Flash--电源项目ADC采样校准系数存储-实现掉电读取数据--STM32或者GD32F处理器

STM32Cube 开发之读写内部Flash–电源项目ADC采样校准系数存储-实现掉电读取数据 一、需求介绍 1.1 在进行电源项目开发中,输入与输出的电压电流经过硬件电路分压或者差分变换后,将低压的电压信号给到单片机如STM32F1系列单片机的ADC采样端口&#xff…

网速Full Power!这款4G网关信号达360度无死角

数字化转型浪潮下,如何实现可靠的无线互联成为制造企业面临的新课题。广州数智自动化最近通过部署星创SG500 4G网关,成功实现了某工业园区全域无线覆盖和多系统安全访问。 SG500支持全球主流的4G网络频段,可灵活搭配通信运营商,提供高达150Mbps的无线传输速率。它采用强大的四核…

性能压测工具:wrk

一般我们压测的时候,需要了解衡量系统性能的一些参数指标,比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线:P95。平均100%的请求中95%已经响应的时间 99线:P99。平均100%的请求中99%已经响应的时间 平…

三.vue2路由知识全总结

Vue Devtools:插件安装,展示模块中的数据 vue-router 应用场景:Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。 嵌套的路由/视图表模块化的、基于组件的路由配置路由参数、…

谷器数据参加世界制造业大会及数字化转型高峰论坛

9月20日至24日,由工业和信息化部、科技部、商务部、国务院国资委、中国工程院、安徽省人民政府等单位组织共同主办的2023世界制造业大会在合肥市滨湖国际会展中心盛大举行。谷器数据受邀出席,并同期参加”数字化转型高峰论坛”,与国家工信部相…