【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
生活随笔
收集整理的這篇文章主要介紹了
【原创】uC/OS 中LES BX,DWORD PTR DS:_OSTCBCur的作用及原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
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
? ?? ? ??參與操作的寄存器不僅有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的作用及原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CADENCE ORCAD原理图导出FP
- 下一篇: vivado在远程服务器上完成本地设备的