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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2578|回復(fù): 14
打印 上一主題 下一主題
收起左側(cè)

型號(hào):PIC18F25J11 反匯編代碼疑問(wèn)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
0x44C0    ED93         CALL 0x44326, 0x1
0x44C2    F221         NOP

PIC18F25J11 程序存儲(chǔ)空間為0-0x7fffh,該指令調(diào)用了超出FLASH范圍的函數(shù),是否是調(diào)用了庫(kù)函數(shù)?如果是如何知道是哪個(gè)庫(kù)函數(shù)?

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

使用道具 舉報(bào)

沙發(fā)
ID:88256 發(fā)表于 2021-7-3 11:03 | 只看該作者
雖然沒(méi)有學(xué)過(guò)用過(guò)PIC的單片機(jī),但是感覺(jué)你的反匯編有點(diǎn)問(wèn)題,你確定ED93的兩個(gè)字節(jié)反匯編就是CALL 0x44326, 0x1?這個(gè)偏移量太大了吧?放在51是絕對(duì)做不到偏移那么大的,而空操作又占用兩個(gè)字節(jié),有點(diǎn)詭異。
庫(kù)函數(shù)是在軟件里應(yīng)用的吧?是為了寫程序方便,單片機(jī)里面是不可能封裝庫(kù)函數(shù)的(只是猜測(cè),畢竟沒(méi)接觸過(guò)PIC和庫(kù)函數(shù)),如果真有廠家愿意這么做,好像也可以?
回復(fù)

使用道具 舉報(bào)

板凳
ID:399501 發(fā)表于 2021-7-3 17:10 | 只看該作者
hhdsdy 發(fā)表于 2021-7-3 11:03
雖然沒(méi)有學(xué)過(guò)用過(guò)PIC的單片機(jī),但是感覺(jué)你的反匯編有點(diǎn)問(wèn)題,你確定ED93的兩個(gè)字節(jié)反匯編就是CALL 0x44326, ...

好的,謝謝指導(dǎo)。我摸索一下
回復(fù)

使用道具 舉報(bào)

地板
ID:88256 發(fā)表于 2021-7-3 19:11 | 只看該作者
HISAUC 發(fā)表于 2021-7-3 17:10
好的,謝謝指導(dǎo)。我摸索一下

我沒(méi)找到PIC18F25J11的匯編指令對(duì)照表,如果你有就發(fā)出來(lái)看看,是不是反匯編出錯(cuò)就比較明顯了。
回復(fù)

使用道具 舉報(bào)

5#
ID:401564 發(fā)表于 2021-7-3 20:40 | 只看該作者
反匯編一定得是匯編高手
CALL 0x44326, 0x1
CALL 是調(diào)用指令
0x44326是標(biāo)號(hào),不是內(nèi)存地址
0x1是S位,S位決定了調(diào)用模式是不是使用快速模式
PIC18匯編指令都是有三個(gè)操作數(shù)的

ADDCWFC   f,d,a  ;W與 f 帶進(jìn)位相加
f代表W與F相加(指令后面有C的就表示帶進(jìn)位相加)
d代表相加的帶有進(jìn)位的結(jié)果保存在什么地方
a代表要不要BSR寄存器指定存儲(chǔ)為RAM

看完這個(gè),如果你覺(jué)得PIC匯編簡(jiǎn)單的話,可以學(xué)學(xué)反匯編,反正我是不想看PIC匯編
回復(fù)

使用道具 舉報(bào)

6#
ID:883242 發(fā)表于 2021-7-3 21:22 | 只看該作者
Y_G_G 發(fā)表于 2021-7-3 20:40
反匯編一定得是匯編高手
CALL 0x44326, 0x1
CALL 是調(diào)用指令

8位的PIC單片機(jī)其指令體系設(shè)計(jì)之初考慮的是如何用最少的晶體管數(shù)量實(shí)現(xiàn)完整的功能,從來(lái)就沒(méi)考慮過(guò)用高級(jí)語(yǔ)言。所以c語(yǔ)言編譯器出來(lái)的代碼特別的擰巴和效率低下,跟ARM的c語(yǔ)言編譯器出來(lái)的代碼流暢高速完全是相反的。所以能用匯編就別用c語(yǔ)言。

8位PIC單片機(jī)晶體管數(shù)量少的特征導(dǎo)致鼎盛時(shí)期臺(tái)約有50家山寨廠家仿制兼容型號(hào)。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:401564 發(fā)表于 2021-7-4 17:09 | 只看該作者
Hephaestus 發(fā)表于 2021-7-3 21:22
8位的PIC單片機(jī)其指令體系設(shè)計(jì)之初考慮的是如何用最少的晶體管數(shù)量實(shí)現(xiàn)完整的功能,從來(lái)就沒(méi)考慮過(guò)用高級(jí) ...

你說(shuō)的是PIC16系列或者以前的產(chǎn)品了
樓主這是18系列的,時(shí)代不一樣我學(xué)PIC匯編也是因?yàn)楣局付ㄓ脜R編,有些程序C編譯之后確實(shí)是沒(méi)有直接用匯編好,但那都是16系列之前的產(chǎn)品,18系列用匯編實(shí)在是太累人了
以前的PIC自己不出C編譯器的,現(xiàn)在PIC自己出了C的編譯器,而且18系列的單片機(jī)也是針對(duì)C語(yǔ)言進(jìn)行了優(yōu)化的,
所以,18系列能用C就不用匯編,18系列之前的產(chǎn)品,估計(jì)真正批量用于產(chǎn)品中的,公司也會(huì)要求用匯編的


回復(fù)

使用道具 舉報(bào)

8#
ID:399501 發(fā)表于 2021-7-5 08:56 | 只看該作者
hhdsdy 發(fā)表于 2021-7-3 19:11
我沒(méi)找到PIC18F25J11的匯編指令對(duì)照表,如果你有就發(fā)出來(lái)看看,是不是反匯編出錯(cuò)就比較明顯了。

https://b2b.baidu.com/land?iid=3cd52e2e643111db2ea93323ecaaede8

這個(gè)網(wǎng)址就是規(guī)格書(shū)
回復(fù)

使用道具 舉報(bào)

9#
ID:399501 發(fā)表于 2021-7-6 15:10 | 只看該作者
Y_G_G 發(fā)表于 2021-7-3 20:40
反匯編一定得是匯編高手
CALL 0x44326, 0x1
CALL 是調(diào)用指令

那請(qǐng)教一下,MOVF FSR1L, W, ACCESS,這個(gè)語(yǔ)句傳遞的是FSRL1上的值,還是FSR1所指向地址的內(nèi)容呢?
回復(fù)

使用道具 舉報(bào)

10#
ID:401564 發(fā)表于 2021-7-6 15:24 | 只看該作者
HISAUC 發(fā)表于 2021-7-6 15:10
那請(qǐng)教一下,MOVF FSR1L, W, ACCESS,這個(gè)語(yǔ)句傳遞的是FSRL1上的值,還是FSR1所指向地址的內(nèi)容呢?

PIC指令跟8051不一樣的,很難理解的,你沒(méi)有寫過(guò)內(nèi)幾個(gè)程序是很難理解這指令什么意思的,如果真的想學(xué),那就先學(xué)一下PIC16F887A,學(xué)了這個(gè),你就差不多理解PIC匯編了,直接學(xué)PIC18有點(diǎn)難
這是中文數(shù)據(jù)手冊(cè),在目錄里面有指令的,你去看一下,表27-1詳細(xì)解釋了指令的大概意思
http://www.microchip.com.cn/newc ... brary/39932d_cn.pdf
回復(fù)

使用道具 舉報(bào)

11#
ID:399501 發(fā)表于 2021-7-7 14:35 | 只看該作者
Y_G_G 發(fā)表于 2021-7-6 15:24
PIC指令跟8051不一樣的,很難理解的,你沒(méi)有寫過(guò)內(nèi)幾個(gè)程序是很難理解這指令什么意思的,如果真的想學(xué),那就 ...

0x1656            RCALL 0x165a
0x1658            BRA 0x166e
0x165A            PUSH        ;將下一個(gè)指令的PC值存到堆疊的最上層。
0x165C           MOVWF PCLATH, ACCESS
0x165E           MOVLB 0x1                                  ;BSR = 1
0x1660           MOVF 0x86, W, BANKED
0x1662           MOVWF TOSL, ACCESS
0x1664           MOVF 0x87, W, BANKED
0x1666           MOVWF TOSH, ACCESS
0x1668           CLRF TOSU, ACCESS
0x166A           MOVF PCLATH, W, ACCESS
0x166C           RETLW 0x1
文檔我有下載了,能否再向您請(qǐng)教一下,這段代碼中PCLATH和TOSL等寄存器分別起了什么作用,我看了手冊(cè)還是沒(méi)明白
回復(fù)

使用道具 舉報(bào)

12#
ID:401564 發(fā)表于 2021-7-7 16:13 | 只看該作者
HISAUC 發(fā)表于 2021-7-7 14:35
0x1656            RCALL 0x165a
0x1658            BRA 0x166e
0x165A            PUSH        ;將下一個(gè) ...

程序計(jì)數(shù)器是用來(lái)存放下一條要執(zhí)行的指令的
這個(gè)是內(nèi)部自動(dòng)執(zhí)行的,不需要代碼編寫的,但是,如果修改了程序計(jì)數(shù)器的值,就會(huì)改變下一條要執(zhí)行的指令了,等于去改變下一條指令
等于說(shuō):你原本讀寫的程序是要向左,如果不改變程序計(jì)數(shù)器的值,這下一條指令就是要向左了
            但是,可能是中斷,也可能是按鍵,現(xiàn)在改變了程序計(jì)數(shù)器的值,下一條指令變成了向右了

但是,程序計(jì)數(shù)器是不能直接操作的,不要問(wèn)我為什么,PIC規(guī)定的!它只能間接操作,
操作的方法是通過(guò)操作PCLATH完成程序計(jì)數(shù)器的操作,等于是說(shuō):你操作了PCLATH就是操作了程序計(jì)數(shù)器
這程序計(jì)數(shù)器是有21位的,所以,是要三個(gè)地址的,數(shù)據(jù)手冊(cè)里79頁(yè)面有說(shuō)明
TOSL也是是一樣的,它是堆棧操作用的,大概的原理是前面的程序計(jì)數(shù)器是一樣的,不同的是它是只讀的,它只能讀取堆棧最頂?shù)闹?br />
你沒(méi)有真正寫過(guò)PIC匯編,真的是很難理解的,用PIC匯編,特別是PIC18系列的匯編,只有以下幾個(gè)原因:
1,公司要求
2,原本就是匯編,你修改或者升級(jí)
3,抄,就是反匯編,破解什么的
回復(fù)

使用道具 舉報(bào)

13#
ID:399501 發(fā)表于 2021-7-7 16:29 | 只看該作者
Y_G_G 發(fā)表于 2021-7-7 16:13
程序計(jì)數(shù)器是用來(lái)存放下一條要執(zhí)行的指令的
這個(gè)是內(nèi)部自動(dòng)執(zhí)行的,不需要代碼編寫的,但是,如果修改了程 ...

確實(shí)很晦澀難懂,之前都沒(méi)接觸過(guò),一頭霧水。項(xiàng)目需要沒(méi)辦法。
0x165C           MOVWF PCLATH, ACCESS,只操作了三個(gè)寄存器中的一個(gè),假設(shè)W 的值是0x20,那接下來(lái)執(zhí)行的指令應(yīng)該就是0x205e了吧
回復(fù)

使用道具 舉報(bào)

14#
ID:401564 發(fā)表于 2021-7-7 16:52 | 只看該作者
HISAUC 發(fā)表于 2021-7-7 16:29
確實(shí)很晦澀難懂,之前都沒(méi)接觸過(guò),一頭霧水。項(xiàng)目需要沒(méi)辦法。
0x165C           MOVWF PCLATH, ACCESS ...

不知道!
你得自己去驗(yàn)證,在0x205e放一條點(diǎn)亮一個(gè)IO的LED的指令,程序運(yùn)行先關(guān)燈,執(zhí)行這條指令了,如果關(guān)燈了,就說(shuō)明是這么一回事了
一般來(lái)說(shuō),自己寫的程序是不會(huì)去修改程序計(jì)數(shù)器的,這個(gè)真的太難理解了,直接用GOTO的
你這種估計(jì)是C程序反匯編來(lái)的,人工寫的匯編都很難理解的,編譯出來(lái)的就更加了
你不要指望著速成,那是不可能的,指令集和詳解你不看它上百次是不會(huì)完全理解的,更加不可能像C一樣大概看過(guò)去的,PIC匯編沒(méi)有重點(diǎn)這一說(shuō)法,所有的東西都是重點(diǎn),有可能漏掉一個(gè)點(diǎn),你就蒙半天..........
如果你工作上已經(jīng)用到了匯編,那我還是推薦你學(xué)匯編的,雖然說(shuō)現(xiàn)在C是主流,但就單片機(jī)這一塊而言,會(huì)匯編的C語(yǔ)言編程工資是要比不會(huì)匯編的工資高的
回復(fù)

使用道具 舉報(bào)

15#
ID:399501 發(fā)表于 2021-7-7 16:59 | 只看該作者
Y_G_G 發(fā)表于 2021-7-7 16:52
不知道!
你得自己去驗(yàn)證,在0x205e放一條點(diǎn)亮一個(gè)IO的LED的指令,程序運(yùn)行先關(guān)燈,執(zhí)行這條指令了,如果關(guān)燈 ...

好的,謝謝大佬指教。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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