社区
汇编语言
帖子详情
不明白:为什么call指令中的地址数据是相对的而不是绝对地址??? call指令不需要重定位吗?
chtw999
2005-04-14 08:56:51
罗云彬《win32汇编》530页,讲重定位问题时:“存取局部变量和参数的指令中并不包含绝对地址;call指令中的地址数据也是相对的。”
不明白:为什么call指令中的地址数据也是相对的。???
call指令中的地址数据相对于哪里??? 怎么表示的???
...全文
1248
6
打赏
收藏
不明白:为什么call指令中的地址数据是相对的而不是绝对地址??? call指令不需要重定位吗?
罗云彬《win32汇编》530页,讲重定位问题时:“存取局部变量和参数的指令中并不包含绝对地址;call指令中的地址数据也是相对的。” 不明白:为什么call指令中的地址数据也是相对的。??? call指令中的地址数据相对于哪里??? 怎么表示的???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
zhang_jiang
2005-04-15
打赏
举报
回复
http://www7.informatik.uni-erlangen.de/~msdoerfe/embedded/386html/toc.htm
chtw999
2005-04-15
打赏
举报
回复
call可以分为:
(1). near relative call
(2). near absolute call
(3). ...
看英文的解释很是明白,但看 《80x86汇编语言程序设计》就看不懂,汉语的翻译体现不出来!!
请楼上推荐本这样讲汇编指令的英文书!!多谢!!
VxD1
2005-04-15
打赏
举报
回复
罗云彬《win32汇编》530页,讲重定位问题时:“存取局部变量和参数的指令中并不包含绝对地址;
>>局部变量和参数通过堆栈访问
call指令中的地址数据也是相对的。”
不明白:为什么call指令中的地址数据也是相对的。???
call指令中的地址数据相对于哪里??? 怎么表示的???
>>这个问题你看看pe文件格式就明白了
zhang_jiang
2005-04-14
打赏
举报
回复
call可以分为:
(1). near relative call
(2). near absolute call
(3). ...
只有(1)用到相对地址.
关于如何区分不同的call, 他们的opcode不同.
如near relative call的opcode 是 0xE8
你的例子中.
0040101a e8e1fffff call 00401000
opcode是E8, 则用相对地址0xFFFFFFE1,复数,往会跳...
chtw999
2005-04-14
打赏
举报
回复
win32中的call指令是不是都是直接段内调用 的???这样就不用重定位了。
chtw999
2005-04-14
打赏
举报
回复
在<<widows环境下32位汇编语言程序设计>>的529页提到了关于远程线程的代码重定向的问题,其中列出了下面的列子:
dwVar dd ?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Proc1 proc _dwParam
local @dwLocal
mov eax,dwVar
mov eax,@dwLocal
mov eax,_dwParam
ret
Proc1 endp
invoke Proc1,1234
然后,编译,反汇编则是:
00400ffc 0000
00401000 55 push ebp
00401001 8eec mov ebp,esp
00401003 83c4fc add esp,fffffffc
0401006 a1fc0f4000 mov eax,dword ptr [00400ffc]
0040100b 8b45fc mov eax,dowrd ptr[ebp-04]
0040100e 8b4508 mov eax,dword ptr[ebp+08]
00401011 c9 leave
00401012 c20400 ret 0004
00401015 68d2040000 push 000004d2
0040101a e8e1fffff call 00401000
在这里,我不理解最后一个Call指令,这里Call总是让程序转到0041000去执行,那么怎么样保证这个call调用的地方是对的那?
然后:
dwVar dd ?
call @f
@@:
pop ebx
sub ebx,offset @b
mov eax,[ebx+offset dwVar]
这里编译之后:
00401000 000000 BYTE 4 DUP(0)
00401004 e800000000 call 00401009
00401009 5b pop ebx
0040100a 81eb0910400 sub ebx,00401009
00401010 8b830010400 mov eax,dword ptr[ebx+00401000]
call指令又是去调用00401009 那么,怎么保证可以执行到:
004010049 5b pop ebx
我知道有 段内直接近调用 和一个 段内间接近调用 ,这里应该是属于前者吧??(<<80x86汇编语言程序设计>>清华大学出版社 第115页讲过)
可是,都是 call 那么怎么区分它们??
彻底理解链接器:四,
重定位
重定位
程序的运行过程就是CPU不断的从内存
中
取出
指令
然后执行执行的过程,对于函数调用来说比如我们在C/C++语言
中
调用简单的加法函数add,其对应的汇编
指令
可能是这样的: call 0x4004fd 其
中
0x4004fd即为函数add在内存
中
的
地址
,当CPU执行这条语句的时候就会跳转到0x4004fd这个位置开始执行函数add对应的机器
指令
。 再比如我们在C语言
中
对一个全局变量g_num不断加一来进行计数,其对应的汇编
指令
可能是这样的: mov 0x400fda %eax add $0x1 %eax
【图片+代码】:GCC 链接过程
中
的【
重定位
】过程分析.md
文章目录示例代码sub.o 文件内容分析段信息符号表信息main.o 文件分析段信息符号表信息
绝对
寻址
相对
寻址
重定位
表信息可执行程序 main段信息符号表信息
绝对
地址
重定位
相对
地址
重定位
总结 别人的经验,我们的阶梯! 最近因为项目上的
需要
,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux
中
一些编译、链接相关的内容。 在链接的过程
中
,符号
重定位
是比较麻烦的事情,特别是在动态链接的过程
中
,因为
需要
考虑到很多不同的情况。 这篇文章作为第一篇,先来聊一聊静态链接
中
的
重定位
过程。 按照惯例,还是以
汇编
中
call
指令
和其对应的机器码
call这个
指令
很神奇,他和别的
指令
不太一样 对比下,当我们执行 mov eax,1 的时候,他的对应机器码是 66 B8 01 00 00 00 这其
中
“66 B8”对应的是“mov eax,x” 后面的“01 00 00 00”就是“1”在32位
中
的Little Endian了 所以说,在对mov
指令
进行汇编时,里面的常数会被直接汇编成机器码 然而call
指令
比较有意思 这个是一段很简单...
符号引用
重定位
重定位
PC
相对
引用 简单讲解
目录链接符号引用
重定位
简介例子
重定位
条目简介offsettypesymboladdend
重定位
PC
相对
引用
重定位
PC
绝对
引用 链接符号引用
重定位
简介 我们知道一个.c文件可以被编译为.o文件,即目标文件,而假如一个.c
中
引用了别的.c
中
的函数或者是变量,这时候的.o其实是不知道引用函数实际的内存位置的,也就无法跳转,这就
需要
【
重定位
】的操作了,而针对函数名(也是符号)的
重定位
例子 我们编写两个.c文件,分别是main.c和func.c,main.c引用了func.c
中
的func函数 // main.c
代码
重定位
——基本原理及实现
Uboot运行
地址
和装载
地址
区别 小狼@http://blog.csdn.net/xiaolangyangyang 参考文献:代码
重定位
解析 加载
地址
和运行时
地址
& 代码
重定位
(2020)
汇编语言
21,497
社区成员
41,617
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章