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

標題: 匯編語言進階的問題 [打印本頁]

作者: lyonkon    時間: 2024-3-22 14:38
標題: 匯編語言進階的問題
在寫匯編程序過程當中,發現很多時候程序功能重復。比如 某值寫入某地址,在整個程序當中可能會多次需要給地址寫值的情況。為了將程序簡化,使用了下圖做法____將經常用到的功能通用化,就是寫成子程序。
這樣程序看起來簡單些。
如果想學一下這部分知識,需要學習哪些內容



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

使用51單片機是為了增加鍵盤驅動。主板輸入/輸出顯示 寫差不多了,文本編輯是最基本的功能。但是文本編輯器目前沒有思路。在增加程序功能之前,我想把現有程序優化一下,為以后容易看懂和修改。就以51單片機匯編為例,以程序塊方式優化一下程序。在同一個程序中,使用通用程序塊,修改,閱讀,都方便 還可以降低代碼量。
我的問題是,設計更多的通用程序塊 需要學習哪一部分知識。





作者: Hephaestus    時間: 2024-3-22 22:19
lyonkon 發表于 2024-3-22 21:40
使用51是為了增加鍵盤驅動。主板輸入/輸出顯示 寫差不多了,文本編輯是最基本的功能。但是文本編輯器目前 ...

STM32你都弄好了,不需要學習任何知識了。
作者: 明日之星8    時間: 2024-3-22 22:56
匯編語言了解一下是必須的,但是絕大部分程序還得用C語言(除非不支持C語言),
因為C語言很方便修改和移植。
哪種芯片價格低就用哪種,這就有了移植的問題。可以設置開關,很方便增減程序
的功能,等等,C語言的好處多了去了。

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



作者: Hephaestus    時間: 2024-3-22 23:45
lyonkon 發表于 2024-3-22 23:12

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

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


作者: 1600277881    時間: 2024-3-23 02:45
lyonkon 發表于 2024-3-22 23:12

別找書了,一般書的匯編也就剛剛合格的水平,動手把你貼出的這段匯編優化, 很能學會很多。
作者: lyonkon    時間: 2024-3-23 17:53
1600277881 發表于 2024-3-23 02:45
別找書了,一般書的匯編也就剛剛合格的水平,動手把你貼出的這段匯編優化, 很能學會很多。

CJNE對ACC.C的影響,以前討論過,只是沒有實踐。參數傳遞,我現在用的是以下方式。
HCD:
       PUSH ACC
       PUSH PSW
       SETB PSW.3
       MOV R0,....
       ....   ....
       POP PSW
       POP ACC
       RET
作者: Hephaestus    時間: 2024-3-23 18:05
1600277881 發表于 2024-3-23 02:20
你的匯編還是有很大的進步空間

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

你的匯編需要進步了。正確的寫法是:
mov @r0,AR2

雖然你寫的很不規范,但也能通過編譯。
作者: Hephaestus    時間: 2024-3-23 18:06
lyonkon 發表于 2024-3-22 23:12

這都是那些不懂裝懂的貨色寫出的破書誤導的,前面三個EQU,規范的寫法應該是DBIT、DATA、DATA。
作者: lyonkon    時間: 2024-3-23 20:13
Hephaestus 發表于 2024-3-23 18:06
這都是

感謝指點
作者: TTQ001    時間: 2024-3-24 02:09
學習匯編語言非常耗時。 為什么不使用C語言呢
作者: Y_G_G    時間: 2024-3-24 11:06
TTQ001 發表于 2024-3-24 02:09
學習匯編語言非常耗時。 為什么不使用C語言呢

有的人對“編程”,“原理”,“理論",”好用“。。。。。。。之類的東西,有著自己固執的理解,一旦人認定了自己的方向是對的,你旁人的建議都是沒用的
作者: Hephaestus    時間: 2024-3-24 17:15
Y_G_G 發表于 2024-3-24 11:06
有的人對“編程”,“原理”,“理論",”好用“。。。。。。。之類的東西,有著自己固執的理解,一旦人 ...

說的太對了,樓主2年前就開始搞匯編了,到現在就這點兒。
作者: 1600277881    時間: 2024-3-25 00:57
Hephaestus 發表于 2024-3-23 18:05
你的匯編需要進步了。正確的寫法是:
mov @r0,AR2

