IA32和X86有什么区别?

简介: IA32和X86有什么区别?

1.数据传送指令


格式:MOVX source, destination

X: L 32位值 W 16位值 B 8字节

MOVL %EAX, %EBX

MOVW %AX, %BX

MOVB %AL, %BL

使用规则,mov只有以下13种情况


情况    举例

立即数==>通用寄存器    movl $0, %eax

立即数==>内存位置    movl $100, value

通用寄存器==>通用寄存器    movb $al, %cl

通用寄存器==>段寄存器    movl %edx, %cs

通用寄存器==>控制寄存器    movl %edi, %cr0

通用寄存器==>调试寄存器    movl

段寄存器 ==>通用寄存器    movl %ds, %esi

控制寄存器==>通用寄存器    movl %cr4, %esp

调试寄存器==>通用寄存器    

内存位置==>通用寄存器    movl value, %eax

内存位置==>段寄存器    

通用寄存器==>内存位置    movl %ecx, value

段寄存器 ==>内存位置    

变址寻址


地址格式: base_addr(offset_addr, index, size)

数据值位于base_addr + offset_addr + index * size

offset_addr,index必须为寄存器值,size可以是数字值

movl $2, %edi
movl values(, %edi, 4), %eax


寄存器间接寻址


$加标签获取内存位置的地址


movl $values, %edi ;把values地址送进EDI
movl %ebx, (%edi)  ;把EDX值送到EDI中包含的内存位置处
movl %ebx, 4(%edi) ;把值放到EDI寄存器指向位置之后4个字节的内存位置处
movl %ebx, -4(%edi);把值放到EDI寄存器指向位置之前4个字节的内存位置处


2. 条件传送指令


条件传送指令可以避免处理器执行JMP指令,这有助于处理器的预取缓存状态,通常能提高应用程序的速度


指令格式 : CMOVX source, destination

X是1个或2个字母的代码,表示将触发传送操作的条件;

条件取决于EFLAGS寄存器当前值 使用的位


交换数据


XCHG OP1, OP2

op1和op2可以同时为通用寄存器或者一个是内存位置(不能同时为内存位置)

8 bit, 16 bit, 32 bit寄存器都可以使用

当其中一个操作数是内存位置时,处理器LOCK信号自动标明,防止交换过程中其他处理器访问这个内存位置。

LOCK是非常耗时间的,并且可能对程序性能有不良影响。


BSWAP REG

反转寄存器字节顺序,大端变小端


XADD SOURCE, DESTINATION

交换两个寄存器的值或寄存器和内存位置的值,然后相加存到destination中


CMPXCHG SOURCE, DESTINATION

如果destination和EAX/AX/AL相等,把source加载到destination;

否则,把destination加载到EAX/AX/AL中


CMPXCHG8B DESTINATION

如果destination处8字节和EDX:EAX包含值匹配,ECX:EBX中64位值加载到destination内存位置;

否则destination内存位置值加载到EDX:EAX中。


压栈 pushx source


X:l用于长字32bit,w用于半字16bit

操作数是

16bit/32bit 立即数值

16bit/32bit 内存值

16bit/32bit 寄存器值

16bit 段寄存器

e.g.


pushl   %ecx
pushw  %cx
pushl  $100
pushl   data  ;push data值
    pushl   $data ;push data的地址


出栈 popx destination


16bit/32bit 寄存器

16bit 段寄存器

16bit/32bit 内存位置

e.g.

popl   %ecx
popw  %cx
popl   value

ESP寄存器是堆栈指针跟踪着堆栈的开始位置


压入和弹出所有寄存器



PUSHA 压入16位寄存器 顺序DI, SI, BP, BX, DX, CX, AX

PUSHAD压入32位寄存器 顺序EDI, ESI, EBP, EBX, EDX, ECX, EAX


手动使用ESP,EBP手工把数据放入堆栈

通常 很多程序把ESP值复制到EBP,而不是使用ESP本身


优化内存访问:奔腾四的处理器中,缓存块长度是64bit,定义的数据超过64位,就需要两次访存操作。


5 控制执行流程


无条件分支 : 跳转;调用;中断


跳转


汇编程序不认为跳转是不良的程序设计,对程序的性能有影响

jmp location location是要跳转到的内存地址,被声明为代码中的标签;

遇到跳转时指令指针改编为紧跟在标签后面的指令码的内存地址。


调用


保存发生跳转的位置,并且具有在需要时返回这个值的能力

call address:引用程序中的标签,他被转换为函数中的第一条指令的地址

返回指令RET没有操作数,通过查看堆栈,它知道返回什么位置



函数调用模板

Function_label:
Pushl %ebp
Movl %esp, %ebp
<normal code>
Movl %ebp, %esp
Popl %ebp
Ret


e.g.

;calltest.s
;An example of using the CALL instruction
.section .data
output:
   .asciz "This is section %d\n"
.section .text
.globl _start
_start:
   pushl $1
   pushl $output
   call printf
   add  $8, %esp
   call overhere
   pushl $3
   pushl $output
   call printf
   add  $8, %esp
   pushl $0
   call exit
overhere:
   pushl %ebp
   movl %esp, %ebp
   pushl $2
   pushl $output
   call printf
   add  $8, %esp
   movl %ebp, %esp
   popl %ebp
   ret


x86


