zyp568 发表于 2012-2-7 15:41:28

请教各位一段汇编指令

这段指令是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,想了半天也不知道错在哪里,求各位解答一下.

dr2001 发表于 2012-2-7 16:47:34

ldr r8, 是r8中那个地址的值读到R8。相当于C语言的R8 = *(uint32_t *)R8.

zyp568 发表于 2012-2-7 16:57:01

回复【1楼】dr2001
-----------------------------------------------------------------------

对啊~~我也是这样理解的,可能没表达清楚,但是推到最后,结果不对了。。。

zyp568 发表于 2012-2-8 17:43:21

自己顶一下,继续等~~
分析完后PC内存储的应该是操作指令,而不是操作指令所在的地址。
难道PC里存储的是指令?

dr2001 发表于 2012-2-8 19:18:55

的内容是函数的入口地址,
然后把这个写到堆栈的对应位置,LDR bla {PC}的时候把这个地址扔进PC,完成跳转。

慢慢想。

zyp568 发表于 2012-2-8 20:18:58

回复【4楼】dr2001
-----------------------------------------------------------------------
ldr   r8,
您的意思是            这一句是将(中断地址)放入r8中?
可我分析出来这句是    将((中断地址)里面存放的值)放入r8中。

zyp568 发表于 2012-2-8 20:52:49

回复【4楼】dr2001
-----------------------------------------------------------------------

哦~~理解了,(( HandleEINT0 + 4 * 中断偏移号 )地址) 中放到是 中断服务程序 的 标号 ,就是在 主程序 中定义的 中断程序指令 的首地址。
看了中断向量表才好理解~~

Agent_xidi 发表于 2012-2-9 13:17:47

学习
页: [1]
查看完整版本: 请教各位一段汇编指令