想必你連AR2是怎樣來的也查了一段時間吧?
作者: 1600277881    時間: 2024-3-25 01:06
lyonkon 發表于 2024-3-23 17:53
CJNE對ACC.C的影響,以前討論過,只是沒有實踐。參數傳遞,我現在用的是以下方式。
HCD:
       PUSH A ...

更深入的就先不討論, 就PUSH ACC, PUSH PSW而言, 你覺得有需要?函數參數通過什么方式傳遞, 什么寄存器可以在函數內使用而無需保存數值,這都是有約定的。
ACC 和 PSW 不需要存值, 除非你說我有自己的約定。
你可以自己用C寫一個簡單的函數,看看有沒有保存ACC和PSW的, 一般的中斷函數才需要保存ACC和PSW,但也不是一定的。
作者: 1600277881    時間: 2024-3-25 01:18
Hephaestus 發表于 2024-3-23 18:05
你的匯編需要進步了。正確的寫法是:
mov @r0,AR2

正確?你定來定義正確?
如果說不能一眼就看出地址0x02是啥玩兒, 你還是回去學習學習再回來接我的話吧
作者: Hephaestus    時間: 2024-3-25 01:29
1600277881 發表于 2024-3-25 01:18
正確?你定來定義正確?
如果說不能一眼就看出地址0x02是啥玩兒, 你還是回去學習學習再回來接我的話吧

又查了下8051指令集,發現樓主是最正確的,只有1個字節就辦完了。

你是最錯誤的,浪費了一個字節的flash空間,干了跟樓主一樣的活兒,%
作者: 1600277881    時間: 2024-3-25 02:17
Hephaestus 發表于 2024-3-25 01:29
又查了下8051指令集,發現樓主是最正確的,只有1個字節就辦完了。

你是最錯誤的,浪費了一個字節的fla ...

你還要去查?
我是一條指令代替樓主的一個函數。
學51多久了?
%

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

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

PUSH ACC是按通常格式寫的,PUSH PSW ;SETB PSW.3是中斷程序用的,中斷程序每次接受8字節數據,存寄存器頁面1,收完出中斷 恢復 PSW。當子程序用到這8字節數據的時候,再SETB PSW.3。這樣值直接從寄存器使用,省的從內存來回調。使用頁面,一是為了傳值方便,二,當子程序正在操作R0--R7寄存器時,中斷來了這時候無法對現有寄存器進行保護,當出中斷的時候R0--R7值已經變了,程序就錯誤運行,達不到目的。
作者: lyonkon    時間: 2024-3-25 21:44
1600277881 發表于 2024-3-25 01:06
更深入的就先不討論, 就PUSH ACC, PUSH PSW而言, 你覺得有需要?函數參數通過什么方式傳遞, 什么寄存 ...

以前,因為寄存器不夠用。一種情況是:子程序用了4個寄存器,子程序調用二級子程序又用了超過4個寄存器。二級子程序調用第三級子程序的時候寄存器就沒有寄存器用了.記得是寫12864顯示程序遇到過這種情況。
  第二種情況也類似,子程序調用另外的子程序,寄存器就不夠用了。
因為51單片機R0--R7無法壓棧,當時就用了下圖方案。“”手動壓棧“”。


學會R0--R7分頁操作,寄存器基本夠用。

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

煩怎么了?
你還沒資格評誰半瓶誰全瓶
繼續晃, 就是晃
作者: 1600277881    時間: 2024-3-25 23:06
lyonkon 發表于 2024-3-25 21:04
PUSH ACC是按通常格式寫的,PUSH PSW ;SETB PSW.3是中斷程序用的,中斷程序每次接受8字節數據,存寄存器 ...

我回復的不是中斷程序來的,你子細看看
作者: 1600277881    時間: 2024-3-25 23:21
lyonkon 發表于 2024-3-25 21:44
以前,因為寄存器不夠用。一種情況是:子程序用了4個寄存器,子程序調用二級子程序又用了超過4個寄存器。 ...

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

