熱門: 51單片機(jī) | 24小時(shí)必答區(qū) | 單片機(jī)教程 | 單片機(jī)DIY制作 | STM32 | Cortex M3 | 模數(shù)電子 | 電子DIY制作 | 音響/功放 | 拆機(jī)樂(lè)園 | Arduino | 嵌入式OS | 程序設(shè)計(jì)
![]() |
發(fā)布時(shí)間: 2024-5-28 09:01
正文摘要:請(qǐng)問(wèn)這種程序結(jié)構(gòu)是否合理。 程序結(jié)果不正確。 ORG 0000H &nb ... |
51單片機(jī)的SP是個(gè)堆棧寄存器,PUSH/POP/CALL/RET/RETI等指令、中斷觸發(fā)都會(huì)改變?cè)摷拇嫫鞯闹,具體見數(shù)據(jù)手冊(cè)。 |
ARM函數(shù)調(diào)用有現(xiàn)成的應(yīng)用程序二進(jìn)制接口 (ABI) 規(guī)約,R0/R1是參數(shù)/結(jié)果寄存器,R2/R3是參數(shù)寄存器,如果有更多的入口參數(shù)才需要壓棧。我就不懂你學(xué)了兩年ARM匯編,還在搞這種重復(fù)發(fā)明輪子的無(wú)聊工作,而且你的輪子遠(yuǎn)遠(yuǎn)沒(méi)有現(xiàn)成的標(biāo)準(zhǔn)輪子好用,除了浪費(fèi)你的生命還有何等意義? |
POP ACC ;6 MOV R1,ACC 用一句話就行了 POP AR1 ;6 這匯編學(xué)的也太水了。 |
188610329 發(fā)表于 2024-5-28 17:10 址應(yīng)用場(chǎng)景有細(xì)微的不同, |
yzwzfyz 發(fā)表于 2024-5-30 09:22 感謝老哥慷慨!這種玩法比較飄逸,適合整點(diǎn)花活。感謝! ORG 0000H LJMP MAIN MAIN: MOV SP,#0X30 LCALL HBHB JMP MAIN HBHB: PUSH ACC MOV ACC,#0X01 ;1 PUSH ACC MOV ACC,#0X02 ;2 PUSH ACC MOV ACC,#0X03 ;3 PUSH ACC MOV ACC,#0X04 ;4 PUSH ACC MOV ACC,#0X05 ;5 PUSH ACC MOV ACC,#0X06 ;6 PUSH ACC MOV R0,SP ;R0保存棧頂 LCALL AFAF MOV A,#0X30 ;PC返回 ADD A,#0X03 MOV SP,A POP ACC RET AFAF: PUSH ACC MOV SP,R0 ;R0釋放棧頂 POP ACC ;6 MOV R1,ACC POP ACC ;5 MOV R2,ACC POP ACC ;4 MOV R3,ACC POP ACC ;3 MOV R4,ACC POP ACC ;2 MOV R5,ACC POP ACC ;1 MOV R6,ACC MOV A,R0 ; ADD A,#0X03 ;PC返回 MOV SP,A POP ACC RET END |
SP的位置在81H,是個(gè)8位的內(nèi)部寄存器,通常用于做堆棧指針,指針?lè)秶?-255。由于51的堆棧用的是內(nèi)部寄存器,它只有128或256個(gè)字節(jié),所以夠用了。 在高級(jí)特殊運(yùn)用中,可以利用SP進(jìn)行程序重定位,從而增加反匯編破譯程序的難度。 |
有此問(wèn),說(shuō)明你對(duì)51的指令系統(tǒng)未作認(rèn)真研讀: 1、LCALL nn 指令執(zhí)行:PC = nn 再:(SP+2)=(PC+3)H,(SP+1)=(PC+3)L,SP=SP+2 2、RET 指令執(zhí)行:PC=(SP)(SP-1) 再:SP=SP-2 3、PUSH (R) 指令執(zhí)行:(SP)=(R) 再:SP=SP+1 4、POP (R) 指令執(zhí)行:SP=SP-1 再:(R)=(SP-1) (R):特地加了個(gè)(),目的:告訴你,這是R指向的地址中的內(nèi)容。 (SP-1):特地加了個(gè)(),目的:告訴你,這是SP-1指向的地址中的內(nèi)容。 據(jù)此,你自行分析程序是否混亂。混亂的主要表現(xiàn)是:RET回不到原先CALL的下一條指令。 建議研讀指令系統(tǒng),51系統(tǒng)也就255個(gè),且許多是類同的。 搞匯編,必須讀通讀透指令系統(tǒng)。 任何一款單片機(jī),只要你讀通了它的指令系統(tǒng),則它的功能就被你掌握了!!! 也可以說(shuō),基本了解了一款新的單片機(jī)。不信你試試研讀PIC的單片機(jī)的指令系統(tǒng)。 |
莫名其妙的代碼,也不知道到底要干什么,你這么玩SP 不會(huì)直接用 R0 指針操作么?反正,最后你是要把指針?lè)诺絉0保存,還不如直接用R0了…… |
MOV R0,SP ;R0保存棧頂 ... MOV SP,R0 ;R0釋放棧頂 這2條指令,保存/釋放棧頂指針,無(wú)用。 因?yàn)闂m斨羔橂S著每次進(jìn)/出棧作用自動(dòng)改變。 建議改為: 保存/釋放棧項(xiàng)數(shù)據(jù),而不是保存/釋放棧項(xiàng)指針。 |
先搞懂什么是SP吧 |
飛云居士 發(fā)表于 2024-5-28 10:27 sp是棧指針,指向128字節(jié)內(nèi)存地址。 您說(shuō)的是PC程序計(jì)數(shù)器 |
MOV SP,#0X30這句把程序指針指向了51內(nèi)部設(shè)定的“中斷矢量區(qū)。一般是把SP賦值為100 |
Powered by 單片機(jī)教程網(wǎng)