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

    浏览量

    27146
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44251
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 475次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    学习强国深度报道 RT-Thread“1+X+N”战略,国产操作系统赋能高端制造引关注|媒体视角

    近日,国产嵌入式操作系统领军企业RT-Thread睿赛德在工博会发布的“1+X+N”战略体系,获得了国家级权威媒体平台“学习强国”的重点报道。该报道从产业高度深入剖析了RT-Thread
    的头像 发表于 09-29 17:37 898次阅读
    <b class='flag-5'>学习</b>强国深度报道 <b class='flag-5'>RT-Thread</b>“1+<b class='flag-5'>X</b>+N”战略,国产操作系统赋能高端制造引关注|媒体视角

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1128次阅读
    2025年<b class='flag-5'>RT-Thread</b>开发者巡回培训报名正式启动!

    rt-thread studio 2.2.9如何使用最新的RT-Thread v5.2.0 released?

    rt-thread studio2.2.9如何使用最新的RT-Thread v5.2.0 released? 原先以为修改index_all.json,发现联网的时候,会自动覆盖 另lastet版本
    发表于 09-16 06:06

    在Ubuntu上开发基于先楫MCU的RT-Thread应用指南

    1、前言RT-ThreadEnv是RT-Thread推出的开发辅助工具,针对基于RT-Thread操作系统的项目工程,提供编译构建环境、图形化系统配置及软件包管理功能。其内置的menuconfig
    的头像 发表于 08-29 12:22 1218次阅读
    在Ubuntu上开发基于先楫MCU的<b class='flag-5'>RT-Thread</b>应用指南

    【好书推荐】RT-Thread第20本相关书籍!《嵌入式实时操作系统RT-Thread原理与应用》| 技术集结

    01内容简介ContentSummary本书为读者提供了一个全面、系统的RT-Thread学习指南,旨在帮助初学者及有经验的开发者掌握RT-Thread实时操作系统和STM32嵌入式微控制器的核心
    的头像 发表于 08-24 10:05 685次阅读
    【好书推荐】<b class='flag-5'>RT-Thread</b>第20本相关书籍!《嵌入式实时操作系统<b class='flag-5'>RT-Thread</b>原理与应用》| 技术集结

    RT-Thread 遇上 Rust:安全内核 RusT-Thread 的诞生

    大家好,我们是中国科学技术大学操作系统原理与设计(H)课oooooS小组。这个项目是我们的课程大作业:参考RT-Thread架构,使用Rust搭建一个原生的嵌入式操作系统内核。初识Rust是因为xk
    的头像 发表于 08-02 11:03 3193次阅读
    <b class='flag-5'>RT-Thread</b> 遇上 Rust:安全内核 RusT-<b class='flag-5'>Thread</b> 的诞生

    用SPI玩转WiFi,RT-Thread ESP-Hosted驱动深度适配指南 | 技术集结

    还在为MCU的WiFi连接方案发愁?RT-Thread社区开源ESP-Hosted驱动,通过标准SPI接口即可实现,并且该仓库已整理成RT-Thread软件包。RT
    的头像 发表于 07-09 19:03 1110次阅读
    用SPI玩转WiFi,<b class='flag-5'>RT-Thread</b> ESP-Hosted驱动深度适配指南 | 技术集结

    RT-Thread荣获2025优秀开源项目 | 新闻速递

    6月底,RT-Thread睿赛德受邀参与由上海开源信息技术协会主办的2025上海开源创新精英荟。上海市商委副主任张杰出席会议并致辞。RT-Thread嵌入式操作系统项目凭借其卓越的技术创新与开源生态
    的头像 发表于 07-04 09:04 2417次阅读
    <b class='flag-5'>RT-Thread</b>荣获2025优秀开源项目 | 新闻速递

    深度剖析 RT-Thread 线程调度流程

    RT-Thread调度第一个线程的主要流程分如下:rtthread_startup:RTT的启动函数,主要负责板级驱动,调度器,系统线程初始化,启动调度的工作
    的头像 发表于 06-25 18:24 1434次阅读
    深度剖析 <b class='flag-5'>RT-Thread</b> 线程调度流程

    揭秘RT-Thread上的AUTOSAR CP系统

    本文探讨了RT-Thread与AUTOSARCP的融合,解决车载ECU开发中实时性、安全性与灵活性的平衡问题。通过分层安全内核(rt-safetyos/autoos)和工具链整合,兼容AUTOSAR
    的头像 发表于 06-23 20:22 2938次阅读
    揭秘<b class='flag-5'>RT-Thread</b>上的AUTOSAR CP系统

    2025 RT-Thread全球技术大会议程正式发布!

    RT-ThreadGlobalTechConference(RT-ThreadGTC,RT-Thread全球技术大会)是聚焦基础软件技术创新与实践的嵌入式技术盛会,持续推动技术价值转化
    的头像 发表于 05-27 19:28 1065次阅读
    2025 <b class='flag-5'>RT-Thread</b>全球技术大会议程正式发布!

    RT-Thread审核团招募: 深度参与开源RTOS社区治理与演进

    全球开发者招募:RT-Thread审核团(ReviewTeam)正式开放申请!在开源的世界里,代码审查(CodeReview)是保证软件质量、促进技术交流的关键环节。RT-Thread作为全球领先
    的头像 发表于 05-21 18:02 1058次阅读
    <b class='flag-5'>RT-Thread</b>审核团招募: 深度参与开源RTOS社区治理与演进

    如何将RT-Thread移植到NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植到NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有所帮助。
    的头像 发表于 02-13 10:37 2431次阅读
    如何将<b class='flag-5'>RT-Thread</b>移植到NXP MCUXPressoIDE上

    Deepseek上单片机?RT-Thread上跑通大语言模型

    前言单片机也能聊天?RT-Thread上跑通大语言模型在RT-Thread论坛上忽然看到了单片机和大模型对话的文章,想着春节期间看到大语言模型的热度持续攀升,恰巧手头有RA8D1VisionBoard开发板,于是尝试着在Vis
    的头像 发表于 02-07 18:59 2364次阅读
    Deepseek上单片机?<b class='flag-5'>RT-Thread</b>上跑通大语言模型