LES    BX, DWORD PTR DS:_OSTCBCur     ;OSTCBCur->OSTCBStkPtr = SS:SP!!!
MOV ES:[BX+], SS ;将当前SS(栈的基地址)寄存器值存放至当前任务控制块的2,3内存单元
MOV ES:[BX+], SP ;将当前SP(栈顶的偏移量)存放至当前任务控制块的0,1内存单元

首先讲讲LES指针的功能:LES的功能有点像C语言的*。

    LES REG,MEM
    
    参与操作的寄存器不仅有REG,还有ES寄存器。在16位系统中,寄存器为16位,很显然,MEM所指向的内存大小应是4字节。运行这个命令,将MEM地址所指向的内存单元的低16位存放于REG寄存器,将MEM地址所指向的内存单元的高16位存放于ES寄存器。
    注意:REG和ES寄存器存放的值不是MEM这个地址值,而是这个地址所指向的内存单元的值,类似C语言的指针的*操作。
    
    明白了LES指针的功能,接下来我们探讨一下uC/OS任务切换中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理。
    
    首先先要说明的是uC/OS编译的时候,使用的是Large模式,每个段大小可达1MB,Large模式下,FAR 指针的长度为32位,然而在FAR指针中存放的不是变量的绝对地址,仍是段地址+偏移量。FAR指针的高16位为变量的段地址,低16位存放变量的段内偏移。
   
     _OSTCBCur为一个指向当前任务的任务控制块的指针变量,存放的是任务控制块结构体的地址,等于结构体第1个成员变量的地址。同时由于任务控制块的第1个成员变量是OS_STK        *OSTCBStkPtr,所以任务堆栈指针变量的地址值和任务控制块的地址值相同。
    
    因此通过LES BX,DWORD PTR DS:_OSTCBCur指令,得到了任务控制块的段地址和段内偏移,得到了任务堆栈指针变量的段地址和段内偏移。
 
    MOV    ES:[BX+2], SS中的ES:[BX+2],是任务堆栈指针变量的第3字节内存单元的地址,所以该指令的作用是,将SS寄存器的16位值的低8位存放至任务堆栈指针变量的第3字节内存单元,高8位存放至任务堆栈指针变量的第4自己内存单元。第二条MOV指令作用也是一样。
 
    这样便实现了将CPU的堆栈指针保存进任务控制块的第1个成员任务堆栈指针变量中。
 
参考链接:

本文链接:http://www.cnblogs.com/cposture/p/4291885.html

【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理的更多相关文章

  1. 【原创】uC/OS II 任务切换原理

    今天学习了uC/OS II的任务切换,知道要实现任务的切换,要将原先任务的寄存器压入任务堆栈,再将新任务中任务堆栈的寄存器内容弹出到CPU的寄存器,其中的CS.IP寄存器没有出栈和入栈指令,所以只能引 ...

  2. uc/os任务创建

    问题描述:      uc/os中任务创建 问题解决: 创建一个任务,任务从无到有.任务创建函数分两种, 一种是基本的创建函数OSTaskCreate, 另一种是扩展的任务创建函数OSTaskCrea ...

  3. 关于uC/OS的简单学习(转)

    1.微内核 与Linux的首要区别是,它是一个微内核,内核所实现的功能非常简单,主要包括: 一些通用函数,如TaskCreate(),OSMutexPend(),OSQPost()等. 中断处理函数, ...

  4. 在STM32F401上移植uC/OS的一个小问题 [原创]

    STM32F401xx是意法半导体新推出的Cortex-M4内核的MCU,相较于已经非常流行的STM32F407xx和STM32F427xx等相同内核的MCU而言,其特点是功耗仅为128uA/MHz, ...

  5. uC/OS 的任务调度解析 (转)

    uC/OS 的任务调度解析 1.任务调度器启动之后(初始化,主要是TCB的初始化),就可以创建任务,开始任务调度了,实际上第一个任务准确的说不是进行任务切换,而是进行启动当前最高优先级任务.uC/OS ...

  6. rep stos dword ptr es:[edi]

    本文链接:https://blog.csdn.net/ypist/article/details/8467163今天读代码时,忽然跳出如下一条指令==>>汇编代码: rep stos dw ...

  7. 关于dword ptr 指令

    dword 双字 就是四个字节ptr pointer缩写 即指针[]里的数据是一个地址值,这个地址指向一个双字型数据比如mov eax, dword ptr [12345678] 把内存地址12345 ...

  8. uC/OS II原理分析及源码阅读(一)

    uC/OS II(Micro Control Operation System Two)是一个可以基于ROM运行的.可裁减的.抢占式.实时多任务内核,具有高度可移植性,特别适合于微处理器和控制器,是和 ...

  9. uc/os 任务删除

    问题描述:     uc/os 任务删除 问题解决: uc/os任务删除流程图 具体代码 注:     如上是关中断,以及取消优先级对应的就绪标志 关中断代码为: 取消就绪标志,实际上是将就绪表中指定 ...

