久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: 51單片機(jī)匯編語(yǔ)言sp的問(wèn)題 [打印本頁(yè)]

作者: lyonkon    時(shí)間: 2024-5-28 09:01
標(biāo)題: 51單片機(jī)匯編語(yǔ)言sp的問(wèn)題
請(qǐng)問(wèn)這種程序結(jié)構(gòu)是否合理。
程序結(jié)果不正確。


                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


                MOV        R0,SP                 ;R0保存棧頂
                LCALL        AFAF

                POP        ACC
AFAF:
                PUSH        ACC
                PUSH        SP
                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


                PUSH        SP
                POP        ACC
                RET

                END

下是仿真結(jié)果




作者: 飛云居士    時(shí)間: 2024-5-28 10:27
  MOV        SP,#0X30這句把程序指針指向了51內(nèi)部設(shè)定的“中斷矢量區(qū)。一般是把SP賦值為100
作者: lyonkon    時(shí)間: 2024-5-28 11:02
飛云居士 發(fā)表于 2024-5-28 10:27
MOV        SP,#0X30這句把程序指針指向了51內(nèi)部設(shè)定的“中斷矢量區(qū)。一般是把SP賦值為100

sp是棧指針,指向128字節(jié)內(nèi)存地址。
您說(shuō)的是PC程序計(jì)數(shù)器
作者: 人中狼    時(shí)間: 2024-5-28 12:40
先搞懂什么是SP吧
作者: Kxuan163    時(shí)間: 2024-5-28 13:18
MOV   R0,SP  ;R0保存棧頂
...
MOV   SP,R0  ;R0釋放棧頂
這2條指令,保存/釋放棧頂指針,無(wú)用。
因?yàn)闂m斨羔橂S著每次進(jìn)/出棧作用自動(dòng)改變。

建議改為:
保存/釋放棧項(xiàng)數(shù)據(jù),而不是保存/釋放棧項(xiàng)指針。
作者: 188610329    時(shí)間: 2024-5-28 17:10
莫名其妙的代碼,也不知道到底要干什么,你這么玩SP 不會(huì)直接用 R0 指針操作么?反正,最后你是要把指針?lè)诺絉0保存,還不如直接用R0了……
作者: yzwzfyz    時(shí)間: 2024-5-29 15:29
有此問(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è),且許多是類(lèi)同的。
搞匯編,必須讀通讀透指令系統(tǒng)。
任何一款單片機(jī),只要你讀通了它的指令系統(tǒng),則它的功能就被你掌握了!!! 也可以說(shuō),基本了解了一款新的單片機(jī)。不信你試試研讀PIC的單片機(jī)的指令系統(tǒng)。
作者: yzwzfyz    時(shí)間: 2024-5-30 09:22
SP的位置在81H,是個(gè)8位的內(nèi)部寄存器,通常用于做堆棧指針,指針?lè)秶?-255。由于51的堆棧用的是內(nèi)部寄存器,它只有128或256個(gè)字節(jié),所以夠用了。
在高級(jí)特殊運(yùn)用中,可以利用SP進(jìn)行程序重定位,從而增加反匯編破譯程序的難度。

作者: lyonkon    時(shí)間: 2024-5-30 17:57
yzwzfyz 發(fā)表于 2024-5-30 09:22
SP的位置在81H,是個(gè)8位的內(nèi)部寄存器,通常用于做堆棧指針,指針?lè)秶?-255。由于51的堆棧用的是內(nèi)部寄存器 ...

感謝老哥慷慨!這種玩法比較飄逸,適合整點(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
作者: lyonkon    時(shí)間: 2024-5-30 21:13
188610329 發(fā)表于 2024-5-28 17:10
莫名其妙的代碼,也不知道到底要干什么,閼?zhàn)A賜鍿P 不會(huì)直接用 R0 指針操作么?反正,最后你是要把指針?lè)?...

址應(yīng)用場(chǎng)景有細(xì)微的不同,
作者: rundstedt    時(shí)間: 2024-5-30 22:01
               POP        ACC                        ;6
                MOV        R1,ACC
用一句話(huà)就行了
               POP        AR1                        ;6

這匯編學(xué)的也太水了。
作者: lyonkon    時(shí)間: 2024-6-2 23:35
yzwzfyz 發(fā)表于 2024-5-30 09:22
SP的位置在81H,是個(gè)8位的內(nèi)部寄存器,通常用于做堆棧指針,指針?lè)秶?-255。由于51的堆棧用的是內(nèi)部寄存器 ...

