1 前言
搞计算机的肯定听说过80x86,至少你的汇编基础课程肯定是基于80X86系统来学习的。
x86或80x86是英特尔Intel首先开发制造的一种微处理器体系结构的泛称。该系列较早期的处理器名称是以数字来表示,并以“86”作为结尾,包括Intel 8086、80186、80286、80386以及80486,因此其架构被称为“x86”。由于数字并不能作为注册商标,因此Intel及其竞争者均在新一代处理器使用可注册的名称,如Pentium。现时Intel把x86-32称为IA-32,全名为“Intel Architecture, 32-bit”。
“X86”是Intel和其他几家公司处理器所支持的一组机器指令集,它大致确定了芯片的使用规范。从8086到80186、80286、80386、80486,再到后来的奔腾系列以及现在的多核技术,都是使用一脉相承的x86指令集,既不断扩展又向后兼容。
更多介绍,请参考百度百科。
2 80x86知识图谱
本文先列个大纲,后续有时间再补充。
![image-20220130234307648](https://file.elecfans.com//web2/M00/59/1A/pYYBAGLknheAOiIDAAC6u0tXPIc516.png)
3 80x86汇编基础三大块
这里整理了80x86汇编中非常基础的三大块知识,了解了这三大块内容基本可以看懂甚至编译一些简单的汇编程序。
3.1 寻址方式
80x86的寻址方式就是表示指令中数据所在地址的方式。一共有七种寻址方案:立即数寻址、寄存器寻址、直接寻址、寄存器直接寻址、寄存器相对选址、基址变质寻址、相对基址变质寻址。
3.1.1 立即数寻址 / 寄存器寻址
MOV AX, 1; AX = 1
立即数寻址,我觉得称不上寻址,因为他给出的不是地址,而就是实际的数字,上面的命令中 1 就是立即数,而AX就是寄存器寻址所以寄存器寻址就是直接使用寄存器,数据直接存入指定的寄存器
寄存器寻址可以使用的寄存器是AX(AL AH) BX(BL BH) CX(CL CH) DX(DL DH) SI DI SP BP等, 这些寄存器可以任意组合,举例如下
MOV AX, BX; AX = BX
MOV BX, AX; BX =AX
MOV SI, DI; SI = DI
MOV DI, SI; DI = SI
这两种寻址方式是不涉及内存的操作的,所以速度是最快的,所以为了性能考虑应该尽量多的使用这两种寻址方式的操作。
注意: MOV 1, AX 是非法的,应为1就是常数,你不能给常数赋值
3.1.2 直接寻址
MOV AX, [1234H]
MOV AX, ES:[1234H]
直接寻址就是直接给出内存地址的寻址方式,格式是 段寄存器:[偏移地址] 偏移地址是立即数,用[]括起来。当然也可以直接省去前面的段寄存器写作 [偏移地址],这样汇编会自动选择一个默认的段地址,一般来说是DS段寄存器。前面讲过内存地址是 段地址X16+偏移地址,所以使用段寄存器:[偏移地址] 给出的地址就是 段寄存器的值X16 + 偏移地址,
举例
MOV AX, DS:[1234H]
这句话的就是将DSx16+1234H处的数据复制给AX寄存器,假设DS=5000H 那么就是将内存51234处的数据复制给AX,具体是多少就要看当时内存中是什么数据了。
MOV AX, ES:[1234H]
就是显示指定了使用的ES段寄存器,所以就是将ESx16+1234H处的数据复制给AX
注意 ":"前面只能跟着段寄存器 DS ES SS CS寄存器
这一条寻址方式其实是最基础的寻址方式,接下来的其他几种寻址方式都是只是[]中偏移地址的表示方式发生了一些变化而已。
3.1.3 寄存器直接寻址 / 基址寻址
MOV AX, [BX]
MOV AX,CS:[BX]
本质上和直接寻址是没太大区别的,唯一的区别就是在直接寻之中[]中的数据是直接给出的,但是在寄存器间接寻址中这个数字是存储在寄存器中而已。
这里有个限制就是[] 中能使用的寄存器只有 BX BP SI DI ,如果使用的是BX SI DI则默认的段寄存器是DS,如果是BP寄存器则默认使用SS寄存器。
当然如果特意指定寄存器那么就用指定的寄存器。
举例 AX =1 BX = 1111H DS = 5000H
MOV AX, [BX] ; 等于MOV AX,DS:[1111H] 就是将51111H内存出的数据复制到AX中
3.1.4 寄存器相对寻址 / 相对基址寻址
MOV AX, [BX + 1111H]
在寄存器直接寻址的基础上加上立即数,其他规则还是和寄存器直接寻址一样的
举例 AX =1 BX = 2222H DS=5000H
MOV AX, [BX + 1111H] ; 等于 MOV AX, DS:[2222H + 1111H] => MOV AX, DS:[3333H]
### 3.1.5 基址变址寻址
MOV AX,[BX+SI]
基址变址寻址就是用了两个寄存器 {BX/BP}+{SI/DI}, 如果是出现BP寄存器则默认使用SS寄存器,否则默认使用DS寄存器.规则和寄存器间接寻址也是一样的。
要注意的是这里分为两组了寄存器 BX/BP 和SI/DI,一组中只能出现一个,即不能出现[ BX+BP ] 和 [SI+DI],从名字中就可以看出的 基址+变址,
BX 基地址寄存器
BP 基址指针寄存器(Base Point)
SI 源地址寄存器(Source Index)
DI 目的地址寄存器(Destination Index)
举例 AX =1 BX=1111H SI=2222H DS= 5000H
MOV AX,[BX+SI]; 等于 MOV AX, DS:[BX+SI] => MOV AX, DS:[1111H+2222H] => MOV AX, DS:[3333H]
### 3.1.6 相对基址变址寻址
MOV AX,[BX+SI+4444H]
可以看出就是在基址变址寻址的基础上加上了立即数其他规则不变
举例 AX =1 BX=1111H SI=2222H DS= 5000H
MOV AX,[BX+SI+4444H]; 等于 MOV AX, DS:[BX+SI+4444H] => MOV AX, DS:[1111H+2222H+4444H] => MOV AX, DS:[7777H]
3.2 寄存器的用途
80x86 CPU 中寄存器总共为 14 个,且均为 16 位 。
即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。
而这 14 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。
![image-20220130235215566](https://file.elecfans.com//web2/M00/58/7C/poYBAGLknhiAP9ZbAANSO4N_kd4829.png)
3.2.1 通用寄存器:
AX,BX,CX,DX 称作为数据寄存器:
AX (Accumulator):累加寄存器,也称之为累加器;
BX (Base):基地址寄存器;
CX (Count):计数器寄存器;
DX (Data):数据寄存器;
SP 和 BP 又称作为指针寄存器:
SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
SI 和 DI 又称作为变址寄存器:
SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器;
3.2.2 控制寄存器:
IP (Instruction Pointer):指令指针寄存器;
FLAG:标志寄存器;
3.2.3 段寄存器:
CS (Code Segment):代码段寄存器;
DS (Data Segment):数据段寄存器;
SS (Stack Segment):堆栈段寄存器;
ES (Extra Segment):附加段寄存器;
3.3 汇编指令
由于80x86的指令非常多,本文仅列举常见的一些汇编指令,更多的指令格式,请参考其他资料。
从功能分类上来说,一共可分为
- 数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。
- 算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。
- 逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。
- 控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。
- 串操作指令:MOVS、LODS、STOS、CMPS、SCAS。
- 标志处理指令:CLC、STC、CLD、STD。
4 更多分享
欢迎关注我的github仓库01workstation,日常分享一些开发笔记和项目实战,欢迎指正问题。
同时也非常欢迎关注我的专栏:有问题的话,可以跟我讨论,知无不答,谢谢大家。
5 参考链接
- 80x86寻址方式
- 80x86寄存器
- 80x86指令
-
汇编
+关注
关注
2文章
214浏览量
26039 -
RT-Thread
+关注
关注
31文章
1308浏览量
40495
发布评论请先 登录
相关推荐
如何将RT-Thread移植到NXP MCUXPressoIDE上
![如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上](https://file1.elecfans.com/web3/M00/08/12/wKgZPGetWzWAPmQsAAAT9RkoMiQ238.png)
RT-Thread上CAN实践
![<b class='flag-5'>RT-Thread</b>上CAN实践](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
开源共生 商业共赢 | RT-Thread 2024开发者大会报名启动!
![开源共生 商业共赢 | <b class='flag-5'>RT-Thread</b> 2024开发者大会报名启动!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
【大连】9月7日RT-Thread巡回线下培训-OpenMV机器视觉
![【大连】9月7日<b class='flag-5'>RT-Thread</b>巡回线下培训-OpenMV机器视觉](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
2024 RT-Thread全球巡回 线下培训火热来袭!
![2024 <b class='flag-5'>RT-Thread</b>全球巡回 线下培训火热来袭!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread 新里程碑达成——GitHub Star 破万!
![<b class='flag-5'>RT-Thread</b> 新里程碑达成——GitHub Star 破万!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
6月6日杭州站RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![6月6日杭州站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
5月16日南京站RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![5月16日南京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
RT-Thread混合部署Workshop北京站来啦!
![<b class='flag-5'>RT-Thread</b>混合部署Workshop北京站来啦!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式
![4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C6/D0/wKgaomYDlJyAKUBmAAAgR-TqYwc187.png)
4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!
![4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!](https://file1.elecfans.com/web2/M00/C4/8A/wKgZomX0EhWACv8DAAAUet8ikhs451.png)
恩智浦半导体正式加入RT-Thread全球合作伙伴计划!
![恩智浦半导体正式加入<b class='flag-5'>RT-Thread</b>全球合作伙伴计划!](https://file1.elecfans.com/web2/M00/C5/31/wKgaomXyY_eAHGhqAAAkpBZI8PE901.png)
RT-Thread设备驱动开发指南基础篇—以先楫bsp的hwtimer设备为例
![<b class='flag-5'>RT-Thread</b>设备驱动开发指南基础篇—以先楫bsp的hwtimer设备为例](https://file1.elecfans.com/web2/M00/C1/40/wKgaomXUXOGAMhesAAAk3OUcwHA076.png)
评论