文章目录

  • 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/BPSI/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汇编基础的三大块知识相关推荐

  1. 【汇编实战开发笔记】ARM汇编基础的三大块知识

    文章目录 1 前言 2 ARM知识图谱 3 ARM汇编基础三大块 3.1 寻址方式 3.1.1 立即寻址 3.1.2 寄存器寻址 3.1.3 寄存器偏移寻址 3.1.4 寄存器间接寻址 3.1.5 基 ...

  2. 【汇编实战开发笔记】从汇编代码中找出一段普通的for循环变成“死循环”的根本原因(RT-Thread技术论坛优秀文章)

    文章目录 1 前言 2 问题描述 3 简单分析 4 场景再现 5 柳暗花明 6 找到证据 6.1 究竟是不是警告 6.2 盘根问底 6.3 解除风险 7 扩展延伸 7.1 RISC-V架构 7.2 8 ...

  3. 【Visual C++】游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步

    本系列文章由zhmxy555编写,转载请注明出处.http://blog.csdn.net/zhmxy555/article/details/7468011 作者:毛星云    邮箱: happyli ...

  4. 【Visual C++】游戏开发笔记十七 游戏基础算法 一 游戏随机系统初步

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow 本系列文章由zhm ...

  5. Egret实战开发笔记,飞行射击游戏(六)

    今天是开发飞行射击游戏第五天,玩家多类型子弹及状态和关卡模式. 简介 实现玩家特殊子弹,激光,追踪导弹. 玩家多状态 下方飞出 正常游戏 胜利等待 胜利飞出 以及 玩家保护 和 关卡切换 实现效果 本 ...

  6. Egret实战开发笔记,飞行射击游戏(二)

    简介 Egret实战开发,记录每天的学习进度,欢迎和我一起学习交流~ 目录 简介 实现目标 一.实现子弹类 二.工厂设计模式 三.子弹管理类ZDManager 实现目标 今天是开发飞行射击游戏第二天, ...

  7. 游戏开发笔记十七 游戏基础算法(一) 游戏随机系统初步

    每一款游戏,或大或小,都是由一段段默默无闻的算法在支撑着他们的运作,我们不能只欣赏绚丽的游戏成品表现在我们面前的华丽与光鲜,还要看到那些支撑在华丽与光鲜背后的,鲜为人知的算法. 篇章一 引言 我们知道 ...

  8. IOS开发笔记3-C语言基础复习

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53453499 本文出自:[顾林海的博客] 前言 前篇笔记记录了变量与类 ...

  9. IOS开发笔记2-C语言基础复习

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53439812 本文出自:[顾林海的博客] 前言 在正式进入ios开发前 ...

  10. IOS开发笔记4-C语言基础复习

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/53453520 本文出自:[顾林海的博客] 前言 变量是与某块数据相关联 ...

最新文章

  1. Matlab图像处理创新实践-实验4【综合设计大实验——GUI综合设计】
  2. C#创建WinForm应用程序的入口点
  3. 谷歌浏览器32位版本安装包_Windows 10 OEM渠道告别32位版本 这意味着什么?
  4. COSCon'21 参会指南 你想要的这里都有
  5. SpringCloud工作笔记103---Mybatis-plus使用注解 @TableField(exist = false) 注明非数据库字段属性
  6. OO第二次课程总结分析
  7. java编解码技术,netty nio
  8. Shiro实现用户自动登录
  9. 医疗信息化建设售后服务方案
  10. IDA反汇编工具使用详解
  11. 《R语言与数据挖掘》⑥-④分类与预测建模【KNN算法】
  12. OpenOffice安装及使用
  13. 人机对战五子棋(权值法)
  14. 会讲故事的前物理学家万维钢解读、推荐过的书24本,好书一半
  15. android虚拟机启动不了,android虚拟机adb不能启动情况汇总
  16. 如何使用Kumo Java Word Cloud?
  17. DataGridView控件使用大全
  18. 低代码平台,企业服务新战场
  19. OpenCV编译错误:/usr/include/c++/5/bits/stl_algobase.h:604:58: ...
  20. 第一次运行JADE平台

热门文章

  1. 今晚8:00 | 杜克大学计算进化智能中心(CEI Lab)—— 高效鲁棒深度学习专题!...
  2. 如何给视频加背景音乐?简单快速上手,制作抖音等小视频必备!
  3. 字体外面怎么加边框_CSS如何给字体加边框
  4. 计算机专业英语求职信范文及翻译,英文求职信范文带翻译150字-.doc
  5. 特征工程之特征选择(4)----嵌入法(Embed)
  6. 用例图之参与者、用例间的四种关系
  7. Jitsi Meet的prosody模块报错Client disconnected: ssl handshake failed
  8. 如何设置word的有效期
  9. halo输入QQ号获取QQ头像和名称
  10. Arango db 快速入门