標(biāo)題: 匯編語(yǔ)言進(jìn)階的問(wèn)題 [打印本頁(yè)]

作者: lyonkon    時(shí)間: 2024-3-22 14:38
標(biāo)題: 匯編語(yǔ)言進(jìn)階的問(wèn)題
在寫(xiě)匯編程序過(guò)程當(dāng)中,發(fā)現(xiàn)很多時(shí)候程序功能重復(fù)。比如 某值寫(xiě)入某地址,在整個(gè)程序當(dāng)中可能會(huì)多次需要給地址寫(xiě)值的情況。為了將程序簡(jiǎn)化,使用了下圖做法____將經(jīng)常用到的功能通用化,就是寫(xiě)成子程序。
這樣程序看起來(lái)簡(jiǎn)單些。
如果想學(xué)一下這部分知識(shí),需要學(xué)習(xí)哪些內(nèi)容



作者: 祥子陳    時(shí)間: 2024-3-22 20:31
你這個(gè)很完整了啊,記得push和pop保護(hù)用到的寄存器,隨便怎么都可以啊
作者: Hephaestus    時(shí)間: 2024-3-22 20:39
樓主一年前就在學(xué)匯編,還是高大上的ARM匯編,然后退回到51,才學(xué)了這么一點(diǎn)點(diǎn)?
作者: lyonkon    時(shí)間: 2024-3-22 21:40
Hephaestus 發(fā)表于 2024-3-22 20:39
樓主一年前就在學(xué)匯編,還是高大上的ARM匯編,然后退回到51,才學(xué)了這么一點(diǎn)點(diǎn)?

使用51單片機(jī)是為了增加鍵盤(pán)驅(qū)動(dòng)。主板輸入/輸出顯示 寫(xiě)差不多了,文本編輯是最基本的功能。但是文本編輯器目前沒(méi)有思路。在增加程序功能之前,我想把現(xiàn)有程序優(yōu)化一下,為以后容易看懂和修改。就以51單片機(jī)匯編為例,以程序塊方式優(yōu)化一下程序。在同一個(gè)程序中,使用通用程序塊,修改,閱讀,都方便 還可以降低代碼量。
我的問(wèn)題是,設(shè)計(jì)更多的通用程序塊 需要學(xué)習(xí)哪一部分知識(shí)。





作者: Hephaestus    時(shí)間: 2024-3-22 22:19
lyonkon 發(fā)表于 2024-3-22 21:40
使用51是為了增加鍵盤(pán)驅(qū)動(dòng)。主板輸入/輸出顯示 寫(xiě)差不多了,文本編輯是最基本的功能。但是文本編輯器目前 ...

STM32你都弄好了,不需要學(xué)習(xí)任何知識(shí)了。
作者: 明日之星8    時(shí)間: 2024-3-22 22:56
匯編語(yǔ)言了解一下是必須的,但是絕大部分程序還得用C語(yǔ)言(除非不支持C語(yǔ)言),
因?yàn)镃語(yǔ)言很方便修改和移植。
哪種芯片價(jià)格低就用哪種,這就有了移植的問(wèn)題?梢栽O(shè)置開(kāi)關(guān),很方便增減程序
的功能,等等,C語(yǔ)言的好處多了去了。

作者: lyonkon    時(shí)間: 2024-3-22 23:12
祥子陳 發(fā)表于 2024-3-22 20:31
你這個(gè)很完整了啊,記得push和pop保護(hù)用到的寄存器,隨便怎么都可以啊



作者: Hephaestus    時(shí)間: 2024-3-22 23:45
lyonkon 發(fā)表于 2024-3-22 23:12

任何資料和書(shū)籍都不會(huì)講。是你自己寫(xiě)的程序,復(fù)用程度高的自然就會(huì)變成函數(shù)以節(jié)約flash空間,別人誰(shuí)知道你腦子怎么想的?
作者: 1600277881    時(shí)間: 2024-3-23 02:20
你的匯編還是有很大的進(jìn)步空間

