请教各位一段汇编指令
这段指令是KileARM中自动生成的启动代码中的一段,文件名为S3C2410A.s。我的理解是中文注释,求教下各位我的理解哪里有误?
IRQ_Entry
sub sp,sp,#4 ;reserved for PC
stmfd sp!,{r8-r9} ;压栈
ldr r9,=INTOFFSET
ldr r9, ;(r9)中的值为(地址INTOFFSET)中的值,即中断偏移号.
ldr r8,=HandleEINT0
add r8,r8,r9,lsl #2 ;(r8)中的值为 HandleEINT0 + 4 * 中断偏移号,此值就是(中断入口的地址值)了吧?
ldr r8, ;(r8)中的值为(中断入口地址)中的值
str r8, ;(中断入口地址)中的值放入(地址SP+8)中
ldmfd sp!,{r8-r9,pc} ;出栈,(PC)中的值为(中断入口地址)中的值
这样理解下来(PC)中存储的值变成了(中断入口地址)中的值,而非(中断入口的地址值).
如果去掉
ldr r8,
最后(PC)中存储的值即为(中断入口的地址值).
初学ARM,想了半天也不知道错在哪里,求各位解答一下. ldr r8, 是r8中那个地址的值读到R8。相当于C语言的R8 = *(uint32_t *)R8. 回复【1楼】dr2001
-----------------------------------------------------------------------
对啊~~我也是这样理解的,可能没表达清楚,但是推到最后,结果不对了。。。 自己顶一下,继续等~~
分析完后PC内存储的应该是操作指令,而不是操作指令所在的地址。
难道PC里存储的是指令? 的内容是函数的入口地址,
然后把这个写到堆栈的对应位置,LDR bla {PC}的时候把这个地址扔进PC,完成跳转。
慢慢想。 回复【4楼】dr2001
-----------------------------------------------------------------------
ldr r8,
您的意思是 这一句是将(中断地址)放入r8中?
可我分析出来这句是 将((中断地址)里面存放的值)放入r8中。 回复【4楼】dr2001
-----------------------------------------------------------------------
哦~~理解了,(( HandleEINT0 + 4 * 中断偏移号 )地址) 中放到是 中断服务程序 的 标号 ,就是在 主程序 中定义的 中断程序指令 的首地址。
看了中断向量表才好理解~~ 学习
页:
[1]