進中斷服務程序后保存寄存器,都會按以下的思路做的
一, 中斷服務程序里,如果說沒用到ACC, 沒用到R0~R7,  而又沒產生PSW的改變(51大部分的指令都不會改變PSW, 比如 inc dec djnz adl xor xrl。。。都不會改變psw的), 就啥也不需要保存。
二, 用到ACC 或 某幾個寄存器, 就它們入棧, 寄存器是可以通過其地址入棧的, 比如 push 0x02 ; R2
作者: 人中狼    時間: 2024-3-25 23:25
感覺有點想做模塊化,規范化,但卻連什么是模塊化都還不清楚
作者: 1600277881    時間: 2024-3-25 23:31
lyonkon 發表于 2024-3-25 21:44
以前,因為寄存器不夠用。一種情況是:子程序用了4個寄存器,子程序調用二級子程序又用了超過4個寄存器。 ...

三 如果說中斷程序里,差不多R0~R7都用了, 這一般都不會用寄存器入棧的方式,因為它耗廢資源大,而會用寄存器組的轉換,

比如

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

pop  psw
作者: 1600277881    時間: 2024-3-25 23:46
lyonkon 發表于 2024-3-25 21:44
以前,因為寄存器不夠用。一種情況是:子程序用了4個寄存器,子程序調用二級子程序又用了超過4個寄存器。 ...

"因為51單片機R0--R7無法壓棧"

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

作者: 1600277881    時間: 2024-3-25 23:52
lyonkon 發表于 2024-3-25 21:44
以前,因為寄存器不夠用。一種情況是:子程序用了4個寄存器,子程序調用二級子程序又用了超過4個寄存器。 ...

而中斷程序,都是避免使用寄存器,你貼的代碼就沒必要用到寄存器, 用ACC就足夠了, 根本就沒必要把寄存器壓棧, 只壓ACC PSW就足以
作者: 1600277881    時間: 2024-3-26 00:02
lyonkon 發表于 2024-3-25 21:44
以前,因為寄存器不夠用。一種情況是:子程序用了4個寄存器,子程序調用二級子程序又用了超過4個寄存器。 ...

你貼的這代碼能跑?這應該是中斷服務程式,因為有其中一個退出口是reti, 但奇怪的是出棧的只有ACC, PSW呢? PSW進來時壓棧了沒有? 如果有壓, 那為啥退出前沒出棧?如果說PSW進來就沒壓過棧,那你的代碼必定會出問題, 主程序的PSW都被中斷服務程式中的CJNE指令改了CY。
作者: 1600277881    時間: 2024-3-26 00:17
lyonkon 發表于 2024-3-25 21:44
以前,因為寄存器不夠用。一種情況是:子程序用了4個寄存器,子程序調用二級子程序又用了超過4個寄存器。 ...

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

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

經過老師們的指點,總是讓我有所收獲。謝謝!謝謝各位
我將您上文所指的約定,理解為類似 arm 過程調用標準AAPCS。




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 精品视频一区二区 | 中文字幕av在线一二三区 | 91精品国产乱码久久久久久久久 | 久久久久国产精品一区二区 | 天天欧美 | 亚洲综合久久久 | www.国产精 | 欧美一区二区三区在线视频 | 亚洲欧美一区二区三区国产精品 | 国产美女在线免费观看 | 精品美女在线观看 | 黄色三级免费网站 | 国产成人啪免费观看软件 | 日韩成人国产 | 午夜精品久久久久久不卡欧美一级 | 一级片在线免费播放 | 日本一二区视频 | 中文字幕av一区二区三区 | 成人黄色网址大全 | 国产丝袜一区二区三区免费视频 | 精品欧美一区二区三区免费观看 | 亚洲www啪成人一区二区麻豆 | 久久精品成人一区 | 亚洲福利一区 | 天天干天天谢 | 国产区精品在线观看 | 欧美精品一区二区三区在线播放 | 成人在线免费视频观看 | 在线观看国产精品视频 | 国产成人精品视频在线观看 | 色综合一区二区三区 | 91青娱乐在线| 欧美日韩国产不卡 | 国产精品成人国产乱一区 | 99久久日韩精品免费热麻豆美女 | 91免费看片 | 国产夜恋视频在线观看 | 就操在线 | 国产精品久久久久久久久久 | 中文字幕视频在线 | 日本在线精品视频 |