问题标签 [machine-code]
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.
c - 读取正在执行的指令
正如标题所暗示的,有没有办法在机器代码指令被执行时/之后读取它们?例如,如果我有一个任意的 C 代码块,并且我想知道在输入该块时编译和执行了哪些指令,那么有没有办法做到这一点?提前感谢您提供有关该主题的任何指示。
编辑:关于我想要做什么的一些动机:我想要一个程序来粗略地弄清楚它是如何编译的或它当前正在运行什么指令,而实际上不需要知道机器代码是如何制作的。即我想使用一些编译器以前在编译程序时所做的艰苦工作,以便我可以复制并稍后使用正在执行的机器代码。
c - 软件可以在裸机上执行吗?
我只是想知道,我们可以在没有操作系统的机器上执行程序吗?
另外,听说Linux内核是用C语言写的,而且内核在开机的时候运行,所以我就想知道,不先编译,电脑是怎么理解这种语言的?
execution - 机器码和目标码的区别
我在我的水平中间,我正在为我的计算机考试做一些复习。我想知道是否有人可以告诉我机器代码和目标代码之间有什么区别。
请保持简单。
assembly - 谁能解决这个 8080 汇编代码“难题”?
我的一个朋友得到了 8080 汇编代码,作为他试图解决的谜题的一部分。这是代码:
他需要 B、DE、C 和 HL 的值
任何人都可以解决这个问题或为我指出如何运行它的正确方向吗?
更新
剧透:解决方案似乎是:
C = 02,B = 06,D = 01,E = 41,H = 01,L = AA
assembly - 如何将 Intel 80386 机器代码转换为汇编语言?
我被赋予了以下任务:
考虑以下十六进制值序列:
55 89 E5 83 EC 08 83 E4 F0 31 C9 BA 01 00 00 00 B8 0D 00 00 00 01 D1 01 CA 48 79 F9 31 C0 C9 C3
此字节序列表示 32 位模式下 Intel 80386 机器语言中的子例程。
当执行此子程序中的指令时,它们会将值留在寄存器 %ecx 和 %edx 中。价值观是什么?
执行此子例程完成的计算的 C 程序是什么,然后打印由该程序计算的 %ecx 和 %edx 的值,就像它们在子例程执行结束时出现的那样。
由于我没有记住 80386 指令集,我必须首先将这些操作码字节转换为它们的汇编语言助记符等价物。那么,在某处是否有在线参考,将十六进制值映射到指令之类的表?我查看了英特尔的网站,但一无所获。还是有更好的方法来破译这个......?
c++ - 关于实现简单 CPU 仿真器的问题
背景信息:最终,我想写一个真机的模拟器,比如原来的任天堂或Gameboy。然而,我决定我需要从一个简单得多的地方开始。我的计算机科学顾问/教授向我提供了一个非常简单的假想处理器的规格,他首先创建了该处理器以进行模拟。有一个寄存器(累加器)和 16 个操作码。每条指令由 16 位组成,其中前 4 位包含操作码,其余为操作数。指令以二进制格式的字符串形式给出,例如“0101 0101 0000 1111”。
我的问题:在 C++ 中,解析处理指令的最佳方法是什么?请记住我的最终目标。以下是我考虑过的几点:
我不能只是在阅读指令时处理和执行指令,因为代码是自我修改的:一条指令可以改变后面的指令。我能看到解决此问题的唯一方法是存储所有更改并为每条指令检查是否需要应用更改。这可能会导致与每条指令的执行进行大量比较,这是不好的。所以,我想我必须以另一种格式重新编译指令。
尽管我可以将操作码解析为字符串并对其进行处理,但在某些情况下,必须将整个指令视为一个数字。例如,递增操作码甚至可以修改指令的操作码部分。
如果我要将指令转换为整数,我不确定如何仅解析 int 的操作码或操作数部分。即使我将每条指令重新编译为三部分,整个指令为 int,操作码为 int,操作数为 int,这仍然无法解决问题,因为我可能必须递增整个指令然后解析受影响的操作码或操作数。此外,我是否必须编写一个函数来执行此转换,或者是否有一些 C++ 库具有将“二进制格式”的字符串转换为整数的函数(如 Java 中的 Integer.parseInt(str1, 2))?
另外,我希望能够执行移位等操作。我不确定如何实现,但这可能会影响我实现此重新编译的方式。
感谢您提供的任何帮助或建议!
assembly - 在 SSE 中组合前缀
在 SSE 中,前缀066h
(操作数大小覆盖)0F2H
(REPNE)和0F3h
(REPE)是操作码的一部分。
在非 SSE066h
中,在 32 位(或 64 位)和 16 位操作之间切换。 0F2h
并0F3h
用于字符串操作。它们可以组合在一起,以便066h
和0F2h
(或0F3h
)可以在同一条指令中使用,因为这是有意义的。SSE 指令中的行为是什么?例如,我们有(暂时忽略 mod/rm):
但这是什么?
怎么样?
更不用说以下有两个冲突的 REP 前缀:
这些的规格是什么?
c - 将文件中的机器代码加载到内存中并在 C 中执行——mprotect 失败
您好我正在尝试将原始机器代码加载到内存中并从 C 程序中运行它,现在当程序执行时它会在尝试在内存上运行 mprotect 以使其可执行时中断。我也不完全确定如果内存设置正确,它将执行。我目前在 Ubuntu Linux x86 上运行它(也许问题是 Ubuntu 的过度保护?)
我目前拥有的是以下内容:
我确实收到了编译器警告:
我还没有让程序访问这个代码,所以我无法看到我的汇编代码是否在做它应该做的事情。
c++ - 为什么EXE不是二进制的?
为什么如果你在十六进制编辑器中打开一个 EXE,你会看到各种各样的东西。如果计算机只理解二进制,那么文件中不应该只有 2 个可能的符号吗?谢谢
assembly - 每个机器代码是否必须只能映射到一个汇编代码?
假设这两个本质上是相同的:
和
这表示每个汇编指令都映射到一个机器代码。
但是每个机器代码是否必须只能映射到一个汇编代码?