mov   @r0, 0x02    ; R2 的地址==0x02 (Bank 0)


作者: 1600277881    時(shí)間: 2024-3-23 02:45
lyonkon 發(fā)表于 2024-3-22 23:12

別找書(shū)了,一般書(shū)的匯編也就剛剛合格的水平,動(dòng)手把你貼出的這段匯編優(yōu)化, 很能學(xué)會(huì)很多。
作者: lyonkon    時(shí)間: 2024-3-23 17:53
1600277881 發(fā)表于 2024-3-23 02:45
別找書(shū)了,一般書(shū)的匯編也就剛剛合格的水平,動(dòng)手把你貼出的這段匯編優(yōu)化, 很能學(xué)會(huì)很多。

CJNE對(duì)ACC.C的影響,以前討論過(guò),只是沒(méi)有實(shí)踐。參數(shù)傳遞,我現(xiàn)在用的是以下方式。
HCD:
       PUSH ACC
       PUSH PSW
       SETB PSW.3
       MOV R0,....
       ....   ....
       POP PSW
       POP ACC
       RET
作者: Hephaestus    時(shí)間: 2024-3-23 18:05
1600277881 發(fā)表于 2024-3-23 02:20
你的匯編還是有很大的進(jìn)步空間

mov   @r0, 0x02    ; R2 的地址==0x02 (Bank 0)

你的匯編需要進(jìn)步了。正確的寫(xiě)法是:
mov @r0,AR2

雖然你寫(xiě)的很不規(guī)范,但也能通過(guò)編譯。
作者: Hephaestus    時(shí)間: 2024-3-23 18:06
lyonkon 發(fā)表于 2024-3-22 23:12

這都是那些不懂裝懂的貨色寫(xiě)出的破書(shū)誤導(dǎo)的,前面三個(gè)EQU,規(guī)范的寫(xiě)法應(yīng)該是DBIT、DATA、DATA。
作者: lyonkon    時(shí)間: 2024-3-23 20:13
Hephaestus 發(fā)表于 2024-3-23 18:06
這都是

感謝指點(diǎn)
作者: TTQ001    時(shí)間: 2024-3-24 02:09
學(xué)習(xí)匯編語(yǔ)言非常耗時(shí)。 為什么不使用C語(yǔ)言呢
作者: Y_G_G    時(shí)間: 2024-3-24 11:06
TTQ001 發(fā)表于 2024-3-24 02:09
學(xué)習(xí)匯編語(yǔ)言非常耗時(shí)。 為什么不使用C語(yǔ)言呢

有的人對(duì)“編程”,“原理”,“理論",”好用“。。。。。。。之類(lèi)的東西,有著自己固執(zhí)的理解,一旦人認(rèn)定了自己的方向是對(duì)的,你旁人的建議都是沒(méi)用的
作者: Hephaestus    時(shí)間: 2024-3-24 17:15
Y_G_G 發(fā)表于 2024-3-24 11:06
有的人對(duì)“編程”,“原理”,“理論",”好用“。。。。。。。之類(lèi)的東西,有著自己固執(zhí)的理解,一旦人 ...

說(shuō)的太對(duì)了,樓主2年前就開(kāi)始搞匯編了,到現(xiàn)在就這點(diǎn)兒。
作者: 1600277881    時(shí)間: 2024-3-25 00:57
Hephaestus 發(fā)表于 2024-3-23 18:05
你的匯編需要進(jìn)步了。正確的寫(xiě)法是:
mov @r0,AR2

想必你連AR2是怎樣來(lái)的也查了一段時(shí)間吧?
作者: 1600277881    時(shí)間: 2024-3-25 01:06
lyonkon 發(fā)表于 2024-3-23 17:53
CJNE對(duì)ACC.C的影響,以前討論過(guò),只是沒(méi)有實(shí)踐。參數(shù)傳遞,我現(xiàn)在用的是以下方式。
HCD:
       PUSH A ...

