MSC 51微控制器指令中的查表問題

時間 2021-09-06 09:14:32

1樓:

我的分析不一定對,僅供參考。

基本思路是從r2r3處取偏移量,乘以2(每個資料為2個位元組)通過a加給dptr,r2加給dpl,r3加給dph,再從dptr處取數,交給a,再給r2r3.

mov dptr,#tab 表的首地址給dptr

mov a,r3 r3的值給a

clr c c置零

rlc a a乘2(左移一位後補零)

xch a,r2 a和r2交換數值

rlc a a左移一位,即乘2

xch a,r2 a和r2交換。至此,相當於r3乘2後給了r2,r2裡存的是r3.乘2後的數,a裡是r2乘2後的數。

add a,dpl dpl的值加給a

mov dpl,a;調整dpl,dph 相當於把原r2裡的數乘2當做偏移地址加給dpl

mov a,dph

addc a,r2

mov dph,a 相當於把原r3裡的數乘2當做偏移地址加給dph

clr a

movc a,@a+dptr;查表

mov r2,a;第一位元組

clr a

inc dptr

movc a,@a+dptr;查第二位元組

mov r3,a

rettab: dw ***xh;共1024個資料項

dw ***xh

......

dw ***xh

因為查表的數字是雙位元組,所以低位給r2,高位給r3.

2樓:匿名使用者

查表程式是要從一個專門的資料區內找到你所需要的那個數。這個數在表中的位置,由表首地址、數在表內相對錶首地址的偏移量、一個資料的位元組數等因素來確定。

具體方法是:將表首地址放入dptr中,偏移量放入a中,用查表指令movc a,@a+dptr;來完成從資料區取數。有如下幾種情況:

1、如果資料區的長度不超過256個位元組(累加器a的容量之內),且資料是單位元組的,則不需要另外處理;

2、因為如果資料區的長度不超過256個位元組,但資料是雙位元組的,需要將偏移量乘2,第一次讀出一個位元組儲存,將地址加1後再讀第二位元組(類推:一個資料是n位元組,則偏移量乘n,每次讀出一個位元組儲存,將地址加1後再讀下一位元組,直到一個數全部讀出)。

3、如果資料區的長度超過了256個位元組,因為a已經存放不了256以上的偏移量,此時需要事先將偏移量加入到dptr中去(即資料的真實地址全部放到dptr中了),再將a清零後使用查表指令。同樣也要如上區分單位元組數和多位元組數。

你所給例就是資料區的長度超過了256個位元組,且資料為雙位元組的情況。程式解釋如下,供參考。

mov dptr,#tab ;表首地址入dptr

mov a,r3

clr c

rlc a ;偏移量的低8位乘2在a中,移出的最高位在c中

xch a,r2 ;乘2後的偏移量的低8入r2中,偏移量的高8位入a中

rlc a;偏移量的高8位乘2在a中

xch a,r2 ;偏移量的高低位元組歸位,至此完成了偏移量乘2

add a,dpl

mov dpl,a;

mov a,dph

addc a,r2

mov dph,a;將偏移量加到dptr中,至此dptr中就是資料第一個位元組的實際地址

clr a ;a清零,因為偏移量已經加入,dptr內容不需要再修正。

movc a,@a+dptr;讀資料第一個位元組

mov r2,a;讀資料第一個位元組存入r2中

clr a ;a清零

inc dptr ;地址加“1”,準備讀下一個位元組

movc a,@a+dptr

mov r3,a 讀資料第一個位元組存入r3中

rettab: dw ***xh;tab為表首地址,共1024個雙位元組資料項,共2048個位元組

dw ***xh

......

dw ***xh

51微控制器怎樣從RoM中取指令,微控制器中訪問ROM指令的操作碼是什麼?

這是微控制器工作時,完全是自動完成的,不需要任何的人為的干預,只要上電並復位後,進入工作狀態,就自動從rom中取指令開始執行了。 給你個 裡面有將,你可以看一看 微控制器中訪問rom指令的操作碼是什麼? 51微控制器要訪問rom時的指令操作碼是movc,具體指令有 movc a,a pc 對應的機器...

微控制器加法指令只怎麼執行的,51微控制器的加法指令到底怎麼加啊,例如12A4H 0FE7H

a,30h是將30h記憶體中數加a放到a的儲存單元。84h 8dh,d是13,加4為17,0到15即0到f這16個數,結果為1,進位標誌c為有效,然後加進8 8 c 17,還是保留1並進位,所以最後是11h。psw是微控制器內部標誌暫存器,是微控制器執行必不可少的基本運算基礎,cy是進位標誌,是位元...

51微控制器中ACC怎麼用,51微控制器中ACC怎麼用??

a和acc的實質是一樣的,對應位址都是0e0h,只是彙編在使用時,在格式上取了兩個名字。你看看它們的使用方法,有的地方用a,有的地方用acc,會發現有一定的規律。當其要進行位表示時,必須用acc,比如要寫成acc.7,而不能寫成a.7 但當其作為8位二進位制數時,acc和a都能用 但還是有區別 比如...