1樓:網友
樓主對兩類指令的概念不甚清晰:子程式呼叫指令lcall與跳轉類指令ljmp、jnb等:
1、ljmp、jnb、cjne等均為跳轉語句,跳轉後程式指標pc指向跳轉位置,但不影響sp堆疊的值;
2、lcall、acall等為子程式呼叫指令,執行前需要將下一條指令的位址(pc指標)壓入堆疊(2各位元組),所以sp+2,然後pc指標移動到子程式開始的位置去執行子程式;在子程式執行完成後通過ret指令將pc指標恢復到呼叫前call語句的下一條指令,同時將sp-2。
由於程式中有很多處使用了lcall,但相應的子程式體中又沒有ret返回指令,所以造成sp不斷增加,舉例如下:
org 30h
wxl: jnb scl
ljmp wxl
scl: lcall ys1
jnb ,wxl100
lcall wxl ;這句有問題,執行後sp+2,再回到上面的wxl又回到這,sp又會+2,永無止境。
由於這類錯誤太多,且不瞭解軟體功能,就不一一列舉了,建議樓主重新清理一下思路。
2樓:網友
call太多,ret太少,理論上來說,每次呼叫call,都應該對應乙個ret呼叫才行,否則call一次壓棧一次,像這種方便麵程式(就是毫無頭緒的意思啦),多少堆疊也不夠用啊,呵呵,建議沒有必要用call的地方就用jmp好了,更有意義的建議是理清思路,使用結構化的思想規劃程式結構,重寫程式。
在微控制器程式設計的時,有時為什麼要對堆疊指標sp重新賦值
3樓:網友
上電後,sp=07h,而我們在程式設計中有可能用到00h--7fh中的任何乙個記憶體單元。
4樓:匿名使用者
初始化時通常要重新初始化棧,尤其是使用匯編時,你必需自已去歸劃ram,
5樓:湘湘湘湘湘湘
如果巢狀太多,不重新賦值會引起宕機的。
微控制器中,設定堆疊指標sp為57h後發生子程式返回,這時sp變為( )。
6樓:網友
是55h。因為微控制器中,在進入子程式時,會先將子程式後的pc位址先壓入堆疊儲存(2位元組),若在子程式退出時,會自動將進入時儲存的pc值出棧恢復(兩個位元組)。所以當sp=57h時子程式返回(即退出子程式),因pc值出棧恢復,故sp=57h-2=55h;
7樓:魚缸扁粉菜
子程式的返回,其實,相當於命令:
pop ip
pop cs
棧頂不知道是動一下,還是兩下,因為子程式可能沒有將cs的值入棧。。而只是把ip的值入棧。。具體多少還是要看call 命令的格式,總體來講,出棧,棧頂向前移動,入棧,棧頂向後。。
滿意答案的確不是55h,可能是59h,也可能是5bh
微控制器的小問題,關於sp的值
8樓:網友
pop指令是先彈出,再sp=sp-1
這樣彈出時sp=50h ,在減1就是4fh了。
9樓:
答:push pop 這類指令的執行過程舉例:
push acc
pop acc
把sp的值推進acc,然後sp的值減一,指向前乙個位址;
閣下注意執行的過程和先後次序。
dptr=507bh,sp=32h,(30h)=50h,(31h)=5fh,(32h)=3ch,pop dph ;把sp裡的資料賦給dph,然後sp減一,sp位址32h,存放的是3ch,所以dph是3ch
pop dpl ;把sp裡的資料賦給dph,然後sp減一,sp位址31h,存放的是5fh,所以dpl是5fh
pop sp ;這句:當前sp的位址已變成30h,30h裡存放50h,把50h這個數賦給sp後,sp變成50h,然後sp要減一,50h減一是4fh,所以sp就變成4fh。
答:dph=3ch , dpl=5fh , sp=4fh
閣下要搞清的是sp加一減一的次序。
此題純粹為搞清堆疊概念而用,現實中用此程式設計,只會引起混亂。
微控制器裡sp是什麼意思啊
10樓:布魯斯斯斯
微控制器裡sp是堆疊。
指標。堆疊指標sp英文全稱為stack pointer,是微控制器控制器的組成部件之一,與時控制邏輯電路。
指令暫存器解碼器、位址指標dptr、程式計數器。
等部件共同組成cpu的神經中樞。
堆疊指標在微控制器裡的作用是隨時跟蹤棧頂位址,以便存取微控制器的資料。
每當執一次push指令時,sp就(在原來值的基礎上)自動加1,每當執行一次pop指令,sp就(在原來值的基礎上)自動減1。
11樓:九熊冬
一共五條傳送指令。
進行了三個部分的初始化:堆疊、定時器和中斷系統。
微控制器中,mov sp,#60h佔幾個位元組數?源程式**是什麼?
12樓:網友
微控制器中,mov sp,#60h ; 為 3 位元組指令。
機器碼 為 75h 81h 60h
13樓:網友
看機型。一般是 2 bytes
mov sp,#60h
這就是彙編原始碼。
14樓:網友
3位元組。對應的機器碼是758160
意思是向位址81h傳送資料60h
15樓:網友
兩個,乙個操作碼,乙個運算元。
誰有微控制器pic16f73-i/sp和程式儲存器24lc02b的資料麻煩給!謝謝!
16樓:網友
unsigned char i;
unsigned char temp,temp1;
unsigned char a,b;
void delay(void)
unsigned char m,n,s;
for(m=10;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--)
void main(void)
while(1)
temp=0x80;
temp1 = 0x01;
p0=temp;
delay();
for(i=0;i<9;i++)
p0 = temp>>i;
delay();
for(i=0;i<9;i++)
p2 = temp1《讓談》i;
delay();
for(i=0;i<9;i++)
p2 = temp1for(i=0;i<3;i++)
p0=p2=0xff;delay();
p0=p2=0x00;delay();
這個是我在開發板上的實驗程式,很久以前了,譁滑明從程式來看應該是兩組八個的,轉一圈然後閃三下。
17樓:網友
或者網上首滾兄百備態度者襲啊。
51微控制器指令系統中,執行下列程式後,堆疊指標sp的內容為 。
18樓:網友
60h 因為這個時候剛從跳轉返回。
如何用51微控制器控制舵機的??微控制器程式是怎麼寫的?希望你也能給我發編寫程式和電路圖
微控制器系統實現對舵機輸出轉角的控制,必須首先完成兩項任務 首先,產生基本的pwm週期訊號,即產生20ms的週期訊號 其次,調整脈寬,即微控制器調節pwm訊號的占空比。微控制器能使pwm訊號的脈衝寬度實現微秒級的變化,從而提高舵機的轉角精度。微控制器完成控制演算法,再將pwm訊號輸出到舵機。發乙個自...
微控制器加法指令只怎麼執行的,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是進位標誌,是位元...
PC機與微控制器之間的串列埠通訊的程式
文庫精選 內容來自使用者 xy鴨頭丫頭 include define uchar unsigned charvoid main include define uchar unsigned charsbit sda p2 1 sbit clock p2 0 uchar recive void disp...