0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【RT-Thread学习笔记】80x86汇编基础的三大块知识

嵌入式物联网开发 来源:嵌入式物联网开发 作者:嵌入式物联网开发 2022-07-30 10:57 次阅读

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

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 个寄存器按照一定方式又分为了通用寄存器,控制寄存器和段寄存器。

image-20220130235215566

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

    浏览量

    25735
  • RT-Thread
    +关注

    关注

    31

    文章

    1149

    浏览量

    38908
收藏 人收藏

    评论

    相关推荐

    RT-Thread混合部署Workshop北京站来啦!

    嵌入式软件工程师郭占鑫老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统
    的头像 发表于 04-19 08:34 90次阅读
    <b class='flag-5'>RT-Thread</b>混合部署Workshop北京站来啦!

    4月25日北京站RT-Thread线下workshop,探索RT-Thread混合部署新模式

    嵌入式软件工程师郭占鑫老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统
    的头像 发表于 04-16 08:35 92次阅读
    4月25日北京站<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    4月10日我们将在深圳福田举办RT-Thread混合部署线下workshop,在瑞芯微RK3568平台上实现同时运行RT-Thread和linux,本次workshop邀请到RT-Thread资深嵌入式软件工程师农晓明老师为您讲
    的头像 发表于 03-27 11:36 438次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    4月10日深圳场RT-Thread线下workshop,探索RT-Thread混合部署新模式!

    嵌入式软件工程师农晓明老师为您讲解有关技术知识和实践经验。通过本次workshop能深入理解RT-Thread专业版与混合部署的潜力,在RK3568平台上提升系统实
    的头像 发表于 03-27 08:34 159次阅读
    4月10日深圳场<b class='flag-5'>RT-Thread</b>线下workshop,探索<b class='flag-5'>RT-Thread</b>混合部署新模式!

    RT-Thread能在X86构架下访问PCI板卡设备不?

    RT-Thread能在X86构架下访问PCI板卡设备不? 例如工控机,用于想要一个自主可控的系统,但是有些板卡还是PCI的,不知道RT-Thread能不能驱动?
    发表于 10-18 21:28

    基于rt-thread的socket通信设计

    最近再研究 rt-thread 的通信 ,想设计出 eps8266(多个) rt-thread(作为中控) 服务器的通信框架,使用的开发板是 潘多拉
    的头像 发表于 10-13 15:02 697次阅读
    基于<b class='flag-5'>rt-thread</b>的socket通信设计

    试用RT-Thread Studio(VSCode)

    想尝试RT-Thread studio (VSCode),先下载安装VSCode,再搜索RT-Thread
    的头像 发表于 10-12 10:58 573次阅读
    试用<b class='flag-5'>RT-Thread</b> Studio(VSCode)

    RT-Thread v5.0.2 发布

    RT-Thread 代码仓库地址: ●  https://github.com/RT-Thread/rt-thread RT-Thread 5.0.2 版本发布日志详情: ●  htt
    的头像 发表于 10-10 18:45 781次阅读
    <b class='flag-5'>RT-Thread</b> v5.0.2 发布

    下周六!上海站RT-Thread线下入门培训!

    好久不见 ,RT-Thread 线下培训终于又和大家见面了! 本次培训就以摩斯密码为背景,了解体验电报员的生活,感受摩尔斯电码里的爱情故事,掌握RTOS 基础知识。 活动详情   2023年7月15
    的头像 发表于 07-07 18:45 361次阅读
    下周六!上海站<b class='flag-5'>RT-Thread</b>线下入门培训!

    RT-Thread入门学习笔记-熟悉全局中断的操作

    RT-Thread中,全局中断的操作很多,大家都知道全局中断的【disable】与【enable】
    的头像 发表于 06-07 14:58 1040次阅读
    <b class='flag-5'>RT-Thread</b>入门<b class='flag-5'>学习</b><b class='flag-5'>笔记</b>-熟悉全局中断的操作

    RT-Thread内核对象操作API详解

    目的还是学习并熟悉RT-Thread 操作系统。
    发表于 06-02 09:48 320次阅读
    <b class='flag-5'>RT-Thread</b>内核对象操作API详解

    就在明天!RT-Thread线下培训成都站!

    好久不见 ,RT-Thread 线下培训终于又和大家见面了!本次培训就以摩斯密码为背景,了解体验电报员的生活,感受摩尔斯电码里的爱情故事,掌握RTOS 基础知识。 活动详情   2023年5月20
    的头像 发表于 05-20 03:10 419次阅读
    就在明天!<b class='flag-5'>RT-Thread</b>线下培训成都站!

    就在周六!RT-Thread线下培训成都站!

    好久不见 ,RT-Thread 线下培训终于又和大家见面了!本次培训就以摩斯密码为背景,了解体验电报员的生活,感受摩尔斯电码里的爱情故事,掌握RTOS 基础知识。 活动详情   2023年5月20
    的头像 发表于 05-18 21:45 317次阅读
    就在周六!<b class='flag-5'>RT-Thread</b>线下培训成都站!

    就在周日!RT-Thread线下培训西安站!

    好久不见,RT-Thread 线下培训终于又和大家见面了!本次培训就以摩斯密码为背景,了解体验电报员的生活,感受摩尔斯电码里的爱情故事,掌握RTOS 基础知识。 活动详情   2023年5月21
    的头像 发表于 05-18 21:45 316次阅读
    就在周日!<b class='flag-5'>RT-Thread</b>线下培训西安站!

    基于RT-Thread Studio学习

    前期准备:从官网下载 RT-Thread Studio,弄个账号登陆,开启rt-thread学习之旅。
    的头像 发表于 05-15 11:00 2594次阅读
    基于<b class='flag-5'>RT-Thread</b> Studio<b class='flag-5'>学习</b>