OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2686|回复: 4

汇编语句中,GPIO的地址是如何计算的

[复制链接]

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-10-12
在线时间
62 小时
发表于 2017-2-24 11:34:33 | 显示全部楼层 |阅读模式
1金钱
改动跑马灯程序,将LED0=0程序用汇编写,然后主程序调用!样例程序在单步执行时LED0=0这条语句的反汇编如图,可知GPIOB的输出寄存器地址是0x42210189(驱动二极管的那个管脚),最终赋了个0值进去!然后我将这段汇编语句重新封装,再在主程序中调用,单步执行到所写汇编语句处,发现并没有找到0x42210189这个地址,最终是跳转到void BusFault_Handler(void)出不来了!所以哪位大神知道这个地址偏移是如何计算的???

这是正常执行的反汇编,最终将0赋给了0X42290189这个地址

这是正常执行的反汇编,最终将0赋给了0X42290189这个地址
QQ截图20170224113048.png

这是单步执行我的程序后,程序算出的地址是0x080002A0,结果就调到里面出不来了

这是单步执行我的程序后,程序算出的地址是0x080002A0,结果就调到里面出不来了

最佳答案

查看完整内容[请看2#楼]

其实原来这里就是ldr r1, = 0x42210189 编译器把 0x42210189 放到后面文字池里,然后吧这里改成个偏移值,你写就直接写数据就好啦。 下面那个改成str r0, [r1] 。 你那样写把个不知道什么数据放到R1然后还往里写数据,不出错误才怪。。 研究这些有什么用啊? 还有这个0x42210189地址算的对么,怎么后面是个9。。。 这个PUSH感觉也没用吧,你放到堆栈又不用。其他的看不懂,不熟悉这个风格的,我都是写GNU ARM 汇编
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

55

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
432
金钱
432
注册时间
2013-6-3
在线时间
49 小时
发表于 2017-2-24 11:34:34 | 显示全部楼层
本帖最后由 yjmwxwx 于 2017-2-24 15:56 编辑

其实原来这里就是ldr r1, = 0x42210189
编译器把 0x42210189 放到后面文字池里,然后吧这里改成个偏移值,你写就直接写数据就好啦。 下面那个改成str r0, [r1] 。 你那样写把个不知道什么数据放到R1然后还往里写数据,不出错误才怪。。

研究这些有什么用啊? 还有这个0x42210189地址算的对么,怎么后面是个9。。。 这个PUSH感觉也没用吧,你放到堆栈又不用。其他的看不懂,不熟悉这个风格的,我都是写GNU ARM 汇编
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-10-12
在线时间
62 小时
 楼主| 发表于 2017-2-24 13:11:49 | 显示全部楼层
本帖最后由 kevinl917 于 2017-2-24 13:14 编辑

[mw_shl_code=applescript,true]       AREA  LED,CODE,READONLY
       PRESERVE8
       THUMB
                          
LEDB    PROC
        EXPORT   LEDB             [WEAK]        
                PUSH    { LR}
                MOVS     r0,#0x00
                LDR      r1,[pc,#1232]
        STR      r0,[r1,#0x194]  
        BX       LR               
                ENDP
                END
[/mw_shl_code]

这是修改过的,跑马灯可以运行,还是不知道这个偏移地址怎么算出来

这是修改过的,跑马灯可以运行,还是不知道这个偏移地址怎么算出来

可运行版本

可运行版本
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165580
金钱
165580
注册时间
2010-12-1
在线时间
2118 小时
发表于 2017-2-24 18:50:02 | 显示全部楼层
搞汇编,好屌啊。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

6

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2016-10-12
在线时间
62 小时
 楼主| 发表于 2017-2-25 15:31:20 | 显示全部楼层
yjmwxwx 发表于 2017-2-24 15:37
其实原来这里就是ldr r1, = 0x42210189
编译器把 0x42210189 放到后面文字池里,然后吧这里改成个偏移值 ...

你说的对,是42218194,地址都是四字节对齐的,我说错了,不好意思啊,这个偏移地址我知道是怎么算的了。我刚接触汇编,低级简单的问题各种各样,望见谅啊!若有不会,望大神不吝指教
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-9-22 16:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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