更深入的就先不討論, 就PUSH ACC, PUSH PSW而言, 你覺(jué)得有需要?函數(shù)參數(shù)通過(guò)什么方式傳遞, 什么寄存器可以在函數(shù)內(nèi)使用而無(wú)需保存數(shù)值,這都是有約定的。
ACC 和 PSW 不需要存值, 除非你說(shuō)我有自己的約定。
你可以自己用C寫(xiě)一個(gè)簡(jiǎn)單的函數(shù),看看有沒(méi)有保存ACC和PSW的, 一般的中斷函數(shù)才需要保存ACC和PSW,但也不是一定的。
作者: 1600277881    時(shí)間: 2024-3-25 01:18
Hephaestus 發(fā)表于 2024-3-23 18:05
你的匯編需要進(jìn)步了。正確的寫(xiě)法是:
mov @r0,AR2

正確?你定來(lái)定義正確?
如果說(shuō)不能一眼就看出地址0x02是啥玩兒, 你還是回去學(xué)習(xí)學(xué)習(xí)再回來(lái)接我的話吧
作者: Hephaestus    時(shí)間: 2024-3-25 01:29
1600277881 發(fā)表于 2024-3-25 01:18
正確?你定來(lái)定義正確?
如果說(shuō)不能一眼就看出地址0x02是啥玩兒, 你還是回去學(xué)習(xí)學(xué)習(xí)再回來(lái)接我的話吧

又查了下8051指令集,發(fā)現(xiàn)樓主是最正確的,只有1個(gè)字節(jié)就辦完了。

你是最錯(cuò)誤的,浪費(fèi)了一個(gè)字節(jié)的flash空間,干了跟樓主一樣的活兒,%
作者: 1600277881    時(shí)間: 2024-3-25 02:17
Hephaestus 發(fā)表于 2024-3-25 01:29
又查了下8051指令集,發(fā)現(xiàn)樓主是最正確的,只有1個(gè)字節(jié)就辦完了。

你是最錯(cuò)誤的,浪費(fèi)了一個(gè)字節(jié)的fla ...

你還要去查?
我是一條指令代替樓主的一個(gè)函數(shù)。
學(xué)51多久了?
%

作者: Hephaestus    時(shí)間: 2024-3-25 19:46
1600277881 發(fā)表于 2024-3-25 02:17
你還要去查?
我是一條指令代替樓主的一個(gè)函數(shù)。
學(xué)51多久了?

最煩你這種半瓶醋不滿到處亂晃蕩的。
作者: lyonkon    時(shí)間: 2024-3-25 21:04
1600277881 發(fā)表于 2024-3-25 01:06
更深入的就先不討論, 就PUSH ACC, PUSH PSW而言, 你覺(jué)得有需要?函數(shù)參數(shù)通過(guò)什么方式傳遞, 什么寄存 ...

PUSH ACC是按通常格式寫(xiě)的,PUSH PSW ;SETB PSW.3是中斷程序用的,中斷程序每次接受8字節(jié)數(shù)據(jù),存寄存器頁(yè)面1,收完出中斷 恢復(fù) PSW。當(dāng)子程序用到這8字節(jié)數(shù)據(jù)的時(shí)候,再SETB PSW.3。這樣值直接從寄存器使用,省的從內(nèi)存來(lái)回調(diào)。使用頁(yè)面,一是為了傳值方便,二,當(dāng)子程序正在操作R0--R7寄存器時(shí),中斷來(lái)了這時(shí)候無(wú)法對(duì)現(xiàn)有寄存器進(jìn)行保護(hù),當(dāng)出中斷的時(shí)候R0--R7值已經(jīng)變了,程序就錯(cuò)誤運(yùn)行,達(dá)不到目的。
作者: lyonkon    時(shí)間: 2024-3-25 21:44
1600277881 發(fā)表于 2024-3-25 01:06
更深入的就先不討論, 就PUSH ACC, PUSH PSW而言, 你覺(jué)得有需要?函數(shù)參數(shù)通過(guò)什么方式傳遞, 什么寄存 ...