以下是移植到stm32的程序,寫(xiě)這個(gè)程序用了4天。前兩天處理32變磚,后兩天迷茫直到最后才調(diào)試出來(lái)。
“棧傳遞參數(shù)”一年多之前就有需求。在諸多朋友和老哥的指導(dǎo)下,直到現(xiàn)在才解決
;棧傳參數(shù)測(cè)試        stm32
        AREA        DATA,CODE,READONLY
               
                                AREA        MASTER,CODE,READONLY
                                EXPORT        __main
                                ENTRY
               
__main

GG        BL        CCDE             ;調(diào)用CCDE
        B        GG


CCDE
        PUSH        {R4-R11,LR}
        MOV        R0,SP                        ;保存該程序棧
       
        LDR        R4,=0X11111111        ;數(shù)據(jù)壓入棧A
        PUSH        {R4}
        LDR        R5,=0X22222222
        PUSH        {R5}
        LDR        R6,=0X33333333
        PUSH        {R6}
        LDR        R7,=0X44444444
        PUSH        {R7}
        LDR        R8,=0X55555555
        PUSH        {R8}
        LDR        R9,=0X66666666
        PUSH        {R9}
        LDR        R10,=0X77777777
        PUSH        {R10}
        LDR        R11,=0X88888888
        PUSH        {R11}
               
        MOV        R1,SP                        ;保存棧頂A
       
        BL        CCEF                        ;調(diào)用CCEF
       
        MOV        SP,R0                        ;恢復(fù)該程序棧
        POP                {R4-R11,LR}
        BX        LR
       
CCEF
        PUSH        {R4-R11,LR}
        MOV        R2,SP                        ;保存該程序棧
       
        MOV        SP,R1                        ;指向棧A
        POP        {R4}                ;取A棧值
        POP        {R5}
        POP        {R6}                ;取A棧值
        POP        {R7}
        POP        {R8}                ;取A棧值
        POP        {R9}
        POP        {R10}                ;取A棧值
        POP        {R11}
       
        MOV        SP,R2                        ;恢復(fù)該程序棧
        POP        {R4-R11,LR}
        BX        LR
       
        END




作者: rundstedt    時(shí)間: 2024-6-3 21:22
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)你的生命還有何等意義?
作者: lyonkon    時(shí)間: 2024-6-4 21:25
rundstedt 發(fā)表于 2024-6-3 21:22
ARM函數(shù)調(diào)用有現(xiàn)成的應(yīng)用程序二進(jìn)制接口 (ABI) 規(guī)約,R0/R1是參數(shù)/結(jié)果寄存器,R2/R3是參數(shù)寄存器,如果有 ...

程序需要對(duì)70多只引腳進(jìn)行設(shè)置,寄存器直接賦值不易修改,也不不易檢查。
單引腳賦值,一個(gè)LTORG又不夠,超范圍了。
因?yàn)橐_設(shè)置程序重復(fù)度高,所以用這種方法。用R0至R3傳sp參數(shù),確實(shí)是偷懶了,會(huì)盡量修改。
我很期望能有老師糾正我寫(xiě)的程序,程序之間的結(jié)構(gòu),寫(xiě)法等等,不然進(jìn)步太慢。以下是部分程序,
  您提到的造輪子,三言?xún)烧Z(yǔ)不知道怎么回答。


作者: npn    時(shí)間: 2024-6-4 21:32
51單片機(jī)的SP是個(gè)堆棧寄存器,PUSH/POP/CALL/RET/RETI等指令、中斷觸發(fā)都會(huì)改變?cè)摷拇嫫鞯闹担唧w見(jiàn)數(shù)據(jù)手冊(cè)。




歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 三级免费网站 | av在线免费播放 | 少妇搡bbbb搡bbb搡毛茸茸 | 成人精品在线 | 九九热在线视频 | 亚洲欧洲视频 | 欧美资源在线 | 国产精品美女毛片真酒店 | 成年人观看视频 | 国产精品久久久久久亚洲影视 | 九九精品九九 | 四虎www| 日韩精品在线一区二区 | 欧美在线网址 | 成人午夜免费视频 | 日韩高清一区 | 日韩一区二区三区精品 | 四虎影视最新网址 | 99国产精品99久久久久久 | 狠狠操狠狠爱 | 日韩欧美一区二区在线观看 | 国产福利91| 日韩一区二区三区精品 | 五月婷婷丁香网 | 久久综合伊人77777蜜臀 | 成人深夜 | 午夜网址 | 亚洲黄色在线视频 | 欧美8888 | 亚洲精品91天天久久人人 | 一区二区三区四区国产 | 国产白丝精品91爽爽久久 | 日韩在线视频一区 | 天天操夜| 久热精品视频 | 96久久| 我想看毛片 | 久久av网 | wwwxxx欧美| 日韩一区二区三区四区 | 乳色吐息在线观看 |