本文主题:本文主要对比了x86 ISA 和 arm ISA的部分区别。

目录

一、x86 ISA

1、指令组成

二、指令各部分解析

1、Instruction Prefixes(可选部分)

2、Opcode (必选部分)

3、Mod R/M

4、SIB

5、Displacement

6、Immediate

二、ARM ISA

1、指令长度区别

2、隐式操作寄存器

3、条件判断


一、x86 ISA

1、指令组成

图一

由图一可知一条x86的指令可分为Instruction Prefixes、Opcode、Mod R/M、 SIB 、Displacement、Immediate这六个部分,其中Opcode为必选部分,其他都为可选部分。

二、指令各部分解析

1、Instruction Prefixes(可选部分)

指令前缀这部分被划分为Lock和重复前缀、段前缀、操作数长度修饰前缀、地址长度修饰前缀四组。

(1)Lock前缀:在destination oprand为内存操作时时,在部分特定的指令前加上lock前缀保证为原子操作,若非这部分特定指令,执行会抛#UD异常

循环前缀:在movs指令前添加rep 、repnz循环前缀

    F0:8300 02      lock add dword ptr ds:[eax],2    8300 02        add dword ptr ds:[eax],2 F2:A4          repne movsb  F3:A4          rep movsb

(2)段前缀:用作内存访问权限控制。

    2E:C700 01000000     mov dword ptr cs:[eax],1    3E:C701 01000000        mov dword ptr ds:[ecx],1    26:C700 01000000        mov dword ptr es:[eax],1    36:C700 01000000        mov dword ptr ss:[eax],1    64:C700 01000000        mov dword ptr fs:[eax],1    65:C700 01000000        mov dword ptr gs:[eax],1

(3)操作数长度修饰前缀:用来修饰操作数长度

 C700 01000000       mov dword ptr ds:[eax],1    66:C700 0100        mov word ptr ds:[eax],1

(4)地址长度修饰前缀

    2E:C700 01000000 mov dword ptr cs:[rax],12E67:C700 01000000  mov dword ptr cs:[eax],1

2、Opcode (必选部分)

主操作码可能是一字节两字节三字节长度。这个字段会确定是否存在Mod R/M和SIB字段。

3、Mod R/M

这个部分如果存在,则这个部分的长度为一个字节。这个部分分为mod、reg、r/m三个部分

mod: 指明操作码中的操作数表示寄存器还是内存,11表示内存,其余表示寄存器
        ​​​​​​​reg:标记通用寄存器
        r/m:如果为100则无作用,其余的情况下和REX PREFIX共同组合表示取址的格式

取址方式,若为内存寻址则需要SIB字段辅助

4、SIB

如果modR/M的r/m部分为100,则存在SIB Byte部分,这部分分为scale、index、base三部分。

Scale和index的三个字节和REX PREFIX的1号位(X)组合而成的4位、以及modR/M和REX PREFIX的2号位(R)组合而成的4位这三部分共同确定了取值的方式,

5、Displacement

这部分字段为地址移位长度。长度可以为1个字节到8个字节,是可选部分。

6、Immediate

这个部分为表示的为指令中的立即数,长度可以为1个字节到8个字节,是可选部分。

二、ARM ISA

ARM的CPU有arm和thumb两种运行状态,CPU在不同的状态下执行不同的指令集,通过PSR寄存器的T标志位控制模式,T标志位为0表示arm模式,arm指令长度为4byte;为1表示thumb模式,thumb模式下指令的长度为4byte或2byte。

由于ARM指令是2字节对齐,所以内存的最低位一定为偶数,在使用LDR和BX指令进行分支跳转和。CPU在运行时候进行分支跳转和模式切换的方式主要有两种,一种是利用LDR指令将内存中的地址写入PC寄存器,跳转地址的最低位(lsb)为0切换为arm模式,最低为为1切换为thumb模式。

接下来本文会枚举一些x86指令集和arm指令集的区别:

1、指令长度区别

x86指令为变长指令,arm指令的长度为2byte或者4byte,所以arm指令中的操作数都小于32字节

例如 mov指令给寄存器赋值一个32位长度数字:

X86:B8 44332211   mov eax,11223344

这是在x86的机器上,在32位模式下给一个32位寄存器赋一个32位值的硬编码,B8为opcode,后面为操作数,指令长度为5个字节

Arm:   44 03 03 E3         MOVW  R0, #0x334422 01 41 E3         MOVT  R0, #0x1122

这是arm模式下的一种实现方式:

第一条指令硬编码为

1110  00110    0  00  0011   0000   001101000100

第一条指令的编码格式是:

其中cond为条件判断,在arm模式下一般指令都会有条件判断,thumb模式编码一般没有添加执行判断条件,这条指令中cond为1110为无条件执行,imm4为0011 è 0x3 Rd为0表示r0寄存器,imm12为001101000100 è0x344 组合而成imm16 = imm4:imm12 为0x3344

第二条指令硬编码为

1110   00110  1  00  0001   0000   000100100010

第二条指令的编码格式是:

这条指令中cond为1110  为无条件执行,imm4为0001 è 0x1 Rd为0表示r0寄存器,imm12为000100100010 è 0x122 组合而成imm16 = imm4:imm12 为0x3344

从上面可以看出arm模式下的指令前四位表示的都为执行条件判断,紧接着一般是指令的硬编码,用来区分不同的指令,然后跟着的是指令的寄存器操作数或者是寄存器等。

2、隐式操作寄存器

