找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1803|回复: 14
收起左侧

型号:PIC18F25J11 反汇编代码疑问

[复制链接]
ID:399501 发表于 2021-7-3 09:51 | 显示全部楼层 |阅读模式
0x44C0    ED93         CALL 0x44326, 0x1
0x44C2    F221         NOP

PIC18F25J11 程序存储空间为0-0x7fffh,该指令调用了超出FLASH范围的函数,是否是调用了库函数?如果是如何知道是哪个库函数?

回复

使用道具 举报

ID:88256 发表于 2021-7-3 11:03 | 显示全部楼层
虽然没有学过用过PIC的单片机,但是感觉你的反汇编有点问题,你确定ED93的两个字节反汇编就是CALL 0x44326, 0x1?这个偏移量太大了吧?放在51是绝对做不到偏移那么大的,而空操作又占用两个字节,有点诡异。
库函数是在软件里应用的吧?是为了写程序方便,单片机里面是不可能封装库函数的(只是猜测,毕竟没接触过PIC和库函数),如果真有厂家愿意这么做,好像也可以?
回复

使用道具 举报

ID:399501 发表于 2021-7-3 17:10 | 显示全部楼层
hhdsdy 发表于 2021-7-3 11:03
虽然没有学过用过PIC的单片机,但是感觉你的反汇编有点问题,你确定ED93的两个字节反汇编就是CALL 0x44326, ...

好的,谢谢指导。我摸索一下
回复

使用道具 举报

ID:88256 发表于 2021-7-3 19:11 | 显示全部楼层
HISAUC 发表于 2021-7-3 17:10
好的,谢谢指导。我摸索一下

我没找到PIC18F25J11的汇编指令对照表,如果你有就发出来看看,是不是反汇编出错就比较明显了。
回复

使用道具 举报

ID:401564 发表于 2021-7-3 20:40 | 显示全部楼层
反汇编一定得是汇编高手
CALL 0x44326, 0x1
CALL 是调用指令
0x44326是标号,不是内存地址
0x1是S位,S位决定了调用模式是不是使用快速模式
PIC18汇编指令都是有三个操作数的

ADDCWFC   f,d,a  ;W与 f 带进位相加
f代表W与F相加(指令后面有C的就表示带进位相加)
d代表相加的带有进位的结果保存在什么地方
a代表要不要BSR寄存器指定存储为RAM

看完这个,如果你觉得PIC汇编简单的话,可以学学反汇编,反正我是不想看PIC汇编
回复

使用道具 举报

ID:883242 发表于 2021-7-3 21:22 | 显示全部楼层
Y_G_G 发表于 2021-7-3 20:40
反汇编一定得是汇编高手
CALL 0x44326, 0x1
CALL 是调用指令

8位的PIC单片机其指令体系设计之初考虑的是如何用最少的晶体管数量实现完整的功能,从来就没考虑过用高级语言。所以c语言编译器出来的代码特别的拧巴和效率低下,跟ARM的c语言编译器出来的代码流畅高速完全是相反的。所以能用汇编就别用c语言。

8位PIC单片机晶体管数量少的特征导致鼎盛时期台约有50家山寨厂家仿制兼容型号。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:401564 发表于 2021-7-4 17:09 | 显示全部楼层
Hephaestus 发表于 2021-7-3 21:22
8位的PIC单片机其指令体系设计之初考虑的是如何用最少的晶体管数量实现完整的功能,从来就没考虑过用高级 ...

你说的是PIC16系列或者以前的产品了
楼主这是18系列的,时代不一样我学PIC汇编也是因为公司指定用汇编,有些程序C编译之后确实是没有直接用汇编好,但那都是16系列之前的产品,18系列用汇编实在是太累人了
以前的PIC自己不出C编译器的,现在PIC自己出了C的编译器,而且18系列的单片机也是针对C语言进行了优化的,
所以,18系列能用C就不用汇编,18系列之前的产品,估计真正批量用于产品中的,公司也会要求用汇编的
51hei截图20210704165736.png

回复

使用道具 举报

ID:399501 发表于 2021-7-5 08:56 | 显示全部楼层
hhdsdy 发表于 2021-7-3 19:11
我没找到PIC18F25J11的汇编指令对照表,如果你有就发出来看看,是不是反汇编出错就比较明显了。

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

这个网址就是规格书
回复

使用道具 举报

ID:399501 发表于 2021-7-6 15:10 | 显示全部楼层
Y_G_G 发表于 2021-7-3 20:40
反汇编一定得是汇编高手
CALL 0x44326, 0x1
CALL 是调用指令

那请教一下,MOVF FSR1L, W, ACCESS,这个语句传递的是FSRL1上的值,还是FSR1所指向地址的内容呢?
回复

使用道具 举报