早期,1980s年代,x86一般指当时的处理器8088和80286,不过这两个处理器都是16位的。如今,x86通常指32位指令集架构的处理器,比如80386。80386处理器是intel在1985年实现的第一款32位指令集架构的处理器,又叫i386,Intel Architecture, 32-bit,缩写为IA-32,现在,IA-32一般又能引喻成所有的支持32位计算的x86架构。


按照发展历史看,x86应该是指令集概念,一般用于个人PC系统如8086,286,386。IA-32是intel首推的32位架构。


x86-64/x64/amd64/Intel64


在1999年,AMD公司首先在IA-32基础上,增加了64位寄存器,兼容早期的16位和32位软件系统,推出了x86-64的64位微处理器,后来命名为AMD64,实现了超车。然后intel公司也接受了该方案,叫做Intel64。x86-64应该只算是x86指令集的64位扩展,并不是一种全新的64位架构。


由于amd64和intel64本质上是一样的,叫法也是很多。AMD通常叫它x86-64、x86_64,微软和sun等软件公司叫它x64,操作系统厂商则通常用AMD64或者amd64来指代AMD64和Intel64。


IA-64


IA-64是Intel推出的用于Itanium处理器(安腾处理器)的自己的Intel Architecture 64位指令集,一般用于服务器。尽管Intel64也是64位处理器,但这两者完全不是一回事。IA-64软件不能直接运行于Intel64处理器上。x86-64是IA-32指令集的扩展,而IA-64则是完完全全没有一点IA-32影子的独立处理器架构。IA-64需要通过模拟器才能运行IA-32,但是性能大大受影响。


市面上处理器如何区分AMD64和IA-64呢?


市面上买的Intel 64-bit的cpu其实都属于amd64分类,intel64和amd64其实都应该叫做x86_64。

IA64则指Itaniums系统cpu,并不是x86架构的,一般都是用于服务器,不是个人桌面产品,价格昂贵。

ARM64/AArch64


ARM是精简指令集RISC下的处理器架构。ARMv3至ARMv7支持32位寻址空间。ARMv8-A开始支持64位寻址空间。AArch64和ARM64都是指64位的ARM架构。


[参考]:


https://en.wikipedia.org/wiki/AArch64

https://en.wikipedia.org/wiki/IA-32

https://titanwolf.org/Network/Articles/Article?AID=f0882831-3c86-4201-9418-da3a05626bed#gsc.tab=0

https://en.wikipedia.org/wiki/X86


相关文章
|
安全 架构师 编译器
鲲鹏开发重点-–扭转x86乾坤的挑战,ARM64内存模型
因为X86及其CISC架构生态的封闭性,中国市场对未来处理器的选择,将是更开放、更模块化的RISC架构。 鲲鹏处理器就是符合这个潮流的创新产品和生态,将直面一系列挑战,和Apple一样赢得这场挑战,来扭转X86的封闭性的乾坤,创造出中国的处理器新生态。
1490 0
鲲鹏开发重点-–扭转x86乾坤的挑战,ARM64内存模型
|
开发者
深入了解HTTP状态码
深入了解HTTP状态码
424 64
|
Linux Perl
Linux命令split的使用方法说明
【6月更文挑战第11天】Linux命令split的使用方法说明
464 4
|
JavaScript
TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”
TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”
203 4
|
数据采集 API 调度
Flutter笔记:关于SchedulerBinding
Flutter笔记:关于SchedulerBinding
306 1
|
算法 调度 UED
【操作系统】调度算法的评价指标和三种调度算法
【操作系统】调度算法的评价指标和三种调度算法
520 2
|
运维 关系型数据库 MySQL
【运维面试100问】(三)说说你在故障排除方面的经历_运维面试故障排查类面经
【运维面试100问】(三)说说你在故障排除方面的经历_运维面试故障排查类面经
【运维面试100问】(三)说说你在故障排除方面的经历_运维面试故障排查类面经
|
Python
Python中的贝叶斯分类器以及如何使用Sklearn库实现它。
【4月更文挑战第23天】Sklearn库支持多种贝叶斯分类器,如高斯朴素贝叶斯、多项式朴素贝叶斯和伯努利朴素贝叶斯。以下是一个使用GaussianNB的简要示例:导入必要库,加载鸢尾花数据集,将其划分为训练集和测试集,创建高斯朴素贝叶斯分类器,训练模型,预测并评估(通过准确率)模型性能。
201 0
|
存储 网络协议 安全
【专栏】30 道初级网络工程师面试题为广大网络工程师提供参考。
【4月更文挑战第28天】本文为初级网络工程师提供了30道面试题,涵盖OSI七层模型、TCP/IP协议栈、IP地址分类、ARP、VLAN、STP、DHCP、DNS、防火墙、NAT、VPN、网络拓扑、广域网、以太网、网络存储、网络拥塞、流量监控、延迟、网络安全、网络攻击防范、协议分析、性能优化、故障排查、网络虚拟化和云计算等基础知识。这些问题旨在帮助面试者准备并提升网络工程领域的知识和技能。
1539 0
|
存储 Linux 程序员
x86的内存寻址方式
在16位的8086时代,CPU为了能寻址超过16位地址能表示的最大空间(因为 8086 的地址线 20 位而数据线 16 位),引入了段寄存器。通过将内存空间划分为若干个段(段寄存器像 ds、cs、ss 这些寄存器用于存放段基址),然后采用段基地址+段内偏移的方式访问内存,这样能访问1MB的内存空间了。