arm指令集中没有隐式操作寄存器的指令,比如在x86中push pop指令在指令中虽然不存在rsp寄存器,但是在指令执行后,会默认移动rsp寄存器,而在arm中没有这样的指令,相同功能的指令表示为push {r0} è STR R0,[SP,#-4]!  , pop {r0}è LDR  R0,[SP, #4]!

3、条件判断

在x86指令集中,一般只有条件跳转会使用到标志位,用于分支跳转,而且arm指令集中,arm模式下的指令前四个位都为执行条件判断,都会使用到标志位。

下图为x86指令集中的条件判断:

下图为arm指令集中的条件判断:

在x86指令集中rflags寄存器和arm指令集中PSR寄存器中eflags寄存器中的CF、ZF、SF、OF标志位分别对应arm中的C、Z、N、V,分别为进位借位标志位(无符号数使用)、0标志位、正负标志位、和溢出标志位(有符号数使用),其中x86的CF标志位和arm中的C标志位有区别,在x86中不论加减法,借位进位为1,不借位为0,在arm中 对于加法,如果产生进位,则C=1;否则C=0,对于减法如果产生借位,则C=0;否则C=1。即x86和arm中加法对CF、C标志位的影响相同,减法对其影响相反。

所以上面的区别导致了x86指令集中的ja成立条件为(CF or ZF) = 0,而在arm指令集中相同的无符号整型HI成立条件C == 1 and Z == 0两者不同,同理x86指令集中的jbe与arm指令集中对应的LS的条件也是不相同的。

文章内容大部分来自:

        Arm Architecture Reference Manual for A-profile architecture
        Intel® 64 and IA-32 Architectures Software Developer’s Manual

        学习过程中还有很多不足,还望朋友们指正!

x86指令集和arm指令集部分对比相关推荐

  1. ISA——x86指令、ARM指令、、

    ISA(instruction set architecture)指令集维基定义https://en.wikipedia.org/wiki/Instruction_set_architecture 无 ...

  2. IDA Pro ARM指令集和Thumb指令集的切换

    在动态调试android的ndk程序的时候,发现很多程序都会反汇编错误,原来是ARM反汇编的模式没搞对.因为在动态调试的时候,ida Pro并没有去解析elf模块中的一些信息,造成了模块信息丢失,有时 ...

  3. ARM 指令集 和 Thumb 指令集

    From:https://gitee.com/lsliushuang/ASM/blob/master/arm汇编.txt ARM 汇编指令集汇总:https://blog.csdn.net/qq_40 ...

  4. ARM 指令集跳转指令

    一.跳转指令 跳转指令用于实现程序流程的跳转,在ARM 程序中有两种方法可以实现程序流程的跳转: Ⅰ.使用专门的跳转指令. Ⅱ.直接向程序计数器PC 写入跳转地址值. 通过向程序计数器PC 写入跳转地 ...

  5. thumb指令和arm指令

    参考https://www.embedded.com/introduction-to-arm-thumb/ 一.为什么一个芯片需要thumb和arm两套指令集 许多复杂的功能在复杂指令集(CISC)处 ...

  6. CM4_ 3、ARM指令集

    本文脉络 一.导引 何为指令 1.经典ARM体系架构的指令集-ARM指令集.Thumb指令集 1.1.Thumb指令集 1.2.比较ARM指令集和Thumb指令集 1.3.经典ARM体系架构指令集的缺 ...

  7. ARM汇编指令(ARM寻址方式、汇编指令、伪指令

    1.寻址方式 所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法. 1)立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的. 只要取出指令也就是取 ...

  8. 基于ARM Cortex-M3微控制器(STM32系列)基础知识(三)——ARM指令集

    指令概述 ARM指令 STR与LDR概述(详细在本文的数据加载与存储指令中) 数据操作指令 数据操作指令是指对存放在寄存器中的数据进行操作的指令.主要包括数据传送指令.算术指令.逻辑指令.比较与测试指 ...

  9. ARM指令集--B BL BLX BX

    B 指令的格式为: B{条件} 目标地址 B 指令是最简单的跳转指令.一旦遇到一个 B 指令,ARM 处理器将立即跳转到给定的目标地址,从那里继 续执行 B Label :程序无条件跳转到标号 Lab ...

最新文章

  1. sdut 2401 最大矩形面积
  2. [shell] 一个printf 打印 8 进制码的问题
  3. Java工程师成神之路 转
  4. java mysql自动备份_java定时备份数据之二_MySQL
  5. 最全的 pip 使用指南,50% 你可能没用过。
  6. on duplicate key update不生效_为什么不把蚊子吸血原理应用于医院化验抽血?
  7. iPhone 路径大全
  8. .net core grpc consul 实现服务注册 服务发现 负载均衡(二)
  9. c 实现走迷宫流程图_c语言迷宫问题程序功能介绍.设计思路.数据结构设计及用法说明程序结构(流程图).各模块的功能及程序说明....
  10. 详解站长之家之站长工具四大新功能
  11. TechSmith SnagIt 9 中文破解版v9.1.0
  12. Android设备远程控制工具AVDTools使用
  13. VIT实战总结:非常简单的VIT入门教程,一定不要错过
  14. 页面数据能够正常渲染,但控制台报错属性underfined
  15. verilog学习笔记:简单的数据选择器modelsim仿真
  16. android打开微信运动,小米手机怎么开启微信运动?
  17. Unity防破解 —— 加密Dll与Key保护
  18. java 识别doc、docx
  19. 记一次服务器被挖矿程序占用的解决过程
  20. 正则表达式,各种空字符和空格字符

热门文章

  1. 机器学习-牛顿迭代法原理和公式推导
  2. vue+iview4.0 , vue+element实现下拉框可以自定义输入内容
  3. 罗胖发明的这个概念,可以解释整个互联网的下半场了
  4. FTPC--KepWare--OPC--PLC读写
  5. 一个简易的网盘目录列表PanIndex
  6. 注意啦!卷面这些情况视为作弊!
  7. Response.Write(scriptalert('验证码不正确');/script); 丢失样式表解决方案
  8. 安装Altium Designer失败
  9. 【工作日记17】简单DDOS攻击
  10. 2023全国个体工商数据