社区
汇编语言
帖子详情
不明白:为什么call指令中的地址数据是相对的而不是绝对地址??? call指令不需要重定位吗?
chtw999
2005-04-14 08:56:51
罗云彬《win32汇编》530页,讲重定位问题时:“存取局部变量和参数的指令中并不包含绝对地址;call指令中的地址数据也是相对的。”
不明白:为什么call指令中的地址数据也是相对的。???
call指令中的地址数据相对于哪里??? 怎么表示的???
...全文
1048
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
静态链接——
重定位
静态链接——
重定位
静态链接符号解析
重定位
重定位
类型
重定位
符号引用
重定位
PC
相对
引用
重定位
绝对
引用 静态链接 想要理解静态链接这一过程,首先我们
需要
明白
编译器驱动程序,它代表用户在
需要
时调用语言预处理器、编译器、汇编器和链接器。 示例程序: //main.c int sum(int *a, int n); int array[2] = {1, 2}; int main(){ int val = sum(array, 2); return val; } //sum.c int sum(int *a, in
【图片+代码】:GCC 链接过程
中
的【
重定位
】过程分析.md
文章目录示例代码sub.o 文件内容分析段信息符号表信息main.o 文件分析段信息符号表信息
绝对
寻址
相对
寻址
重定位
表信息可执行程序 main段信息符号表信息
绝对
地址
重定位
相对
地址
重定位
总结 别人的经验,我们的阶梯! 最近因为项目上的
需要
,利用动态链接库来实现一个插件系统,顺便就复习了一下关于Linux
中
一些编译、链接相关的内容。 在链接的过程
中
,符号
重定位
是比较麻烦的事情,特别是在动态链接的过程
中
,因为
需要
考虑到很多不同的情况。 这篇文章作为第一篇,先来聊一聊静态链接
中
的
重定位
过程。 按照惯例,还是以
符号引用
重定位
重定位
PC
相对
引用 简单讲解
目录链接符号引用
重定位
简介例子
重定位
条目简介offsettypesymboladdend
重定位
PC
相对
引用
重定位
PC
绝对
引用 链接符号引用
重定位
简介 我们知道一个.c文件可以被编译为.o文件,即目标文件,而假如一个.c
中
引用了别的.c
中
的函数或者是变量,这时候的.o其实是不知道引用函数实际的内存位置的,也就无法跳转,这就
需要
【
重定位
】的操作了,而针对函数名(也是符号)的
重定位
例子 我们编写两个.c文件,分别是main.c和func.c,main.c引用了func.c
中
的func函数 // main.c
汇编
中
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
指令
比较有意思 这个是一段很简单...
汇编语言
21,458
社区成员
41,601
社区内容
发帖
与我相关
我的任务
汇编语言
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
复制链接
扫一扫
分享
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章