随机推荐

  1. 《Linux就该这么学》第十一天课程

     防火墙常用的一些命令参数 原创地址:https://www.linuxprobe.com/chapter-08.html firewalld中常用的区域名称及策略规则 区域 默认规则策略 trust ...

  2. 使用electron开发指静脉客户端遇到的问题总结

    使用electron 使用nodejs 的ffi模块调用dll文件 总结1.electron 与nodejs版本不需要一致,甚至nodejs版本应该高于electron的node版本2.要安装 Vis ...

  3. Batch_Size对网络训练结果的影响

    最近在跑一些网络时发现,训练完的网络在测试集上的效果总是会受Batch_Size 大小的影响.这种现象跟以往自己所想象的有些出入,于是出于好奇,各种搜博客,大致得出了自己想要的答案,现写一篇博客记录一 ...

  4. java策略设计模式

    1.概述 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化. 其实不要被晦涩难懂的定义所迷惑,策略设计模式实际上就是定义一个接口,只要实现 ...

  5. Paper | 量化CV任务的关联性,寻找最佳迁移策略(Taskonomy)

    目录 1. 问题 2. 方法 3. 实验设计 3.1. 解决词典内部(一组已知)任务的能力 3.2. 解决新任务(少量标记数据)的能力 4. 讨论和启发 论文:Taskonomy: Disentang ...

  6. Paper | 深度网络中特征的可迁移性

    目录 1. 核心贡献 2. 实验设置 2.1. 任务设置 2.2. 网络设置 3. 实验结果 4. 启发 论文:How transferable are features in deep neural ...

  7. ES6学习:两个面试题目--关于模板字符串

    号称看完就能“让开发飞起来”,不过文中的两个面试题目的知识点并没包括在文中. https://www.jianshu.com/p/287e0bb867ae 文中并没有完整的知识点去完成上面的两道题,这 ...

  8. Debian 9.x "stretch" 安装 vnStat 统计服务器流量

    vnStat 是一款开源的 Linux 下统计网卡流量的软件,可以很方便地查看当前.当天.当月的流量统计报告,下面我们介绍下在 Debian 9.x 下安装 vnstat 的简单方法 首先,使用 ip ...

  9. 大数据之hiveSQL

    最近增加了学习java基础算法,包括几种排序算法,二叉树(前序,后序,中序),队列和栈,bmp搜索,广义搜索算法,迭代等等一些技巧(自己动手绝对比单纯的理论要强的多,多练练) HIVE是hadoop生 ...

  10. Redis-03.事务

    Redis事务: 在一个队列(queue)中依次执行一系列的命令. 事务的三个阶段: 1.开始事务(MULTI) 2.命令加入队列 (QUEUE) 3.执行事务 (EXEC) 示例1: MULTI & ...