找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 928|回復(fù): 2
收起左側(cè)

Keil匯編進(jìn)階指南(2) - 段與數(shù)據(jù)

[復(fù)制鏈接]
ID:1080301 發(fā)表于 2024-11-28 23:58 | 顯示全部樓層 |閱讀模式
段與數(shù)據(jù)
在匯編中,沒有函數(shù)的概念,有的只是段,按照我的習(xí)慣,我會(huì)直接把一個(gè)模塊寫成一整段,里面可能會(huì)有很多函數(shù)


正常來(lái)說(shuō),我們會(huì)用ORG開頭來(lái)寫程序,但是這樣是極其不規(guī)范的,為啥呢,舉個(gè)例子,你現(xiàn)在有個(gè)16k空間寫代碼,你不確定你的同事寫了什么玩意,它好像是在100H寫的,嗨,管他呢,我直接在1000H寫。啥?前面還有空間沒利用?不要了!第三個(gè)人一看,歐呦你在1000H寫,那我往后,我也不知道你寫在哪,那就2500H吧,看我多好,七八個(gè)人寫完以后,整個(gè)code空間碎了吧唧的,這留個(gè)500b那邊甚至空了2K,好辣,現(xiàn)在開始真正的挑戰(zhàn)了,第九個(gè)同事要在夾縫中生存了!拼拼湊湊擠出個(gè)2K,再來(lái)三四個(gè),好了,代碼變成了依托不可名狀,現(xiàn)在你要改某個(gè)東西,動(dòng)了一兩個(gè)字節(jié),整個(gè)程序轟的一聲塌了
正確的做法是什么呢,把這活給該干的程序干,就是BL51
多說(shuō)無(wú)益,上代碼
我這里以LCD1602的驅(qū)動(dòng)為例子
首先,我們給這個(gè)段起個(gè)名字,起個(gè)?PR?LCD1602(這個(gè)借鑒了C編譯器命名標(biāo)準(zhǔn),你隨意,你只要能分出啥是啥就行)
對(duì)于C編譯器來(lái)說(shuō)?PR?代表程序段,?DT?代表數(shù)據(jù)段,暫時(shí)說(shuō)這兩個(gè),其他的可以自行查看文檔
好了,我們可以開始干活了,首先要用到的就是SEGMENT關(guān)鍵字,用法如下
名字 SEGMENT 類型
類型就是這幾種

CODE 代碼
DATA 數(shù)據(jù)
IDATA (這個(gè)內(nèi)存有點(diǎn)特別,官方給的是(此內(nèi)存類中的變量通過寄存器R0或R1訪問。))
XDATA 用MOVX的
還有個(gè)EDATA,這個(gè)僅在NXP 80C51MX有效
BIT 位,顧名思義

寫完了這個(gè)聲明好了這是什么,我們需要開始第一句,也就是代替ORG的RSEG
用法:RSEG 段名字
RSEG就是可重定位段,用來(lái)把鏈接的活給BL51干
特別注意,匯編不分大小寫!所以建議你全大寫表示這是匯編代碼(養(yǎng)成好習(xí)慣,后面這玩意要和C一起寫的)
  1.         ?PR?LCD1602 SEGMENT CODE
復(fù)制代碼

這樣,美妙的開頭就寫完了

評(píng)分

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

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:1080301 發(fā)表于 2024-11-29 00:42 | 顯示全部樓層
  1. ?PR?LCD1602 SEGMENT CODE
  2. RSEG ?PR?LCD1602
復(fù)制代碼

重新補(bǔ)一下代碼
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2024-11-29 11:46 | 顯示全部樓層
你說(shuō)錯(cuò)了, ORG 位置是相對(duì)的,是可以偏移的,并不會(huì)打架
RSEG  只是  針對(duì) CSEG , ISEG , XSEG  這些絕對(duì)位置而言,起到重定向的目的。因此,相對(duì)而言,喜歡用用ORG 來(lái)定義 中斷向量 而不用CSEG AT 才是最大的問題,需要避免。
回復(fù)

使用道具 舉報(bào)

無(wú)效樓層,該帖已經(jīng)被刪除
5#
無(wú)效樓層,該帖已經(jīng)被刪除

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表