【汇编实战开发笔记】80x86汇编基础的三大块知识
文章目录
- 1 前言
- 2 80x86知识图谱
- 3 80x86汇编基础三大块
- 3.1 寻址方式
- 3.1.1 立即数寻址 / 寄存器寻址
- 3.1.2 直接寻址
- 3.1.3 寄存器直接寻址 / 基址寻址
- 3.1.4 寄存器相对寻址 / 相对基址寻址
- 3.1.5 基址变址寻址
- 3.1.6 相对基址变址寻址
- 3.2 寄存器的用途
- 3.2.1 通用寄存器:
- 3.2.2 控制寄存器:
- 3.2.3 段寄存器:
- 3.3 汇编指令
- 3.3.1 其他
- 4 更多分享
- 5 参考链接
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知识图谱
本文先列个大纲,后续有时间再补充。
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 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。
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。
3.3.1 其他
本人有80x86相关的学习资料若干份,这些都是非常经典使用的学习材料,感兴趣的可以扫码VX联系我。
4 更多分享
欢迎关注我的github仓库01workstation,日常分享一些开发笔记和项目实战,欢迎指正问题。
同时也非常欢迎关注我的CSDN主页和专栏:
【CSDN主页:架构师李肯】
【RT-Thread主页:架构师李肯】
【C/C++语言编程专栏】
【GCC专栏】
【信息安全专栏】
【RT-Thread开发笔记】
【freeRTOS开发笔记】
【BLE蓝牙开发笔记】
【ARM开发笔记】
【RISC-V开发笔记】
有问题的话,可以跟我讨论,知无不答,谢谢大家。
5 参考链接
- 80x86寻址方式
- 80x86寄存器
- 80x86指令
以上参考资料,由本人整理,但来源于网络,侵删!
【汇编实战开发笔记】80x86汇编基础的三大块知识相关推荐
- 【汇编实战开发笔记】ARM汇编基础的三大块知识
文章目录 1 前言 2 ARM知识图谱 3 ARM汇编基础三大块 3.1 寻址方式 3.1.1 立即寻址 3.1.2 寄存器寻址 3.1.3 寄存器偏移寻址 3.1.4 寄存器间接寻址 3.1.5 基 ...
- 【汇编实战开发笔记】从汇编代码中找出一段普通的for循环变成“死循环”的根本原因(RT-Thread技术论坛优秀文章)
文章目录 1 前言 2 问题描述 3 简单分析 4 场景再现 5 柳暗花明 6 找到证据 6.1 究竟是不是警告 6.2 盘根问底 6.3 解除风险 7 扩展延伸 7.1 RISC-V架构 7.2 8 ...
- 【Visual C++】游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步
本系列文章由zhmxy555编写,转载请注明出处.http://blog.csdn.net/zhmxy555/article/details/7468011 作者:毛星云 邮箱: happyli ...
- 【Visual C++】游戏开发笔记十七 游戏基础算法 一 游戏随机系统初步
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...
- Egret实战开发笔记,飞行射击游戏(六)
今天是开发飞行射击游戏第五天,玩家多类型子弹及状态和关卡模式. 简介 实现玩家特殊子弹,激光,追踪导弹. 玩家多状态 下方飞出 正常游戏 胜利等待 胜利飞出 以及 玩家保护 和 关卡切换 实现效果 本 ...
- Egret实战开发笔记,飞行射击游戏(二)
简介 Egret实战开发,记录每天的学习进度,欢迎和我一起学习交流~ 目录 简介 实现目标 一.实现子弹类 二.工厂设计模式 三.子弹管理类ZDManager 实现目标 今天是开发飞行射击游戏第二天, ...
- 游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步
每一款游戏,或大或小,都是由一段段默默无闻的算法在支撑着他们的运作,我们不能只欣赏绚丽的游戏成品表现在我们面前的华丽与光鲜,还要看到那些支撑在华丽与光鲜背后的,鲜为人知的算法. 篇章一 引言 我们知道 ...
- IOS开发笔记3-C语言基础复习
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53453499 本文出自:[顾林海的博客] 前言 前篇笔记记录了变量与类 ...
- IOS开发笔记2-C语言基础复习
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53439812 本文出自:[顾林海的博客] 前言 在正式进入ios开发前 ...
- IOS开发笔记4-C语言基础复习
转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53453520 本文出自:[顾林海的博客] 前言 变量是与某块数据相关联 ...
最新文章
- Matlab图像处理创新实践-实验4【综合设计大实验——GUI综合设计】
- C#创建WinForm应用程序的入口点
- 谷歌浏览器32位版本安装包_Windows 10 OEM渠道告别32位版本 这意味着什么?
- COSCon'21 参会指南 你想要的这里都有
- SpringCloud工作笔记103---Mybatis-plus使用注解 @TableField(exist = false) 注明非数据库字段属性
- OO第二次课程总结分析
- java编解码技术,netty nio
- Shiro实现用户自动登录
- 医疗信息化建设售后服务方案
- IDA反汇编工具使用详解
- 《R语言与数据挖掘》⑥-④分类与预测建模【KNN算法】
- OpenOffice安装及使用
- 人机对战五子棋(权值法)
- 会讲故事的前物理学家万维钢解读、推荐过的书24本,好书一半
- android虚拟机启动不了,android虚拟机adb不能启动情况汇总
- 如何使用Kumo Java Word Cloud?
- DataGridView控件使用大全
- 低代码平台,企业服务新战场
- OpenCV编译错误:/usr/include/c++/5/bits/stl_algobase.h:604:58: ...
- 第一次运行JADE平台
热门文章
- 今晚8:00 | 杜克大学计算进化智能中心(CEI Lab)—— 高效鲁棒深度学习专题!...
- 如何给视频加背景音乐?简单快速上手,制作抖音等小视频必备!
- 字体外面怎么加边框_CSS如何给字体加边框
- 计算机专业英语求职信范文及翻译,英文求职信范文带翻译150字-.doc
- 特征工程之特征选择(4)----嵌入法(Embed)
- 用例图之参与者、用例间的四种关系
- Jitsi Meet的prosody模块报错Client disconnected: ssl handshake failed
- 如何设置word的有效期
- halo输入QQ号获取QQ头像和名称
- Arango db 快速入门