以前,因?yàn)榧拇嫫鞑粔蛴。一種情況是:子程序用了4個(gè)寄存器,子程序調(diào)用二級(jí)子程序又用了超過(guò)4個(gè)寄存器。二級(jí)子程序調(diào)用第三級(jí)子程序的時(shí)候寄存器就沒(méi)有寄存器用了.記得是寫(xiě)12864顯示程序遇到過(guò)這種情況。
  第二種情況也類(lèi)似,子程序調(diào)用另外的子程序,寄存器就不夠用了。
因?yàn)?1單片機(jī)R0--R7無(wú)法壓棧,當(dāng)時(shí)就用了下圖方案!啊笔謩(dòng)壓!啊。


學(xué)會(huì)R0--R7分頁(yè)操作,寄存器基本夠用。

作者: 1600277881    時(shí)間: 2024-3-25 23:02
Hephaestus 發(fā)表于 2024-3-25 19:46
最煩你這種半瓶醋不滿到處亂晃蕩的。

煩怎么了?
你還沒(méi)資格評(píng)誰(shuí)半瓶誰(shuí)全瓶
繼續(xù)晃, 就是晃
作者: 1600277881    時(shí)間: 2024-3-25 23:06
lyonkon 發(fā)表于 2024-3-25 21:04
PUSH ACC是按通常格式寫(xiě)的,PUSH PSW ;SETB PSW.3是中斷程序用的,中斷程序每次接受8字節(jié)數(shù)據(jù),存寄存器 ...

我回復(fù)的不是中斷程序來(lái)的,你子細(xì)看看
作者: 1600277881    時(shí)間: 2024-3-25 23:21
lyonkon 發(fā)表于 2024-3-25 21:44
以前,因?yàn)榧拇嫫鞑粔蛴谩R环N情況是:子程序用了4個(gè)寄存器,子程序調(diào)用二級(jí)子程序又用了超過(guò)4個(gè)寄存器。 ...

我說(shuō)話比較直接, 希望你別介意
你對(duì)51的性能是非常的不熟悉

進(jìn)中斷服務(wù)程序后保存寄存器,都會(huì)按以下的思路做的
一, 中斷服務(wù)程序里,如果說(shuō)沒(méi)用到ACC, 沒(méi)用到R0~R7,  而又沒(méi)產(chǎn)生PSW的改變(51大部分的指令都不會(huì)改變PSW, 比如 inc dec djnz adl xor xrl。。。都不會(huì)改變psw的), 就啥也不需要保存。
二, 用到ACC 或 某幾個(gè)寄存器, 就它們?nèi)霔#?寄存器是可以通過(guò)其地址入棧的, 比如 push 0x02 ; R2
作者: 人中狼    時(shí)間: 2024-3-25 23:25
感覺(jué)有點(diǎn)想做模塊化,規(guī)范化,但卻連什么是模塊化都還不清楚
作者: 1600277881    時(shí)間: 2024-3-25 23:31
lyonkon 發(fā)表于 2024-3-25 21:44
以前,因?yàn)榧拇嫫鞑粔蛴谩R环N情況是:子程序用了4個(gè)寄存器,子程序調(diào)用二級(jí)子程序又用了超過(guò)4個(gè)寄存器。 ...

三 如果說(shuō)中斷程序里,差不多R0~R7都用了, 這一般都不會(huì)用寄存器入棧的方式,因?yàn)樗膹U資源大,而會(huì)用寄存器組的轉(zhuǎn)換,

比如

  using 1     ;//如果你編的是C+匯編的混合編程,需要這句來(lái)告訴編譯器你用了寄存器組1
push psw
mov  psw,#0x08  ;//轉(zhuǎn)換至寄存器組1
push acc
.....            ;// 這里面就R0~R7 都可以隨你用
....

pop  psw
作者: 1600277881    時(shí)間: 2024-3-25 23:46
lyonkon 發(fā)表于 2024-3-25 21:44
以前,因?yàn)榧拇嫫鞑粔蛴。一種情況是:子程序用了4個(gè)寄存器,子程序調(diào)用二級(jí)子程序又用了超過(guò)4個(gè)寄存器。 ...

