不明白:为什么call指令中的地址数据是相对的而不是绝对地址??? call指令不需要重定位吗?

chtw999 2005-04-14 08:56:51
罗云彬《win32汇编》530页,讲重定位问题时:“存取局部变量和参数的指令中并不包含绝对地址;call指令中的地址数据也是相对的。”
不明白:为什么call指令中的地址数据也是相对的。???
call指令中的地址数据相对于哪里??? 怎么表示的???
...全文
1048 6 打赏 收藏 转发到动态 举报
写回复
用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 那么怎么区分它们??

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