valpa 发表于 2008-09-22 11:29

单op,variable oprand是咋做到的

bash-3.2# objdump -d test1 | grep call
804825b:        e8 00 00 00 00               call   8048260 <_init+0xc>
8048271:        e8 1e 00 00 00               call   8048294 <__gmon_start__@plt>
8048276:        e8 d5 00 00 00               call   8048350 <frame_dummy>
804827b:        e8 80 01 00 00               call   8048400 <__do_global_ctors_aux>
80482dc:        e8 c3 ff ff ff               call   80482a4 <__libc_start_main@plt>
8048328:        ff 14 85 5c 94 04 08         call   *0x804945c(,%eax,4)
804836f:        ff d0                        call   *%eax
80483a6:        e8 4f 00 00 00               call   80483fa <__i686.get_pc_thunk.bx>
80483b4:        e8 9b fe ff ff               call   8048254 <_init>
80483e4:        ff 94 b3 18 ff ff ff         call   *-0xe8(%ebx,%esi,4)
804841b:        ff d0                        call   *%eax
8048433:        e8 00 00 00 00               call   8048438 <_fini+0xc>
804843f:        e8 ac fe ff ff               call   80482f0 <__do_global_dtors_aux>


其中
80483e4:        ff 94 b3 18 ff ff ff         call   *-0xe8(%ebx,%esi,4)
804841b:        ff d0                        call   *%eax

CPU是如何判断call(ff)的oprand长度?

mik 发表于 2008-09-22 11:36

原帖由 valpa 于 2008-9-22 11:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
bash-3.2# objdump -d test1 | grep call
804825b:        e8 00 00 00 00               call   8048260
8048271:        e8 1e 00 00 00               call   8048294
8048276:        e8 d5 00 00 00               call   8048350
804827b ...

根据call 的op规则呀

mik 发表于 2008-09-22 11:40

原帖由 valpa 于 2008-9-22 11:29 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
bash-3.2# objdump -d test1 | grep call
804825b:        e8 00 00 00 00               call   8048260
8048271:        e8 1e 00 00 00               call   8048294
8048276:        e8 d5 00 00 00               call   8048350
804827b ...

具体点:依赖于 call 的 opcode (ff) 的 ModRM 值

cjaizss 发表于 2008-09-24 10:59

http://linux.chinaunix.net/bbs/thread-1029027-1-2.html
这个讨论是不是可以帮到你呢?

mik 发表于 2008-09-24 23:31

原帖由 cjaizss 于 2008-9-24 10:59 发表 http://linux.chinaunix.net/bbs/images/common/back.gif
http://linux.chinaunix.net/bbs/thread-1029027-1-2.html
这个讨论是不是可以帮到你呢?

那个贴子和 LZ 问的问题是两码事。

他的问题偶已经回答了,但 LZ 态度来看,根本不是想来讨论学习的。从他几个贴子可以看出。

mik 发表于 2008-09-24 23:34

警告:LZ 你下次再是这种态度讨论的话,偶势必会让你在这个版里禁言。

cjaizss 发表于 2008-09-25 08:43

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


那个贴子和 LZ 问的问题是两码事。

他的问题偶已经回答了,但 LZ 态度来看,根本不是想来讨论学习的。从他几个贴子可以看出。
其实化为数学抽象表达的话本质上是一回事,只是“协议”不一样。
不过LZ的态度确实........发了帖子就跑了...........
呵呵

valpa 发表于 2008-09-25 12:45

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


那个贴子和 LZ 问的问题是两码事。

他的问题偶已经回答了,但 LZ 态度来看,根本不是想来讨论学习的。从他几个贴子可以看出。


Oh My God

一定要说谢谢吗

valpa 发表于 2008-09-25 12:47

原帖由 cjaizss 于 2008-9-25 08:43 发表 http://linux.chinaunix.net/bbs/images/common/back.gif

其实化为数学抽象表达的话本质上是一回事,只是“协议”不一样。
不过LZ的态度确实........发了帖子就跑了...........
呵呵


能否给个给个reference,不明白为啥本质一回事

cjaizss 发表于 2008-09-25 12:56

回复 #9 valpa 的帖子

其实都是因为潜在的隐含信息指明了参数的长度;
printf函数是如何指定后面的参数的长度不知道你是否清楚,它是通过第一个参数来间接指示后面的参数的。
也可以明指示,比如写一个累和的函数int sum(int x,.....)
x表示参数的个数
无论怎么指明,都是要通过一种方法告诉机器或者人。
页: [1] 2
查看完整版本: 单op,variable oprand是咋做到的