ID:401564 发表于 2021-7-6 15:24 | 显示全部楼层
HISAUC 发表于 2021-7-6 15:10
那请教一下,MOVF FSR1L, W, ACCESS,这个语句传递的是FSRL1上的值,还是FSR1所指向地址的内容呢?

PIC指令跟8051不一样的,很难理解的,你没有写过内几个程序是很难理解这指令什么意思的,如果真的想学,那就先学一下PIC16F887A,学了这个,你就差不多理解PIC汇编了,直接学PIC18有点难
这是中文数据手册,在目录里面有指令的,你去看一下,表27-1详细解释了指令的大概意思
http://www.microchip.com.cn/newc ... brary/39932d_cn.pdf
回复

使用道具 举报

ID:399501 发表于 2021-7-7 14:35 | 显示全部楼层
Y_G_G 发表于 2021-7-6 15:24
PIC指令跟8051不一样的,很难理解的,你没有写过内几个程序是很难理解这指令什么意思的,如果真的想学,那就 ...

0x1656            RCALL 0x165a
0x1658            BRA 0x166e
0x165A            PUSH        ;將下一個指令的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
文档我有下载了,能否再向您请教一下,这段代码中PCLATH和TOSL等寄存器分别起了什么作用,我看了手册还是没明白
回复

使用道具 举报

ID:401564 发表于 2021-7-7 16:13 | 显示全部楼层
HISAUC 发表于 2021-7-7 14:35
0x1656            RCALL 0x165a
0x1658            BRA 0x166e
0x165A            PUSH        ;將下一個 ...

程序计数器是用来存放下一条要执行的指令的
这个是内部自动执行的,不需要代码编写的,但是,如果修改了程序计数器的值,就会改变下一条要执行的指令了,等于去改变下一条指令
等于说:你原本读写的程序是要向左,如果不改变程序计数器的值,这下一条指令就是要向左了
            但是,可能是中断,也可能是按键,现在改变了程序计数器的值,下一条指令变成了向右了

但是,程序计数器是不能直接操作的,不要问我为什么,PIC规定的!它只能间接操作,
操作的方法是通过操作PCLATH完成程序计数器的操作,等于是说:你操作了PCLATH就是操作了程序计数器
这程序计数器是有21位的,所以,是要三个地址的,数据手册里79页面有说明
TOSL也是是一样的,它是堆栈操作用的,大概的原理是前面的程序计数器是一样的,不同的是它是只读的,它只能读取堆栈最顶的值

你没有真正写过PIC汇编,真的是很难理解的,用PIC汇编,特别是PIC18系列的汇编,只有以下几个原因:
1,公司要求
2,原本就是汇编,你修改或者升级
3,抄,就是反汇编,破解什么的
回复

使用道具 举报

ID:399501 发表于 2021-7-7 16:29 | 显示全部楼层
Y_G_G 发表于 2021-7-7 16:13
程序计数器是用来存放下一条要执行的指令的
这个是内部自动执行的,不需要代码编写的,但是,如果修改了程 ...

确实很晦涩难懂,之前都没接触过,一头雾水。项目需要没办法。
0x165C           MOVWF PCLATH, ACCESS,只操作了三个寄存器中的一个,假设W 的值是0x20,那接下来执行的指令应该就是0x205e了吧
回复

使用道具 举报

ID:401564 发表于 2021-7-7 16:52 | 显示全部楼层
HISAUC 发表于 2021-7-7 16:29
确实很晦涩难懂,之前都没接触过,一头雾水。项目需要没办法。
0x165C           MOVWF PCLATH, ACCESS ...

不知道!
你得自己去验证,在0x205e放一条点亮一个IO的LED的指令,程序运行先关灯,执行这条指令了,如果关灯了,就说明是这么一回事了
一般来说,自己写的程序是不会去修改程序计数器的,这个真的太难理解了,直接用GOTO的
你这种估计是C程序反汇编来的,人工写的汇编都很难理解的,编译出来的就更加了
你不要指望着速成,那是不可能的,指令集和详解你不看它上百次是不会完全理解的,更加不可能像C一样大概看过去的,PIC汇编没有重点这一说法,所有的东西都是重点,有可能漏掉一个点,你就蒙半天..........
如果你工作上已经用到了汇编,那我还是推荐你学汇编的,虽然说现在C是主流,但就单片机这一块而言,会汇编的C语言编程工资是要比不会汇编的工资高的
回复

使用道具 举报

ID:399501 发表于 2021-7-7 16:59 | 显示全部楼层
Y_G_G 发表于 2021-7-7 16:52
不知道!
你得自己去验证,在0x205e放一条点亮一个IO的LED的指令,程序运行先关灯,执行这条指令了,如果关灯 ...

好的,谢谢大佬指教。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表