我需要一个可以计算x86-64指令长度的函数。
例如,它可以像这样使用:
char ret[] = { 0xc3 };
size_t length = instructionLength(ret);
在本例中,长度
将设置为1。
我不想包含整个反汇编库,因为我需要的唯一信息是指令的长度。
我正在寻找一种极简主义的方法,用C语言编写,理想情况下尽可能小。
100%完整的x86-64指令集并不是绝对必要的(可以省略非常晦涩的指令,例如向量寄存器集指令)。
与我正在寻找的相似的答案(但对于错误的架构):
获取装配说明的大小
英特尔有XED库来处理x86/x86_64指令:https://github.com/intelxed/xed,这是处理英特尔机器代码的唯一正确方法。
xed_decode
函数将为您提供有关指令的所有信息:https://intelxed.github.io/ref-manual/group__DEC.htmlhttps://intelxed.github.io/ref-manual/group__DEC.html#ga9a27c2bb97caf98a6024567b261d0652
而xed_ild_decode
用于指令长度解码:https://intelxed.github.io/ref-manual/group__DEC.html#ga4bef6152f61997a47c4e0fe4327a3254
XED_DLL_EXPORT xed_error_enum_t xed_ild_decode ( xed_decoded_inst_t * xedd,
const xed_uint8_t * itext,
const unsigned int bytes
)
这个函数只是做指令长度解码。
它不返回完全解码的指令。
参数
回报:
xed_error_enum_t表示成功(XED_ERROR_NONE)或失败。只有两个失败代码对该函数有效:XED_ERROR_BUFFER_TOO_SHORT和XED_ERROR_GENERAL_ERROR。一般来说,该函数无法判断指令是否有效。对于有效指令,XED可以确定是否提供了足够的字节来解码指令。如果没有提供足够的字节,XED将返回XED_ERROR_BUFFER_TOO_SHORT。从这个函数中,XED_ERROR_GENERAL_ERROR表明XED无法解码指令的长度,因为指令无效,甚至其长度也可能跨越实现。
要从由xed_ild_decode
填充的xedd
中获取长度,请使用xed_decoded_inst_get_length
:https://intelxed.github.io/ref-manual/group__DEC.html#gad1051f7b86c94d5670f684a6ea79fcdf
static XED_INLINE xed_uint_t xed_decoded_inst_get_length ( const xed_decoded_inst_t * p )
以字节为单位返回解码指令的长度。
示例代码(Apache许可证,2.0版,由Intel 2016提供):https://github.com/intelxed/xed/blob/master/examples/xed-ex-ild.c
#include "xed/xed-interface.h"
#include <stdio.h>
int main()
{
xed_bool_t long_mode = 1;
xed_decoded_inst_t xedd;
xed_state_t dstate;
unsigned char itext[15] = { 0xf2, 0x2e, 0x4f, 0x0F, 0x85, 0x99,
0x00, 0x00, 0x00 };
xed_tables_init(); // one time per process
if (long_mode)
dstate.mmode=XED_MACHINE_MODE_LONG_64;
else
dstate.mmode=XED_MACHINE_MODE_LEGACY_32;
xed_decoded_inst_zero_set_mode(&xedd, &dstate);
xed_ild_decode(&xedd, itext, XED_MAX_INSTRUCTION_BYTES);
printf("length = %u\n",xed_decoded_inst_get_length(&xedd));
return 0;
}
如果你在Windows上,你可以只使用IDebugControl::D…,