




已阅读5页,还剩36页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
EMC8BIT单片机从入门到精通之二:指令应用的误区与技巧 EMC的基本指令语法,其实也就57/58条,如何变化折腾,就看各位的修行造化了。但是,新手上路总容易进入一些误区,而老鸟们的一些技巧也值得借鉴。废话少说,言归正传,且看匠人娓娓道来1.减法指令的误区 之一:关于ACC EMC的减法指令有三条,如下: SUB A,R (R-AA) SUB R,A (R-AR) SUB A,K (K-AA) 需要注意的是,不论A的位置在前面还是后面,A都是减数,不是被减数. 也就是說如果我們想計算A-2的值,如果寫成: SUB A,2 其實是執行2-A 解決方法如下: ADD A,256-2 或 ADD A,254 之二:关于CY 一般来说,加/减法都会影响到进位标志CY. 在其它一些单片机指令系统中,当减法发生借位时,CY=1,未发生借位时CY=0. 如果你以为EMC的减法也是如此,哈哈,你就要吃药了! 原来,在EMC的指令系统中.当减法发生借位时,CY=0,未发生借位时CY=1. 如果不注意这点,很容易在一些运算或判断程序中留下BUG2.查表(散转)指令的误区 之一:关于ADD R2,A指令 在EMC153/156的指令系统中,没有TBL指令(这一点要切记),当要查表时只好用ADD R2,A(或MOV R2,A)来代替 但是使用ADD R2,A时要注意,这条指令只能改变PC指针的低8位(即256字节),高位其它位一律清零! 所以使用ADD R2,A时必须保证整个表格都在ROM的每一页的前256字节区间内.(153/156只有一页) 大表格的使用受到了限制,而且为了将表格挤入00HFFH的ROM空间,程序的结构受到破坏. 之二:关于TBL指令 刚才说道,ADD R2,A指令使用的诸多不爽之处. 为此,EMC在447/458及后续的芯片的指令系统中,增加了一条新指令-就是TBL指令. TBL是查表指令.号称可以放在程序的任何位置. 但是且慢- TBL指令的使用也要注意如下: 首先,表格不能跨页(每1024字节为一页(PAGE) 其次,表格也不能跨段 何为段?-段是匠人自定义的一个概念:将每一页分为4段,每一段256个字节(如:00HFFH是一段,100H1FFH又是一段) 也就是说,每一个查表程序,除了TBL本身占用了一个字节以外表格长度必须Y就交換. 延續上一個例子,此法用應用在Bubble Sort特別管用。 MOV A,X SUB A,Y JBC PSW,FC JMP NO_CHANGE ADD X,A SUB Y,A 2補數 2補數加法經常代替減法,傳統上的做法是先取1補數,然後加1。 COM REG INC REG 或是可以利用另一種方式求得,所不同的是第二種方式會影響PSW暫存器。 ADD A,REG SUB A,REG 如果您所要求的數已經放在ACC裡面,那只要一行就能解決了。 SUB A,0 旋轉位元組運算 在8051指令中位元左旋有RLC與RL兩種指令區分,RLC在ACC左旋時會連帶將CY一併旋轉,而RL只會將ACC的MSB旋入LSB。EM78XXX指令只有RLC,那麼要如何才能做到不帶CY旋轉呢?答案是旋轉兩次: RLCA REG1 RLC REG1 如圖1所示,第一次位元旋轉並沒有真正改變REG1的內容,目的是將REG1的MSB先放入FC,第二次位元旋轉才將剛剛放在FC內的MSB旋入LSB。同理,兩個BYTES不經FC的位元旋轉也是相同的原理。 RLCA HI_BYTE RLC LO_BYTE RLC HI_BYTE 範圍判斷 寫程式免不了會碰到IF.THEN.的場合,有些人覺得EM78XXX的條件判斷式太過繁瑣,所以筆者也將它們整理歸納一下。條件判斷式可分為開放區間條件式與封閉區間條件式來討論,以圖2來表示。 開放條件式是以N點為出發點,當待測值大於N或是小於等於N時的條件判斷,以C的語法描述如下: if(numbern) . /* number大於N */ else . /* number小於等於N */ EM78XXX組合語言寫法如下: MOV A,N+1 SUB A,Number JBC PSW,FC JMP LABEL_1 ; 大於N JMP LABEL_2 ; 小於等於N 封閉式條件判斷是指待測值N是否在X與Y的範圍之內,若以C的語法描述: if(number=x) & (number=y) . /* in range */ else . /* False */ 如何以EM78組合語言做到呢?一般做法是以減法後的PSW做條件判斷,程式如下: MOV A,2 SUB A,number JBS PSW,FC JMP FALSE MOV A,y+1 SUB A,SI JBC PSW,FC JMP FALSE IN_RANGE: ; . FALSE: ; . 這個IF條件式要花費8個指令Cycle,還不算太複雜。但是還有個更簡潔的方法,以下用加法後的PSW(R3)做條件判斷,一共只要5行就清潔溜溜了。 MOV A,Number ADD A,255-y ADD A,y-x+1 JBC PSW,FC JMP IN_RANGE FALSE: ; . IN_RANGE: ; . 說明 關鍵就在前三行,x表示條件式的下限值,y表示條件式的上限值,可以看得出仍是利用CY旗標製造的特效,不但精簡而且有點小聰明,許多老手都愛用,這也是他們口袋裡的秘密武器之一。如果您覺得不錯,不妨也收入錦囊中,爾後就可以依樣畫葫蘆了。 ACC與暫存器內容交換 這理我們要介紹一種快速的邏輯演算法,只需要3個指令CYCLE,就可以將ACC的內容與暫存器的內容交換,不拖泥帶水,Very cute! XOR Number,A XOR A,Number XOR Number,A 請讀者自行在紙上推算一次,就知道答案了。 交換多組暫存器內容 利用上面介紹的方法,可以推廣到多組暫存器交換的例子上,下面的程式將5組DATA內容移位,第一筆暫存器的資料傳到第二筆暫存器內,第二暫存器的資料再傳送到第三筆暫存器內,依此類推,最後一筆資料則傳給第一個暫存器,形成一種位元組資料旋轉。 MOV A,5 MOV COUNT,A MOV A,DATA1 MOV RSR,A MOV A,DATA5 NEXT: XOR INDIR,A XOR A,INDIR XOR INDIR,A INC RSR DJZ COUNT JMP NEXT 計算MOD 2N 假如你剛好需要計算ACC MOD X,且X剛好是2的N次方,使用ACC AND (X-1)是最快的方法了。例如要判斷YEAR是否為閏年,有個簡單的方法,可以排除一些非閏年的條件,只要不能被4整除者就不是閏年。所以可以用YEAR AND 3解決。 MOV A,4-1 AND A,YEAR JBS PSW,FZ JMP NOLEAP 清除一段連續的記憶體 對於連續一段記憶體做讀寫最好的方式就是使用間接定址法,但是要注意在一些如M78447/811/860等高階MCU,記憶體20H 3FH又可以分成4組BANK,如果之前沒有切換到正確的BANK會造成讀寫錯誤。下面的範例程式會將BANK1內的32個BYTES全部清為0。 INDIR = 0x00 RSR = 0x04 COUNT = 0x10 REG = 0x20 BANK1 = 0x40 BANK2 = 0x80 BANK3 = 0xC0 MOV A,32 MOV COUNT,A MOV A,REG|BANK1 MOV RSR,A NEXT: CLR INDIR INC RSR DJZ COUNT JMP NEXT 計算一個BYTE中有多少個1 這個小程式可以檢查出在某個BYTE中共有幾個1,在某些演算法的過程可能會用得到,計算的結果放在ACC。 RRCA DATA AND A,0x55 SUB DATA,A MOV A,DATA AND A,0x33 ADD DATA,A RRC DATA ADD DATA,A RRC DATA SWAPA DATA ADD A,DATA AND A,0x0F 節省NOP指令的方法 您還在為程式擠不下傷腦筋嗎?NOP指令有時候在延遲指令時間很有用,假如你有連續兩個NOP指令可以用JMP到下一個指令的方式代替,因為這樣可以減少一個指令BYTE,又可以達到相同的效果。 例如: NOP NOP 可以寫成: JMP NEXT_INST NEXT_INST: ;. 因為一個NOP花費一個指令Cycle,但是一個JMP指令就需要2個指令Cycle,雖然有時候會抱怨JMP指令會多花一點時間,但是想不到它也有如此妙用吧。 LABEL太多? 寫組合語言最令人傷腦筋的問題之一就是程式中到處是label,這有兩個壞處,第一就是不小心就會造成label重複的問題,第二就是想不出適當的label名稱。如果您已經為label的命名問題腸枯思竭,給您提供一個小方法,程式中如果用$可以表示目前PC的位址,依此推論$+2表示PC+2,$-4表示PC-4,看看底下的例子您立刻就明白: MOV R,R JBS PSW,FZ JMP $+2 JMP $-4 ; . 不過也要給您一個建議,label有個重要的意義就是具有註解的功能,特別是針對一些懶的寫註解的人格外重要。所以這個方法僅適合使用在重複性很高的程式片斷。 SWITCH.CASE敘述 在程式設計的過程中,免不了常常會碰到多重選項的問題,利用EM78XXX的查表指令試試看,所以TBL除了當作一般查表指令以外,還可以當作多重條件判斷之用。 MOV A,CASE TBL JMP EVENT1 ; CASE=0 JMP EVENT2 ; CASE=1 JMP EVENT3 ; CASE=2 JMP EVENT4 ; CASE=3 多位元組的遞增及遞減運算 因為EM78XXX是8位元的單晶片,如果要執行8位元以上的計算,必須將多個位元組看成是一個變數,以下我們舉例說明如何將一組24位元的變數,做到遞增及遞減運算。 遞增(Increment) MOV A,1 ADD INT24,A JBC STATUS,FC ADD INT24+1,A JBC STATUS,FC ADD INT24+2,A 遞減(Decrement) MOV A,1 SUB INT24,A JBS STATUS,FC SUB INT24+1,A JBS STATUS,FC SUB INT24+2,A 判斷多位元組變數是否為零 使用簡單的邏輯運算指令,將多位元組OR在一起,然後依據Z旗標就可以判斷此多位元組變數是否為零了。 MOV A,INT24 OR A,INT24+1 OR A,INT24+2 JBS PSW,FZ ;. 複製某些位元 有時候我們需要將一些特定的幾個位元由某個暫存器複製給另一組暫存器,由於並非完全複製暫存器的內容,所以會多了一些抽取位元的步驟,現在我們找到一個方法,只要四個步驟就可以將指定的位元複製到另一組暫存器裡面,舉例說明,假設位元複製前(SOURCE)=44H,(TARGET)=5AH,如果我們希望將SOURCE的BIT0BIT2複製到TARGET,則執行程式後(SOURCE)=44H,(TARGET)=5CH。 MOV A,SOURCE XOR A,TARGET AND A,00000111B XOR TARGET,A 無論您希望複製哪幾個BIT,只要將第三行程式MASK所需的位元即可。 奇偶位元對調 以下這段程式是根據Dmitry Kiryashov的演算法設計,假設原本ACC內所有位元的排列順序為abcdefgh,交換後ACC順序變成badcfehg,程式只有五行,頗耐人尋味。 MOV REG,A AND A,0x55 ADD REG,A RRC REG ADD A,REG 中斷程式不需保留ACC及PSW的方法 中斷程式一定要保留ACC及PSW嗎?那倒未必!特別是如果您使用的是EM78P152/156之類的迷你級的MCU,RAM SIZE都特別小,如果您只需要讓TCC中斷做簡單的計數工作,只要小心使用指令,就可以避免中斷程式會破壞到ACC及PSW。原因是有些指令並不會對PSW產生影響,有些指令不需要經過ACC。首先設定好預除器,並且讓TCC Free Run。下面的例子完全沒用到ACC及PSW。 ORG 0 JMP INIT ORG 8 TCCINT: BC RF,TCIF ;清除中斷旗標 INC COUNTER RETI Multiple Task
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年小学消防知识题库及答案
- 加工制造单招真题及答案
- 食品化学实验教学平台的建设与应用
- 教培融合环境中的师资能力提升机制
- 基于大数据分析的多媒体教室设备使用效率提升
- 基于OBE模式的虚拟仿真教学资源建设与管理
- 个性化学习与多元化培训模式的融合策略
- PBL方法对中职生心理问题干预效果的研究
- 《三颗心》课件教学课件
- 于总CEO课件磁教学课件
- 2025年检查检验项目分级审核制度
- 河道工程基础井点降水方案
- 2025年新版汉字听写大赛题库(含答案)
- 2025年供应科考试试题及答案
- 无人机装调检修工技术考核试卷及答案
- 《传感器原理及应用》课件-第8章+光电效应及光电器件
- 2025重庆忠县机关事业单位临聘4人备考考试题库附答案解析
- 古诗词诵读教学设计与实施方案
- 2025年山东省政府采购评审专家考试题库附含答案
- 眼镜验光师试题(及答案)
- 第二章 有理数的运算 单元测试(含解析)2025-2026学年人教版(2024)数学七年级上册
评论
0/150
提交评论