首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得x86-64指令的大小

获得x86-64指令的大小
EN

Stack Overflow用户
提问于 2017-05-28 14:18:56
回答 2查看 1.7K关注 0票数 8

我需要一个能计算x8664指令长度的函数.

例如,它可以像这样使用:

代码语言:javascript
复制
char ret[] = { 0xc3 };
size_t length = instructionLength(ret);

在本例中,length将设置为1。

我不想包含一个完整的反汇编库,因为我只需要指令的长度。

我正在寻找一种极简主义的方法,用C编写,最好是尽可能小。

100%完整的x86-64指令集并不是绝对必要的(非常模糊的指令集,例如向量寄存器集指令可以省略)。

一个与我正在寻找的(但错误的架构)相似的答案:

Get size of assembly instructions

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-28 14:49:49

英特尔的XED库可以使用x86/x86_64指令:https://github.com/intelxed/xed,这是使用英特尔机器代码的唯一正确方法。

xed_decode函数将为您提供有关指令的所有信息:DEC.html DEC.html#ga9a27c2bb97caf98a6024567b261d0652

xed_ild_decode用于指令长度解码:DEC.html#ga4bef6152f61997a47c4e0fe4327a3254

XED_DLL_EXPORT xed_error_enum_t xed_ild_decode ( xed_decoded_inst_t * xedd,const xed_uint8_t * itext,const xed_error_enum_t xed_ild_decode)这个函数只进行指令长度解码。 它不返回完全解码的指令。 参数

  • xed_decoded_inst_t型解码指令。通过xedd发送的模式/状态;请参见xed_state_t。
  • 指向指令文本字节数组的指针。
  • 字节itext输入数组的长度。1到15字节,任何更多的信息都会被忽略。

返回:

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无法解码指令的长度,因为指令是如此的无效,甚至连它的长度也可能跨植入。

若要从由xedd填充的xed_ild_decode中获取长度,请使用xed_decoded_inst_get_lengthDEC.html#gad1051f7b86c94d5670f684a6ea79fcdf

静态XED_INLINE xed_uint_t xed_decoded_inst_get_length ( const xed_decoded_inst_t *p)返回解码指令的长度(字节)。

示例代码(英特尔2016编写的“Apache,Version2.0”):https://github.com/intelxed/xed/blob/master/examples/xed-ex-ild.c

代码语言:javascript
复制
#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;
}
票数 7
EN

Stack Overflow用户

发布于 2021-05-05 13:45:43

如果您在Windows上,您只需使用来自dbgeng.dlldbgeng.dll。例如,请参见this question的用法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44228285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档