IA32和X86有什么区别?
博主昵称:一拳必胜客
博主主页面链接:博主主页传送门
博主专栏页面连接:专栏传送门--计算机考研
创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流;
博主研究方向:渗透测试、嵌入式、机器学习;
博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
特别鸣谢:木芯工作室
孔子学鼓琴师襄子,十日不进。师襄子曰:“可以益矣。”孔子曰:“丘已习其曲矣,未得其数也。”有间,曰:“已习其数,可以益矣。”孔子曰:“丘未得其志也。”有间,曰:“已习其志,可以益矣。”孔子曰:“丘未得其为人也。”有间,有所穆然深思焉,有所怡然高望而远志焉。曰:“丘得其为人,黯然而黑,几然而长,眼如望羊,如王四国,非文王其谁能为此也!”师襄子辟席再拜,曰:“师盖云文王操也。”
数据传送指令
格式: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寄存器当前值 使用的位
————————————————
版权声明:本文为CSDN博主「xcy6666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/giantpoplar/article/details/53286466交换数据
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中。
————————————————
版权声明:本文为CSDN博主「xcy6666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/giantpoplar/article/details/53286466压栈 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的地址
1
2
3
4
5
出栈 popx destination16bit/32bit 寄存器
16bit 段寄存器
16bit/32bit 内存位置
e.g.popl %ecx
popw %cx
popl valueESP寄存器是堆栈指针跟踪着堆栈的开始位置
压入和弹出所有寄存器
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
Rete.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————————————————
版权声明:本文为CSDN博主「xcy6666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/giantpoplar/article/details/53286466x86
早期,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/AArch64ARM是精简指令集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
————————————————
版权声明:本文为CSDN博主「jrglinux」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_23662505/article/details/119374633
IA32和X86有什么区别?相关推荐
- 大型机、小型机、x86服务器的区别
首先来讲x86服务器,与平常人们所接触的台式机笔记本类似,采用CISC架构处理器.随着英特尔至强处理器的性能不断提升,业内有种说法是x86服务器有抢占小型机市场的趋势. x86服务器 Intel推出至 ...
- 小型机 PC服务器 性能,大型机、小型机、x86服务器的区别
大型机.小型机.x86服务器的区别 首先来讲x86服务器,与平常人们所接触的台式机笔记本类似,采用CISC架构处理器.随着英特尔至强处理器的性能不断提升,业内有种说法是x86服务器有抢占小型机市场的趋 ...
- X64汇编语言寄存器结构及其与X86架构编程区别
目录 1. 关于X64架构 2. X64架构的寄存器结构 2.1 通用目的寄存器 2.2 浮点数寄存器 2.3 指令指针寄存器 2.4 段寄存器 2.5 标识寄存器 2.6 控制寄存器 2.6. ...
- arm架构和x86架构的区别详解
什么叫arm架构 ARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachine),是一个32位精简指令集(RISC)处理器架构,其广泛地使用 ...
- 华为云服务器CPU架构x86和鲲鹏区别对比及选择
华为云服务器x86计算和鲲鹏计算有什么区别?x86和鲲鹏是指CPU架构的两个系列,x86采用复杂指令集(CISC),鲲鹏采用精简指令集(RISC).云服务器吧来详细说下华为云服务器CPU架构x86计算 ...
- Android 设备 arm 架构和 x86 架构的区别
我们在使用 AndroidStudio 创建模拟器并且在选择 Android 系统版本的时候会碰到 一个选项,需要你选择是基于 x86 架构的还是基于 ARM 架构的. 如下图所示: 那么这 2 个有 ...
- ARM与X86 CPU架构区别
CISC(复杂指令集计算机)和RISC(精简指令集计算机)是当前CPU的两种架构.它们的区别在于不同的CPU设计理念和方法.早期的CPU全部是CISC架构,它的设计目的是 CISC要用最少的机器语言指 ...
- ARM架构与x86架构的区别
一.什么是ARM架构 ARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachine),是一个32位精简指令集(RISC)处理器架构,其广泛地 ...
- arm架构和x86架构的区别
什么叫ARM架构? ARM架构过去称作进阶精简指令集机器(AdvancedRISCMachine,更早称作:AcornRISCMachine),是一个32位精简指令集(RISC)处理器架构,其广泛地使 ...
最新文章
- R语言rpartb包树回归模型构建:基于乳腺癌(breast cancer)数据集
- 计算机视觉——自动识别车牌简介
- vm安装u盘linux,vmware 安装centos 插入u盘报错,大神请指导
- Django设计理念
- Jerry的反省:程序员不要轻易说出“这个功能技术上无法实现“
- java中,在一个有序数组中插入元素,使得数组保持有序排列
- win与linux渊源,微软与Linux从对立走向合作,WSL是如何诞生的
- JavaScript基本概念(下)
- 用WPF实现在ListView中的鼠标悬停Tooltip显示
- FFT分析的加窗和重叠
- 让VB6 IDE“认识”鼠标滚轮
- GitLab版本管理(转)
- ios swift5 设置PingFangSC字体
- Writeup for 0CTF2017 web
- python怎么打e,python e怎么表示
- 为什么uzi排到古手羽就秒_Uzi排到古手羽秒退,网友争相发表看法,直播间弹幕疑似给出答案...
- 使用阿里云的身份证实名认证接口
- 使用python制作时间戳转换工具
- 十年牧码,我的平凡之路
- 怎样学好英语?(多年英语学习经验总结)