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

2021-09-06 09:14:55 字數 1923 閱讀 4410

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微控制器的加法指令到底怎麼加啊,例如12A4H 0FE7H

一 1 微控制器全稱單片微型計算機,就是將cpu 儲存器 i o口等整合在乙個晶元內 2 設定工作模式,設定是否開中斷,置入計數初值 3 p3.0,rxd 序列輸入 p3.1,txd 序列輸出 p3.2,int0 外部中斷0 p3.3,int1 外部中斷1 p3.4,t0 定時器0外部輸入 p3.5...

微控制器加法指令只怎麼執行的,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微控制器乘法指令mul,求大蝦

a就是累加器,b是乙個專用暫存器,通常用來儲存運算結果的溢位值如加法 乘法的高八位,除法的餘數等。你前面還要賦值,這樣你的乘法指令還可以執行。a表示4eh這個數,b表示5dh這個數。這句的意思是,a乘b,再把值存在a中 a就是累加器acc b是b暫存器。這個執行完以後,b放結果高8位,a放結果低8位...