lester1101 发表于 2012-4-27 22:07:37

赋给PC的是被调用函数的绝对地址还是相对PC的偏移地址

弱弱的问一句

程序代码在存储器里运行的时候,当执行函数调用时,赋给PC的是被调用函数的绝对地址还是相对PC的偏移地址?

请知道的帮忙回复一下,本人不太理解把代码搬运到在RAM里运行机制,故有此问,当函数之间的调用为绝对地址时,不是又返回flash执行吗

lester1101 发表于 2012-4-28 09:25:25

没人帮忙啊

b620126 发表于 2012-4-29 23:04:51

本帖最后由 b620126 于 2012-4-29 23:09 编辑

这个是不是要看寻址方式?

只知道微机原理的

a.段内直接转移,具体格式:CALL 过程名。此时CS不入栈,IP的内栈入栈,入栈后再将加上目的地址与CALL指令的下一条指令的偏移地址之差值就可以转移到目的地址,详细过程:
SP-2=>SP;将堆栈指针SP减2
(SP)<=IP;将IP进栈
IP+偏移地址之差;转到目的地址
b.段内间接转移,具体格式:CALL OPRD,那么在这里OPRD可以寄存器或内存单元,它的具体实现过程:
SP-2=>SP;将堆栈指针SP减2
(SP)<=IP;将IP进栈
IP<=(OPRD);转到目的地址
同a一样,CS不入栈
c.段间直接转移,具体格式:CALL 过程名 ,此时CS,IP均要入栈,详细的实现过程:
SP-2=>SP;将堆栈指针减2
(SP)<=CS;将CS入栈
SP-2=>SP;将堆栈指针再减2
(SP)<=IP;将IP入栈
;装入新的CS,IP
IP<=过程入口的偏移地址
CS<=过程入口的段地址
d.段间间接转移,具体格式:CALL OPRD ,此时CS,IP均要入栈,OPRD是32位,你知道在8086中没有32位寄存器。因此,这里的OPRD一定是存储单元,高16位是CS的值,低16位是IP值,详细的实现过程:
SP-2=>SP;将堆栈指针减2
(SP)<=CS;将CS入栈
SP-2=>SP;将堆栈指针再减2
(SP)<=IP;将IP入栈
;装入新的CS,IP
IP<=(OPRD+2,OPRD+3)
CS<=(OPRD,OPRD1)

lester1101 发表于 2012-5-9 00:04:31

本帖最后由 lester1101 于 2012-5-9 00:10 编辑

b620126 发表于 2012-4-29 23:04 static/image/common/back.gif
这个是不是要看寻址方式?

只知道微机原理的


感谢回复,讲的很详细,不过还是有些迷糊,到底是绝对地址还是相对地址?
你的意思是不是直接转移的时候是偏移地址?间接转移的时候是绝对地址?
那ARM里c编程编译后的函数之间的相互调用是相对转移,还是绝对地址转移呢?

catch2000 发表于 2012-5-9 09:08:30

关于X86寻址是段地址加偏移,
所以PC不是实际地址,
是相对地址。
这个微机原理讲的更明白。


ARM中的PC应该是实际地址。

lester1101 发表于 2012-5-9 19:43:19

catch2000 发表于 2012-5-9 09:08 static/image/common/back.gif
关于X86寻址是段地址加偏移,
所以PC不是实际地址,
是相对地址。


照你的意思
微机 段间转移 段基址加偏移,应该属于绝对地址了,
因为相对地址是指相对当前指令的地址,
而段基址加偏移是绝对地址,跟当前指令地址没有关系

catch2000 发表于 2012-5-9 20:22:56

lester1101 发表于 2012-5-9 19:43 static/image/common/back.gif
照你的意思
微机 段间转移 段基址加偏移,应该属于绝对地址了,
因为相对地址是指相对当前指令的地址,


如果是在实模式下,
在访问内存时是实际地址

s200661524 发表于 2012-5-11 09:47:59

那就看你跳转的时候用什么指令了,如果用b(bl)指令就是相对跳转,直接向PC指针写函数地址就是绝对跳转,至于你说的又跳回flash这种情况不会发生,因为如果有代码搬移到ram的动作,那么在链接的时候制定链接地址会在ram所处的地址中,如果这样,在搬移前绝对不要用mov pc,xxx   ldr pc,=xxx这之类的指令,否则cpu就飞了,因为你的程序还没有搬移到指定位置,这时候函数调用就用bl
页: [1]
查看完整版本: 赋给PC的是被调用函数的绝对地址还是相对PC的偏移地址