问题标签 [opcode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
6 回答
16619 浏览

translation - 将机器码翻译成 LLVM IR(将 X86_64.X86.ARM 反汇编/重新组装成 LLVM 位码)

我想将 X86_64、x86、ARM 可执行文件翻译成 LLVM IR(反汇编)。

你建议什么解决方案?

0 投票
3 回答
1950 浏览

c - 嵌入在 c 中的汇编代码为 cmp 提供了不正确的操作数类型错误

我编写了一个程序来检查一个数字是正数、负数还是零。当我尝试编译代码时,它给出了一个不正确的操作数类型错误,第 28 行是 cmp 操作码。我的格式是错误的,还是这里有其他问题?

0 投票
1 回答
474 浏览

c# - 为什么 C# 编译器会在 IL 中发出额外的操作码?

如果我有一个方法Multiply定义为:

那么为什么编译器会发出这个 IL:

如您所见,它还包含一些对我来说没有意义的附加操作码,而实际上我期望以下 IL:

它做同样的事情。

那么问题来了,为什么编译器会在 IL 中发出额外的 OpCodes?

我正在使用调试模式。

0 投票
5 回答
2659 浏览

c++ - 将 unsigned int + 字符串转换为 unsigned char 向量

我正在使用 NetLink 套接字库 ( https://sourceforge.net/apps/wordpress/netlinksockets/ ),并且我想以我指定的格式通过网络发送一些二进制数据。

我计划的格式很简单,如下:

  • 字节 0 和 1:uint16_t 类型的操作码(即,无符号整数总是 2 个字节长)

  • 字节 2 以后:任何其他必要的数据,例如字符串、整数、每个的组合等。对方将根据操作码解释这些数据。例如,如果操作码为 0,表示“登录”,则此数据将由一个字节整数组成,告诉您用户名的长度,然后是一个包含用户名的字符串,然后是一个包含密码的字符串。对于操作码 1,“发送聊天消息”,此处的整个数据可能只是聊天消息的字符串。

不过,这是该库为我提供的用于发送数据的内容:

我假设我想为此使用 rawSend() .. 但是 rawSend() 需要无符号字符,而不是指向内存的 void* 指针?如果我尝试将某些类型的数据转换为无符号字符数组,这里不会丢失一些数据吗?如果我错了,请纠正我。但如果我是对的,这是否意味着我应该查看另一个支持真正二进制数据传输的库?

假设这个库确实符合我的目的,我将如何将我的各种数据类型转换并连接到一个 std::vector 中?我尝试过的是这样的:

但是,当我试图解释数据时,在另一端遇到了一些例外情况。我在接近演员阵容时都错了吗?我会通过转换为无符号字符来丢失数据吗?

提前致谢。

0 投票
2 回答
496 浏览

c++ - 在 C++ 中,关于位移和转换数据类型

我最近在 Stack Overflow 上问了一个问题,关于如何将我的数据从 16 位整数,后跟未确定数量的 void*-cast 内存转换为无符号字符的 std::vector,以便使用已知的套接字库作为 NetLink,它使用一个签名看起来像这样的函数来发送原始数据:

(作为参考,这是那个问题:Casting an unsigned int + a string to an unsigned char vector

问题已成功回答,我感谢那些回答的人。Mike DeSimone 给出了一个 send_message() 函数的示例,该函数将数据转换为 NetLink 接受的格式(std::vector),如下所示:

这看起来正是我所需要的,所以我开始编写一个随附的 receive_message() 函数......

...但是我很尴尬地说我并不完全理解所有的位移和诸如此类的东西,所以我在这里遇到了障碍。在过去近十年中我编写的所有代码中,我的大部分代码都是使用高级语言编写的,而我的其余代码从未真正需要低级内存操作。

回到编写 receive_message() 函数的主题,正如你所想象的,我的出发点是 NetLink 的 rawRead() 函数,其签名如下所示:

看起来我的代码将像这样开始:

在第一次调用 rawRead() 之后,看来我需要遍历向量,从中检索数据并反转位移操作,然后将数据返回到 *rawData 和 *opcode。同样,我对移位不是很熟悉(我做了一些谷歌搜索来理解语法,但我不明白为什么上面的 send_message() 代码需要移位),所以我对下一步感到茫然这里。

有人可以帮我理解如何编写这个随附的 receive_message() 函数吗?作为奖励,如果有人可以帮助解释原始代码,以便我将来知道它是如何工作的(特别是在这种情况下如何进行转换以及为什么它是必要的),那将有助于加深我对未来的理解。

提前致谢!

0 投票
1 回答
697 浏览

c - 未知操作码'.pword'

当我编译我的代码时,我收到一个未知的 Opcode '.pword' 错误。我的项目中唯一具有 .pword 的代码行是:

注释掉这条线没有任何作用。

我搜索.pword 0xDA4000并知道它受 IDE MPLab for PIC 支持。

就我而言,我使用的 IDE 是用于 STMf32f2xx 芯片的 CrossStudio。

我有更新的 CrossStudio,它带有 binutils 2.21 和 gcc 4.6.0

我最初在编译未命名的结构和联合时遇到了问题,但添加-fms-extensions到额外的 C 编译器选项中修复了它。

我不知道我是否需要做类似的事情来修复 Opcode '.pword' 错误。

难道只是 .pword 只是一个 PIC 操作码?

0 投票
2 回答
702 浏览

valgrind - 如何对系统调用 brk 进行二进制检测?(x86-64 Linux)(也许是 valgrind?)

我想在给定的二进制文件(最好在实际的系统调用/系统输入级别(x86-64和x86)进行调用)中检测syscall brk(和其他调用,但这是第一顺序,这对我来说最重要)。sys_brk

主要目标:

  • 沙盒的一部分,为被监禁的进程提供固定数量的内存
  • 因此,我想摆脱brk系统调用(最好是下一个顺序的其他系统调用)并在fixed limit下模拟内存分配。固定限制是可用于编程的内存空间。(你可以把它想象成一种具有固定可用内存量的沙箱)

如何实施(其中之一)一些示例可能的解决方案(或您的解决方案):

  • 只是将指令更改为NOP
  • brk成功返回 0 时,通过设置内存(寄存器)状态的设置操作来模拟它的成功,就像brk成功调用的那样。
  • 更复杂的......带有代码(或函数调用)的工具,可在固定限制下模拟成功的内存分配。
  • 最灵活(在我的情况下可能是矫枉过正)将此系统调用更改为函数调用并将提供的函数添加到二进制文件中。

给定的二进制代码可以是以下两种形式之一(最好是两种形式)恶意代码:

  • 共享库 - 在这里我可以在函数调用之前设置环境(例如以受控方式调用 brk)
  • 程序二进制 - 在这种情况下,我们需要给程序固定数量的内存(由调用者,或在程序“一个系统调用”开始时),因为它无法分配。调用此类程序的示例应包含在答案中。

由于问题与许多其他方面密切相关,我尽力将其作为问题分开,但如果我应该或多或少地指定一些内容,请给我建议。

欢迎提供实施答案、资源链接(书籍、教程)。

(我对Linux和可靠的解决方案最感兴趣,因此即使在汇编程序中准备二进制文件的人也不必担心他们的代码的执行)

0 投票
2 回答
513 浏览

x86 - 反汇编“faddl”指令

在我为 x86 平台上的 32 位 Linux 编写反汇编程序的冒险中,我遇到了一个问题。当我使用以下命令反汇编一个简单的 ELF-32 可执行文件时,我看到了以下操作码序列objdump

但是当我查看英特尔手册时,我没有看到与此相对应的操作码。该fadd指令以 0xDC 开头,但随后需要一个m64fp操作数,即“内存中的内存四字操作数”。

现在,这是否意味着操作数是一个 64 位地址(这意味着该fadd指令是一个 64 位指令,但没有以 REX 字节为前缀),或者它只是一个指向的 32 位地址到四字(64 位)?

我是否在这里遗漏了一些琐碎的事情,或者我对编码 x86 指令的理解是错误的?

0 投票
2 回答
1189 浏览

x86 - x86 中的重复前缀和强制前缀

在我为特定于 x86 架构的 linux 编写一个小型反汇编程序的过程中,我遇到了一个小问题。它与强制性前缀和重复前缀有关。查看英特尔文档 [1],据说重复前缀是0xf20xf3,强制前缀是0x660xf20xf3

有两条指令具有以下基本操作码:

crc32 -- f2 0f 38 f0 (这里,0xf2 是强制前缀
movbe -- 0f 38 f0

因此,只要计数器寄存器非零就必须重复的“movbe”指令的操作码应该是:

repnz movbe == f2 0f 38 f0

当我开始反汇编指令时,如果我看到字节0xf2,我怎么知道它是crc32指令的强制前缀,而不是movbe指令的重复前缀,反之亦然?我将操作码模式“f2 0f 38 f0”匹配到哪条指令?

我错过了什么?

[1] http://www.intel.com/design/intarch/manuals/243191.HTM

谢谢和问候,
Hrishikesh Murali

0 投票
3 回答
7297 浏览

assembly - 计算 JMP 操作码

我正在尝试计算跳转的正确操作码,我已经在其他线程中查看过这个,但我仍然不明白:

我认为该公式是desination - (from+5)但它只是不起作用,它的方式,这是我想跳转到/从地址:

所以我遇到了这个问题,任何帮助表示赞赏。