machine-code相关内容

跳过未知操作码:66,不是8086指令-尚不支持

我正在使用emu8086。我有一个问题,这个问题让我在从六进制输入转换后,在七个分段显示器上显示我们看到的内容。我应该用十六进制输入我的数据,如果它与七段表的十六进制输入相匹配,它会显示十进制数,例如。3FH=0,06H=1。我使用数组来实现这个程序。以下是工作源程序: ORG 100H MOV AL,[1840H] ;input in this memory locatio ..
发布时间:2022-08-23 20:32:27 其他开发

继续获取 e8 00 00 00 00 作为机器代码以在汇编中调用函数

我知道在我的文件中使用 objdump -dr 时 call 在机器代码中显示为 e8 00 00 00 00 因为它没有尚未被链接.但我需要找出链接器完成工作后 00 00 00 00 会变成什么.我知道它应该计算偏移量,但我对此有点困惑. 以下面的代码为例,链接器部分完成后,e8 00 00 00 00应该如何?我如何得到这个答案? 我正在使用此示例代码进行测试:(我正在尝试调用 ..
发布时间:2022-01-11 15:41:52 其他开发

如何让gcc只生成可以直接加载到内存并执行的机器码?

我想生成一个可以加载到内存中的文件(例如使用 mmap),然后跳转到该内存的开头运行代码. 理想情况下,我希望选择使代码可重定位(这可能效率低下)或指定代码期望加载的显式地址(这很痛苦),但任何一个都可能工作正常靠自己. 解决方案 你可以这样做,但你需要通过目标文件格式.特别是,objcopy 命令可以将可执行文件转换为“平面"二进制文件(取决于您的目标平台).也许是这样的: gc ..
发布时间:2022-01-11 15:18:44 其他开发

在 x86 机器码中调用绝对指针

在 x86 机器代码中调用绝对指针的“正确"方法是什么?有没有什么好方法可以在一条指令中做到这一点? 我想要做什么: 我正在尝试构建一种基于“子例程线程"的简化迷你 JIT(静止).它基本上是字节码解释器的最短可能步骤:每个操作码都被实现为一个单独的函数,因此每个基本字节码块都可以“JITted"到它自己的新程序中,如下所示: {序言}调用{操作码过程 1}调用{操作码过程2}调用{ ..
发布时间:2022-01-06 12:18:23 其他开发

为什么 RISC-V S-B 和 U-J 指令类型以这种方式编码?

我正在阅读一本书“计算机组织与设计 RISC-V 版",我遇到了 S-B 和 U-J 指令类型的编码. 我上面提到的那些类型有奇怪的编码立即字段. S-B 类型将立即数字段分成 2 部分.这是有道理的,因为所有指令编码都必须相似.但我不明白为什么下面的直接字段以这种方式编码. imm[12, 10:5], imm[4:1, 11] 代替 imm[11:5], imm[4:0] ..
发布时间:2021-12-27 15:44:47 其他开发

Visual C++ 在函数末尾附加 0xCC (int3) 字节

这是我第一次来,我真的希望你们能帮助我,因为我现在已经没有想法了. 我已经搜索了几个小时的答案,但找不到实际可行的答案. 我想直接将代码注入正在运行的进程中.是的,你没有看错.我正在尝试将代码注入另一个应用程序,并且 - 不管你信不信 - 这只是为了扩展它的功能. 我在 Windows 上使用 Visual Studio 2012 Express Edition. 我有以下 ..
发布时间:2021-12-22 18:56:30 C/C++开发

为什么我的汇编程序没有将 r1 设置为正确的值?

我正在 LC3 机器上编写汇编程序. 我的汇编程序是一个 LC3 程序,它将 R2 和 R3 相乘并将结果存储在 R1 中. 这是我的源代码(带注释) ;在程序开始时设置pc到这个地址.ORIG x3000;R1 将存储结果让我们清除它(与 0)AND R1,R1,x0;R2 将乘以 R3,让我们清除它们AND R2,R2,x0AND R3,R3,x0;测试用例 4 * 3 = 12 ..
发布时间:2021-12-18 09:18:31 其他开发

获取装配说明的大小

我需要从内存中的一小段代码中逐条读取指令,并且必须找出内存中指令的大小. 以下只是解释我的问题的原始反汇编代码示例: (gdb) disas/r 0x400281,+8将汇编代码从 0x400281 转储到 0x400289:0x0000000000400281: 48 89 c7 movq %rax, %rdi0x0000000000400284: b0 00 movb $0, %al ..
发布时间:2021-12-18 09:14:17 其他开发

本机代码、机器代码和汇编代码有什么区别?

我对 .NET 语言上下文中的机器代码和本机代码感到困惑. 它们之间有什么区别?它们是一样的吗? 解决方案 这些术语确实有点令人困惑,因为它们有时使用不一致. 机器代码:这是定义最明确的代码.它是使用处理器(执行实际工作的物理金属片)理解并直接执行的字节码指令的代码.在您的机器可以执行之前,所有其他代码必须被翻译或转换为机器代码. 本机代码:该术语有时用于表示机器代码(见 ..
发布时间:2021-12-18 09:12:13 C#/.NET

在函数内使用 DB(定义字节)时出现分段错误

我正在尝试在我的 .text 部分中用汇编语言定义一个字节.我知道数据应该转到 .data 部分,但我想知道为什么在我这样做时它会给我一个分段错误.如果我在 .data 中定义字节,它不会给我任何错误,与 .text 不同.我正在使用运行 Mint 19.1 的 Linux 机器并使用 NASM + LD 来编译和链接可执行文件. 这在没有分段错误的情况下运行: 全局 _start.dat ..
发布时间:2021-12-18 09:11:51 其他开发

"rep;" 是什么意思?不;"在 x86 汇编中是什么意思?和“暂停"一样吗?操作说明?

什么是rep;nop 是什么意思? 和pause指令一样吗? 它是否与 rep nop 相同(没有分号)? 与简单的 nop 指令有何不同? 它在 AMD 和 Intel 处理器上的表现是否不同? (额外奖励)这些说明的官方文档在哪里? 这个问题的动机 在的评论中进行了一些讨论后另一个问题,我意识到我不知道什么rep;nop; 表示在 x86(或 x86-64)程序集中.而且 ..
发布时间:2021-12-18 09:06:31 其他开发

汇编代码 vs 机器代码 vs 目标代码?

目标代码、机器代码和汇编代码有什么区别? 你能举一个直观的例子来说明它们的区别吗? 解决方案 机器代码 是可以由 CPU 直接执行的二进制(1 和 0)代码.如果您在文本编辑器中打开机器代码文件,您会看到垃圾,包括不可打印的字符(不,不是那些 不可打印的字符;)). 目标代码是尚未链接到完整程序中的机器代码的一部分.它是构成完整产品的特定库或模块的机器代码.它还可能包含在已完成 ..
发布时间:2021-12-18 08:59:05 其他开发

x64 指令编码和 ModRM 字节

编码 调用 qword ptr [rax]调用 qword ptr [rcx] 是 FF 10FF 11 我可以看到最后一位数字 (0/1) 的来源(注册号),但我想弄清楚倒数第二位数字 (1) 的来源.根据AMD64 架构程序员手册第 3 卷:通用和系统说明第 56 页, "/digit - 表示 ModRM 字节仅指定一个寄存器或内存 (r/m) 操作数.该数字由 ModRM r ..
发布时间:2021-12-18 08:58:41 其他开发

FF/4 中的/4 是什么意思?

我常参考的一个网站的 x86 文档有一些指令代码一个斜线和一个数字.例如,jmp 接近绝对间接给出 FF/4,而 jmp 远绝对间接给出 FF/5. /4 和 /5 是什么意思? 为了运行一个快速的小测试,我附加到一个 32 位进程,分配了一点内存并让汇编程序插入 jmp dword ptr[0x12345678];生成的字节码是 FF 25 78563412.我理解地址字节序,但是 ..
发布时间:2021-12-18 08:56:07 其他开发

如何阅读英特尔操作码符号

我正在阅读有关汇编指令的英特尔操作码的一些材料,但我不明白操作码字节后面是什么意思.例如:cw、cd、/2、cp、/3. 请给我一个提示,它是什么意思或者我在哪里可以找到完整的参考资料? E8 cw CALL rel16 调用接近、相对、相对于下一条指令的位移E8 cd CALL rel32 调用接近、相对、相对于下一条指令的位移FF /2 CALL r/m16 调用接近,绝对间接,地址以 ..
发布时间:2021-12-18 08:42:04 其他开发

如何计算跳转目标地址和分支目标地址?

我是汇编语言的新手.我正在阅读 MIPS 架构,但我坚持使用跳转目标地址和分支目标地址以及如何计算每个> 其中. 解决方案 (在下面的图表和文字中,PC是分支指令本身的地址.PC+4code>是分支指令本身的结束,也是分支延迟槽的开始.绝对跳转图中除外.) 1.分行地址计算 在 MIPS 中,分支指令只有 16 位偏移量来确定下一条指令.我们需要一个寄存器添加到这个 16 位值 ..
发布时间:2021-11-30 11:14:37 其他开发

rbp 不允许作为 SIB 基础?

我对 x86-64 二进制编码很陌生.我正在尝试修复一些旧的“汇编"代码. 无论如何,我正在尝试做这样的事情(英特尔语法): mov [rbp+rcx], al 汇编器当前正在生成: 88 04 0D 但这似乎不是一个有效的指令.如果我将 SIB 字节中的基址从 rbp 更改为其他一些寄存器,则它可以正常工作.另一种使其工作的方法是添加一个一字节的零位移(88 44 0D 00).这 ..
发布时间:2021-11-30 11:14:21 其他开发

为什么在 64 模式下默认操作数大小为 32 位?

我正在阅读英特尔文档卷.1、还有3.6.1的章节64 位模式下的操作数大小和地址大小.有三个前缀REX.W,operand-size 66 和 address-size 67 前缀.并提到操作数的大小默认为 32 位.并且只能使用 REX.W 指令前缀(在其他前缀之后)更改它以使其长度为 64 位. 我不知道为什么会这样,为什么我不能将完整的 64 位空间用于例如 int 操作数?跟签有关系 ..

Intel x64 指令 CMPSB/CMPSW/CMPSD/CMPSQ

这些说明位于英特尔手册的第 558 页.我明白了一般的想法,但我坚持这些指令的确切编码.以上是我的理解,如有不对请指正.这都是 64 位模式. 操作码 - 指令:A6 - 将地址 RSI 处的字节与地址 RDI 处的字节进行比较67 A6 - 将地址 ESI 处的字节与地址 EDI 处的字节进行比较66 A7 - 将地址 RSI 处的字与地址 RDI 处的字进行比较67 66 A7 - 将地址 ..
发布时间:2021-11-25 07:41:10 C#

为什么在 64 模式下默认操作数大小为 32 位?

我正在阅读英特尔文档卷.1、还有3.6.1的章节64 位模式下的操作数大小和地址大小.有三个前缀REX.W,operand-size 66 和 address-size 67 前缀.并提到操作数的大小默认为 32 位.并且只能使用 REX.W 指令前缀(在其他前缀之后)更改它以使其长度为 64 位. 我不知道为什么会这样,为什么我不能将完整的 64 位空间用于例如 int 操作数?跟签有关系 ..
发布时间:2021-11-25 05:24:21 C#