共2条
1/1 1 跳转至页

问
根据《ARM微控制器基础与实践》第2页对指令流水线的说明ARM指令集中:
当前"取指PC"=当前PC
当前"译码PC"=当前PC-4
当前"执行PC"=当前PC-8
很容易理解ARM指令集中:
例程(1)
BL delay ;LR=当前PC-4(即当前指令"执行PC"+8-4)
mov r0,#0 ;
delay mov PC,LR ;子函数返回;即返回到调用时"当前PC"-4位置(即当前指令("执行PC"+8)-4);即返回到函数调用指令的下一条指令(mov r0,#0;)处
例程(2)
mov r0,#1 ;当EINT1在此处发生中断,LR=当前PC(即当前指令"执行PC"+8)
mov r0,#0 ;
EINT1_Handler
subs PC,LR,#4 ;LR=LR-4中断返回;即返回到中断时"当前PC"-4位置(即当前指令("执行PC"+8)-4);即返回到子函数调用指令的下一条指令(mov r0,#0;)处
但如何理解P393页软中断的汇编接口:
例程(3)
TST R3,#T_bit ;判断是ARM指令集还是Thumb指令集
LDRNEH R0,[LR,#-2] ;是Thumb指令集,取SWI中断时执行的指令(即C语言__SWI(0x00)指令)
BICNE R0,R0,#0XFF00 ;取软中断功能号
LDREQ R0,[LR,#-4] ;是ARM指令集,取SWI中断时执行的指令(即C语言__SWI(0x00)指令)
BIC R0,R0,#0XFF000000 ;取软中断功能号
问题1:LDREQ R0,[LR,#-4];取的是执行C语言__SWI(0x00)指令时"当前PC-4";而它指向的应该是SWI中断返回的位置,而不是SWI指令本身?
问题2:BIC R0,R0,#0XFF000000 ;取软中断功能号;该指令的执行一定和生成ARM代码规则相关,但书中并无相关介绍 答 1: re:当前"取指PC"=当前PC
当前"译码PC"=当前PC-4
当前"执行PC"=当前PC-8
=========
在三级流水线下上面的描述及其容易理解,流水线增多后似乎不太合适讲,但在ARM架构下记住这点就行了,也是最重要的:当前"执行PC"=当前PC-8。
问题1:LDREQ R0,[LR,#-4];取的是执行C语言__SWI(0x00)指令时"当前PC-4";而它指向的应该是SWI中断返回的位置,而不是SWI指令本身?
:执行C语言__SWI(0x00)指令时,指令地址=当前PC-8
:保存LR时会有个自动调整:LR=PC-4(从你的举例1来看应该以及知道这一点了),所以LR=当前PC-4=SWI指令地址+8-4=当前PC-8__SWI(0x00)指令地址+4
:然后再取LR-4=当前PC-8__SWI(0x00)指令地址+4-4=SWI指令
问题2:BIC R0,R0,#0XFF000000 ;取软中断功能号;该指令的执行一定和生成ARM代码规则相关,但书中并无相关介绍
:去看SWI指令格式编码,机器码编码中除了开头几位的条件标识和指令码之外,余下的就是软中断号了
当前"取指PC"=当前PC
当前"译码PC"=当前PC-4
当前"执行PC"=当前PC-8
很容易理解ARM指令集中:
例程(1)
BL delay ;LR=当前PC-4(即当前指令"执行PC"+8-4)
mov r0,#0 ;
delay mov PC,LR ;子函数返回;即返回到调用时"当前PC"-4位置(即当前指令("执行PC"+8)-4);即返回到函数调用指令的下一条指令(mov r0,#0;)处
例程(2)
mov r0,#1 ;当EINT1在此处发生中断,LR=当前PC(即当前指令"执行PC"+8)
mov r0,#0 ;
EINT1_Handler
subs PC,LR,#4 ;LR=LR-4中断返回;即返回到中断时"当前PC"-4位置(即当前指令("执行PC"+8)-4);即返回到子函数调用指令的下一条指令(mov r0,#0;)处
但如何理解P393页软中断的汇编接口:
例程(3)
TST R3,#T_bit ;判断是ARM指令集还是Thumb指令集
LDRNEH R0,[LR,#-2] ;是Thumb指令集,取SWI中断时执行的指令(即C语言__SWI(0x00)指令)
BICNE R0,R0,#0XFF00 ;取软中断功能号
LDREQ R0,[LR,#-4] ;是ARM指令集,取SWI中断时执行的指令(即C语言__SWI(0x00)指令)
BIC R0,R0,#0XFF000000 ;取软中断功能号
问题1:LDREQ R0,[LR,#-4];取的是执行C语言__SWI(0x00)指令时"当前PC-4";而它指向的应该是SWI中断返回的位置,而不是SWI指令本身?
问题2:BIC R0,R0,#0XFF000000 ;取软中断功能号;该指令的执行一定和生成ARM代码规则相关,但书中并无相关介绍 答 1: re:当前"取指PC"=当前PC
当前"译码PC"=当前PC-4
当前"执行PC"=当前PC-8
=========
在三级流水线下上面的描述及其容易理解,流水线增多后似乎不太合适讲,但在ARM架构下记住这点就行了,也是最重要的:当前"执行PC"=当前PC-8。
问题1:LDREQ R0,[LR,#-4];取的是执行C语言__SWI(0x00)指令时"当前PC-4";而它指向的应该是SWI中断返回的位置,而不是SWI指令本身?
:执行C语言__SWI(0x00)指令时,指令地址=当前PC-8
:保存LR时会有个自动调整:LR=PC-4(从你的举例1来看应该以及知道这一点了),所以LR=当前PC-4=SWI指令地址+8-4=当前PC-8__SWI(0x00)指令地址+4
:然后再取LR-4=当前PC-8__SWI(0x00)指令地址+4-4=SWI指令
问题2:BIC R0,R0,#0XFF000000 ;取软中断功能号;该指令的执行一定和生成ARM代码规则相关,但书中并无相关介绍
:去看SWI指令格式编码,机器码编码中除了开头几位的条件标识和指令码之外,余下的就是软中断号了
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |