微控制器程式SP不停的向上加,希望高手指點。

時間 2025-01-25 18:00:09

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...