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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1514|回復: 2
打印 上一主題 下一主題
收起左側(cè)

Keil匯編進階指南(5) - 用!宏!

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1080301 發(fā)表于 2024-12-5 18:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
用!宏!這部分內(nèi)容可能需要新版的編譯器,內(nèi)容可有可無,也偏簡單
眾所周知,匯編是一個底層語言,但有時候會遇到很多很牛馬的情況,所以有了宏,宏簡單來說就是在代碼交給編譯器前進行一系列操作,比如關(guān)鍵字替換,復制粘貼之類的
首當其沖就是常量
比如這里有一個硬件,在每次開頭都要傳入一個特殊代碼,比如說是15吧,你不可能每次都手打
哦,你手打了,那邊剛傳來消息,那個芯片不用了,所以啟動代碼改成1了……
所以我們需要一個標記,本質(zhì)來說,就是用EQU后面的替換點EQU前面的(實際比這個情況復雜,只能暫且這么理解)
  1. CMD_START EQU 1
復制代碼
好了,我們每次發(fā)送的時候只需要這樣就行了
  1. MOV R7,#CMD_START
  2. CALL SENT
復制代碼
很簡單,對吧,我們該應付下一個牛馬活計了
比如有一個東西,需要進行固定的序列來運行,假如是發(fā)送命令
  1. MOV R7,命令
  2. CALL SENT
復制代碼
函數(shù)沒法用,手寫又犯惡心,所以我們干脆定義一段宏

  1. <div>宏名字 MARCO 變量</div><div>宏內(nèi)容</div><div>ENDM</div>
復制代碼
在這個例子里面,我們就這樣寫
  1. SENT_CMD MARCO K
  2. MOV R7,#K
  3. CALL SENT
  4. ENDM
復制代碼
如果需要發(fā)送一個命令,我們只需要
  1. SENT_CMD 122
復制代碼
需要注意的是,變量是會原原本本替換的,也就是說,如果你在變量(SENT_CMD)后面填abcd,那么#K編譯時會被替換為#abcd

至于其他的內(nèi)容比如內(nèi)部標簽之類的,我覺得這個和函數(shù)有點沖突了,如果你執(zhí)意要看,可以翻手冊
最后再講一些簡單的宏
有一個程序中間要插入100個NOP
REPT 次數(shù)
內(nèi)容
ENDM
就像這樣
  1. REPT 100
  2. NOP
  3. ENDM
復制代碼
編譯器就把這活干了,這個地方會編譯100個nop
老板又提出了新的要求,要你把R1,R3,R5入棧,我們嘗試用IRP解決
IRP 枚舉名,<枚舉內(nèi)容>
內(nèi)容
ENDM
就像這樣
  1. IRP name,<1,3,5>
  2. PUSH R&name
  3. ENDM
復制代碼
它編譯出來是這樣的
  1. PUSH R1
  2. PUSH R3
  3. PUSH R5
復制代碼

對于字符,專門有一個方法,IRPC,我直接粘貼手冊給的程序
IRPC sendchar, TEST
        MOV     R0, #'sendchar'
        CALL    outchar
ENDM


編譯成

        MOV     R0, #'T'
        CALL    outchar
        MOV     R0, #'E'
        CALL    outchar
        MOV     R0, #'S'
        CALL    outchar
        MOV     R0, #'T'
        CALL    outchar



注: 188610329對上一次的內(nèi)容進行勘誤,回看手冊發(fā)現(xiàn)確實不太一樣,具體按照大佬所給的表為準,或者看手冊User's Guides for Keil C51 Development Tools
另外,我對大佬所說不使用EQU定義引腳的說法不敢茍同,在這一章的內(nèi)容可以明確知道EQU使用的是宏,是對代碼的前處理,而對于引腳寄存器的DATA定義早在STARTUP.A51就已經(jīng)完成,甚至public了,在一般情況下已經(jīng)具有所謂的“獨占性”,最重要的是,EQU最簡單的一點就是用就完了,你不需要考慮別的,在使用定義標記與宏最終效果一樣的情況下,肯定是選擇最簡單最靈活的那個
data的好處是可以public一個變量,但我在有一堆寄存器和形參,以及可以寫C的情況下似乎找不出使用這個的理由……本身就是寫底層的代碼,在有編譯器高效優(yōu)化的前提下硬手寫匯編運算和編譯器比水平實在不是什么好行為……另外,匯編的內(nèi)容基本就這些了







評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂2 踩
回復

使用道具 舉報

沙發(fā)
ID:299780 發(fā)表于 2025-3-17 20:10 | 只看該作者
聽說DeepSeek就是用匯編寫的
回復

使用道具 舉報

板凳
ID:983641 發(fā)表于 2025-4-11 11:49 | 只看該作者
加油,繼續(xù)更新。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美大片在线观看 | 国产精品18毛片一区二区 | 高清一区二区 | 日韩成人在线播放 | 欧美三级免费观看 | 欧美日韩久 | www.欧美 | 日韩在线免费视频 | 精品中文字幕视频 | 欧美mv日韩mv国产网站91进入 | 超碰精品在线 | 亚洲天堂中文字幕 | 一区二区三区视频在线 | 国产精品二区三区 | 91精品国产乱码久久久久久久久 | 九九热在线精品视频 | 精品视频99 | 99综合| 欧美二区在线 | 亚洲精品久久久久久久久久吃药 | 免费看黄视频网站 | 欧美一区二区三区在线观看 | 亚洲精品美女视频 | 久草网址 | 在线成人av | 天天夜夜人人 | 国产欧美一区二区三区国产幕精品 | 一区二区免费高清视频 | 999久久久| 成人国产a | 国产精品一区二区久久 | av一级久久 | 性色的免费视频 | 国产精品一区二区三区久久 | 99久热在线精品视频观看 | 亚洲成人精品免费 | 91天堂| 在线色网| 国产视频1区2区 | 日韩高清一区二区 | 日韩精品欧美精品 |