1     LES    BX, DWORD PTR DS:_OSTCBCur     ;OSTCBCur->OSTCBStkPtr = SS:SP!!!
2     MOV    ES:[BX+2], SS                  ;将当前SS(栈的基地址)寄存器值存放至当前任务控制块的2,3内存单元
3     MOV    ES:[BX+0], 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://blog.csdn.net/yihuiworld/article/details/7536884
http://bbs.csdn.net/topics/33551
http://bbs.csdn.net/topics/340064154
http://cpyjzhen.blog.163.com/blog/static/14293975200732754346452/
http://bbs.csdn.net/topics/33551
http://blog.csdn.net/li4850729/article/details/7821524
http://www.360doc.com/content/11/1014/00/1317564_156004804.shtml

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

转载于:https://www.cnblogs.com/cposture/p/4291885.html

【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理相关推荐

  1. uc/OS-II操作系统:uc/OS中的任务_上(如不懂——>请收下我的膝盖)

    uc/OS中任务的学习目录 注:本章未写完的在后面章节会继续书写 (1)任务的基本概念 (2)任务堆栈 (3)任务控制块及任务控制块链表 (4)任务就绪表及任务调度 (5)任务的创建 (6)任务的挂起 ...

  2. uc/OS-II操作系统:uc/OS中的任务_下(如不懂——>请收下我的膝盖)

    注:本章接着上一章节书写 六.任务的挂起和恢复 (1)挂起一个任务,就是暂停这个任务的调度. (2)挂起任务的 TCB 还存在系统中,只是该任务的状态是 "挂起" ,对挂起态的任务 ...

  3. OS中阻塞与挂起的区别sleep()的实现原理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/xpy870663266/article ...

  4. uc/os中对任务的总体理解

    原文:点击打开链接 一. 任务的基本概念 1. 任务分三个部分 :任务控制块,任务堆栈,任务程序代码. 任务控制块:关联了任务代码的程序控制块,它记录了任务的各个属性; 任务堆栈:用来保存任务的工作环 ...

  5. java中什么泛型_【原创】java中的泛型是什么,有什么作用

    泛型(Generic type 或者 generics)是对 Java 语言的类型系统的一种扩展,以支持创建可以按类型进行参数化的类.可以把类型参数看作是使用参数化类型时指定的类型的一个占位符,就像方 ...

  6. 汇编语言(王爽 第三版)检测点9.1 解决-a无法输入jmp dword ptr es:[1000h]

    第一个: assume cs:code,ds:data data segmentdb 0h data ends code segment start:mov ax,datamov ds,axmov b ...

  7. uC/OS和uClinux的比较

    摘    要: 嵌入式操作系统是嵌入式系统应用的核心.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结了嵌入式操作系统应用中的若干问题,归纳了嵌入式操作系统的选型依据. 引言     随着现代 ...

  8. UC/OS和UCLinux比较

    随着现代计算机技术的飞速发展和互联网技术的广泛应用,从pc时代过渡到了以个人数字助理.手持个人电脑和信息家电为代表的3c(计算机.通信.消费电子)一体的后pc时代.后pc时代里,嵌入式系统扮演了越来越 ...

  9. 嵌入式系统 操作系统 uC/OS uClinux

    摘要:嵌入式操作系统是嵌入式系统应用的核心软件.本文通过对两种典型的开源嵌入式操作系统的对比,分析和总结嵌入式操作系统应用中的若干问题,归纳嵌入式操作系统的选型依据. 关键词:嵌入式系统 操作系统 u ...

最新文章

  1. eplan怎么插入表格_EPLAN电气图实例控制柜(控制面板)
  2. JSF AJAX请求的会话超时处理
  3. Flutter+Serverless端到端研发架构实践
  4. HBase写性能优化策略
  5. RSA加密算法理解(整理自网络)
  6. obd协议 混动车_最新人工智能驾考系统OBD信号采集模块
  7. 用计算机关闭无线网络连接,干货分享:打印机无线连接断开了怎么办?
  8. b、B、KB、MB、GB 之间的大小关系以及换算
  9. JAVA制作游戏脚本(1)---Robot机器人
  10. html播放器怎么删除,风行如何完全删除?风行播放器彻底删除图文教程汇总
  11. 双击打开Excel2016文件后无法直接显示文件内容的解决办法
  12. C语言课程设计-实验室设备管理系统
  13. ROS软路由加eNSP模拟华为交换机模拟环境测试
  14. FPGA开源项目:双目测距(二)之Matlab算法仿真以及图片转txt
  15. C语言实现继承,封装,多态
  16. Linux工具推荐:方便地查看进程网速
  17. 什么是惊群,如何有效避免惊群?
  18. 途牛旅游项目——注册邮箱激活
  19. 为什么测试环境测试通过,线上还会有bug?
  20. python替换list中的元素

热门文章

  1. leetcode180. 连续出现的数字(SQL)
  2. leetcode242. 有效的字母异位词
  3. Redis:23---info命令总结
  4. Redis:09---Hash对象
  5. c++基础学习(07)--(类)
  6. 密码学专题 非对称加密算法指令概述 DSA算法指令
  7. C++学习笔记章节中 面向对象详解
  8. Dapp简单的投票小例子
  9. 区块链相关问题 理解
  10. python 版本2和3 在/取模方面的的差异