Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 差分同一操作码的指令_Assembly_X86_Machine Code - Fatal编程技术网

Assembly 差分同一操作码的指令

Assembly 差分同一操作码的指令,assembly,x86,machine-code,Assembly,X86,Machine Code,为了便于学习,我正在Linux上编写一个ftrace程序(64位),需要使用ptrace()syscall解析该指令 我感兴趣的指令是ret和call。call指令可能采用不同的操作码(0xe8、0x9a和0xff)。这是最后一个问我的问题:这个0xff也可以代表inc、dec、jmp和push指令,但我看到“寄存器/操作码字段”发生了变化 我的问题是:我怎样才能得到呼叫的信息而不是dec或inc?我有权使用操作码和寄存器 感谢您的阅读和帮助。您可以通过查看下一个指令字节中的3位字段(第5、4、

为了便于学习,我正在Linux上编写一个ftrace程序(64位),需要使用ptrace()syscall解析该指令

我感兴趣的指令是ret和call。call指令可能采用不同的操作码(0xe8、0x9a和0xff)。这是最后一个问我的问题:这个0xff也可以代表inc、dec、jmp和push指令,但我看到“寄存器/操作码字段”发生了变化

我的问题是:我怎样才能得到呼叫的信息而不是dec或inc?我有权使用操作码和寄存器


感谢您的阅读和帮助。

您可以通过查看下一个指令字节中的3位字段(第5、4、3位)来区分差异

000     inc instruction

001     dec instruction

010     intra-segment indirect call

011     inter-segment indirect call

100     intra-segment indirect jump

101     inter-segment indirect jump

110     push instruction

111     unused

因此,如果下一个指令字节是0001 1000,那么位(5,4,3)将是110,这意味着我们处理的是一条推送指令?如果有人知道答案,我会有另一个问题:为什么在解析调用(0xff/0xe8/0x9a)和ret(0xc3、0xc2、0xca、0xcb)操作码的可执行文件中没有相同数量的call和ret?是我的错误还是我缺少信息?如果下一个指令字节是
0001 1000
,则位(5,4,3)将是
011。
您评论的问题:如果一个函数有3个调用,则代码(可能)包含3个调用和2个ret-一个来自函数,一个来自主函数-或不包含
main
可能以一个系统调用结束。我不能说,因为你问的是另一个问题。在8086中,指令是可变长度的,所以仅仅寻找<代码> 0xFF字节是没有用的,您需要完全拆卸以找到每个指令字节序列的第一个字节。他说在另一个指令的中间可能有一个<代码> 0xFF,所以不能扫描一个ISN流。但是,如果您使用
ptrace
的方式是一步一个脚印,并且为您在insn边界处停车,那么这种方法应该可以工作。您没有详细说明测试的工作原理,我们无法确定这些数字是否适用于libc启动。不过我相信;现代的glibc和共享lib在创业时做了大量工作。许多call/ret对可能是非常小的函数。