mik 发表于 2008-04-24 23:32

原帖由 system888net 于 2008-4-24 23:19 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
这是真正的分歧所在.

对于64bit这次大侠的确有误
大侠自己可以测试一下或查一下intel的资料或与intel的人确认一下,再做结论.

如果大侠测试出不同的结果,请告知编译工具和平台,以便客观的进行交流.

可 ...

呵,你不妨贴出你的结果来看看。
我说的没错。
不管是32位还是64位
call 这种形式,不会是5个字节,你认为它是5个字节,说明是你理解错了。
错在:你理解为是:eip +offset 这种形式。这是错误的,所以是5个字节

这是个内存操作数,会依赖于ModRM字节。
所以,call 这条指令正确是6个字节,

在64位下,确实是 rip+offset 这种形式。
但是,不是你说的 address+n32,正确的说是 rip+offset。 rip 并不等于你说的 address0。
同样,在64位下,你也错误地简单理解为32位下的 eip +offset。
在这里,此rip +offset 并不是你理解的 eip+offset ,同样正确来说也是6个字节

以上,就是你的错误之处!


另:我没必要和你较劲! 我对x86的指令系统很熟悉。你若觉得我不误,贴出结果以证实

mik 发表于 2008-04-24 23:38

原帖由 mik 于 2008-4-24 23:32 发表 http://linux.chinaunix.net/bbs/images/common/back.gif


呵,你不妨贴出你的结果来看看。
我说的没错。
不管是32位还是64位
call 这种形式,不会是5个字节,你认为它是5个字节,说明是你理解错了。
错在:你理解为是:eip +offset 这种形式。这是 ...

补充一点, call 这种形式的指令也有可能 7 个字节,依赖于这个内存操作数的写法,有index register的时候会是7个字节

system888net 发表于 2008-04-24 23:55

回复 #32 mik 的帖子

早就看得出大侠对x86的指令系统很熟悉.

"在64位下,确实是 rip+offset 这种形式。
但是,不是你说的 address+n32,正确的说是 rip+offset。 rip 并不等于你说的 address0。
同样,在64位下,你也错误地简单理解为32位下的 eip +offset。"---大侠这句话说的有点猜测原文的意思.

"在64位下,确实是 rip+offset 这种形式"这一点跟原文一致了,交流的目的达到了.

[ 本帖最后由 system888net 于 2008-4-25 00:26 编辑 ]

system888net 发表于 2008-04-25 00:03

顶mik等楼上几位大侠.
每个帖子能这样客观交流就非常好

dxcnjupt 发表于 2008-04-25 16:17

有个地方没看明白.
64bit
我们有两个地址,指针存放的地址,以及指针指向的目标地址
哪一个是rip+offset??另一个呢??
如果不和rip挂钩,则只能访问0-4G;如果挂钩的话,data和ip挂钩总觉得很别扭

还有这里说的64位是ia64(安腾)还是ia32e(酷瑞2)???
总觉得ia64是一个不大成功的产品,就像vista一样.

mik 发表于 2008-04-25 18:37

原帖由 system888net 于 2008-4-24 23:55 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
早就看得出大侠对x86的指令系统很熟悉.

"在64位下,确实是 rip+offset 这种形式。
但是,不是你说的 address+n32,正确的说是 rip+offset。 rip 并不等于你说的 address0。
同样,在64位下,你也错误地简单 ...

我和你说的是一个意思吗?

我简直是在对牛弹琴,浪费口水。

mik 发表于 2008-04-25 18:44

原帖由 dxcnjupt 于 2008-4-25 16:17 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
有个地方没看明白.
64bit
我们有两个地址,指针存放的地址,以及指针指向的目标地址
哪一个是rip+offset??另一个呢??
如果不和rip挂钩,则只能访问0-4G;如果挂钩的话,data和ip挂钩总觉得很别扭

还有 ...

建议 x86 平台上的 64 位知识,看 AMD 的,AMD 是 x86-64 的先驱,虽然 INTEL 是兼容 AMD
x86-64 有一种寻址是: RIP 依赖寻址

举个例子:
mov rax, , 在这里这个内存数 就是个 RIP 依赖寻址。
真正的含义是:mov rax,
在64位下是不能这样: mov rax,
若要直接对64位进行寻址的话:
mov rax, 0x1122334455667788
mov rdx,

[ 本帖最后由 mik 于 2008-4-25 18:46 编辑 ]

lllaaa 发表于 2008-04-25 21:23

很久没碰汇编了。我来说说我的看法。

照lz的说法

addr0:   call addr0

生成的机器码里offset部分应该是0了。实际不是

这里的rip应该是call 指令下一条指令的地址

我没有64位的环境。在vc里面做了一下32位的实验不知道能不能说明问题



10:   int main(int argc, char* argv[])
11:   {
00401010 55                   push      ebp
00401011 8B EC                mov         ebp,esp
00401013 83 EC 40             sub         esp,40h
00401016 53                   push      ebx
00401017 56                   push      esi
00401018 57                   push      edi
00401019 8D 7D C0             lea         edi,
0040101C B9 10 00 00 00       mov         ecx,10h
00401021 B8 CC CC CC CC       mov         eax,0CCCCCCCCh
00401026 F3 AB                rep stos    dword ptr
12:   ccc:
13:   __asm
14:   {
15:   call ccc
00401028 E8 FB FF FF FF       call      ccc (00401028)
16:   call bbb
0040102D E8 00 00 00 00       call      bbb (00401032)
17:
18:
19:   }
20:
21:
22:   bbb:
23:
24:       return 0;
00401032 33 C0                xor         eax,eax
25:   }

bluest 发表于 2008-04-26 08:43

原帖由 cjaizss 于 2008-4-23 15:19 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
兼容自然是要损失一些东西的,通用,就会损失效率、存储,不通用,就可以提高效率、存储。使用STL自然不可能有你为特定项目特意设计的算法效率高(当然,前提是设计者不是个棒槌)。编码的冗余问题。鱼与熊掌不 ...


简单,精炼~~

zhouqm27 发表于 2008-04-26 18:45

感觉发出这个帖子的人象是井底之蛙:
人家64位系统都自带64位编译器,你还何苦去自己搞。
除非要自己再重新搞个编译器专门自己用,否则没有意义。
页: 1 2 3 [4] 5
查看完整版本: 32bit的编译器向64bit移植时要注意的一个小问题.