"因?yàn)?1單片機(jī)R0--R7無(wú)法壓棧"

51 的r0~r7是可以壓棧的, 只不過(guò)要寫(xiě)寄存器的地址
比如 r0的地址是 0x00, r1 地址是 0x01 ..... r7 地址是 0x07
所以 push R3, 要寫(xiě)成 push 0x03, 或者 push AR3
AR0。。。AR7 是keil自帶的寄存器地址定義
在中斷程序把寄存器壓棧,一定一定要注意的是限制主程序里只能用到寄存器組0

作者: 1600277881    時(shí)間: 2024-3-25 23:52
lyonkon 發(fā)表于 2024-3-25 21:44
以前,因?yàn)榧拇嫫鞑粔蛴。一種情況是:子程序用了4個(gè)寄存器,子程序調(diào)用二級(jí)子程序又用了超過(guò)4個(gè)寄存器。 ...

而中斷程序,都是避免使用寄存器,你貼的代碼就沒(méi)必要用到寄存器, 用ACC就足夠了, 根本就沒(méi)必要把寄存器壓棧, 只壓ACC PSW就足以
作者: 1600277881    時(shí)間: 2024-3-26 00:02
lyonkon 發(fā)表于 2024-3-25 21:44
以前,因?yàn)榧拇嫫鞑粔蛴谩R环N情況是:子程序用了4個(gè)寄存器,子程序調(diào)用二級(jí)子程序又用了超過(guò)4個(gè)寄存器。 ...

你貼的這代碼能跑?這應(yīng)該是中斷服務(wù)程式,因?yàn)橛衅渲幸粋(gè)退出口是reti, 但奇怪的是出棧的只有ACC, PSW呢? PSW進(jìn)來(lái)時(shí)壓棧了沒(méi)有? 如果有壓, 那為啥退出前沒(méi)出棧?如果說(shuō)PSW進(jìn)來(lái)就沒(méi)壓過(guò)棧,那你的代碼必定會(huì)出問(wèn)題, 主程序的PSW都被中斷服務(wù)程式中的CJNE指令改了CY。
作者: 1600277881    時(shí)間: 2024-3-26 00:17
lyonkon 發(fā)表于 2024-3-25 21:44
以前,因?yàn)榧拇嫫鞑粔蛴。一種情況是:子程序用了4個(gè)寄存器,子程序調(diào)用二級(jí)子程序又用了超過(guò)4個(gè)寄存器。 ...

另外51它不是ARM,你子細(xì)的研究一下它的指令特性, 會(huì)得出這樣的一個(gè)結(jié)論, 使用r0~r7的效率并不高, 除非是在計(jì)算中短時(shí)間內(nèi)多次使用的值,把它存于寄存器內(nèi)會(huì)更有效率, 而大部時(shí)間都沒(méi)需要把值mov到寄存器才做運(yùn)算, 直接地址操作變量就可以了。所以你在二級(jí)子程序用了4個(gè)寄存器是應(yīng)該可以優(yōu)化的。
作者: lyonkon    時(shí)間: 2024-3-26 21:23
人中狼 發(fā)表于 2024-3-25 23:25
感覺(jué)有點(diǎn)想做模塊化,規(guī)范化,但卻連什么是模塊化都還不清楚

您這樣描述我感到是的,
作者: lyonkon    時(shí)間: 2024-3-26 21:26
1600277881 發(fā)表于 2024-3-26 00:17
另外51它不是ARM,你子細(xì)的研究一下它的指令特性, 會(huì)得出這樣的一個(gè)結(jié)論, 使用r0~r7的效率并不高, 除 ...

經(jīng)過(guò)老師們的指點(diǎn),總是讓我有所收獲。謝謝!謝謝各位
我將您上文所指的約定,理解為類(lèi)似 arm 過(guò)程調(diào)用標(biāo)準(zhǔn)AAPCS。




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1