注意,这不是facebook最近的hiphop项目,我只是想把它转换成opcode,不是c/c++。
现在还有解决办法吗?
演示永远是最好的!
我正在尝试在 X86_64 (amd64) ISA 中添加自定义指令。我将使用这些指令创建一个二进制文件,然后在 gem5 模拟器中运行它。要查找未使用的操作码列表,我指的是http://ref.x86asm.net/coder64.html。然而,该网站仅列出了单字节未使用的操作码。我正在寻找的是 amd64 CPU 的解码器语法,以便我可以找到哪些二进制序列无效。我尝试测试一些随机二进制序列以查看它们是否无效,并且我能够找到一些(例如0xc5000c无效的 3 字节指令)。然而,我想要 amd64 CPU 用来解码指令的语法,以导出更长的无效二进制序列。是否有任何资源可用于此任务?
目前,为了查找二进制序列,我使用 C 程序,如下所示:
int main()
{
asm volatile(".byte 0x06" ::: "memory");
asm volatile(".byte 0x07" ::: "memory");
asm volatile(".byte 0x0E" ::: "memory");
asm volatile(".byte 0x16" ::: "memory");
asm volatile(".byte 0x17" ::: "memory");
asm volatile(".byte 0x1E" ::: "memory");
asm volatile(".byte 0x1F" ::: "memory");
asm volatile(".byte 0x27" ::: "memory");
asm volatile(".byte 0x2F" ::: "memory");
asm volatile(".byte 0x37" ::: "memory");
asm volatile(".byte 0x3F" ::: "memory"); …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Chip 8仿真器作为仿真的介绍,我有点迷失.基本上,我已经读过Chip 8 ROM并将其存储在内存中的char数组中.然后,按照指南,我使用以下代码检索当前程序计数器(pc)上的操作码:
// Fetch opcode
opcode = memory[pc] << 8 | memory[pc + 1];
Run Code Online (Sandbox Code Playgroud)
芯片8操作码每个2字节.这是一个指南的代码,我模糊地理解为向内存[pc]添加8个额外的位空间(使用<< 8)然后将内存[pc + 1]与它合并(使用|)并将结果存储在操作码变量中.
既然我已经隔离了操作码,我真的不知道如何处理它.我正在使用这个操作码表,我基本上在将我读取的十六进制操作码与该表中的操作码标识符相匹配方面丢失了.另外,我意识到我正在阅读的许多操作码也包含操作数(我假设后一个字节?),这可能使我的情况更加复杂.
救命?!
在我尝试为x86平台上的32位Linux编写反汇编程序时,我遇到了一个问题.当我使用以下方法拆卸简单的ELF-32可执行文件时,我看到了以下操作码序列objdump:
dc 82 04 08 0d 00 faddl 0xd0804(%edx)
Run Code Online (Sandbox Code Playgroud)
但是当我查看英特尔手册时,我没有看到对应的操作码.该fadd指令以0xDC开始,但它需要一个m64fp操作数,即"内存中的内存四字操作数".
现在,这是否意味着操作数是64位地址(这意味着该fadd指令是64位指令,但不以REX字节作为前缀),或者它只是一个32位地址指向到四字(64位)?
我在这里遗漏了一些微不足道的东西,还是我对编码x86指令的理解错了?
我正在尝试计算跳转的正确操作码,我在其他线程中看过这个,但我仍然不明白:
我认为公式是desination - (from+5)但它只是不起作用,它离开了,这是我想要跳转的地址:
FROM: 6259326B
TO: 02980000
CORRECT OPCODE: E9 90CD3EA0
FORMULA OPCODE: E9 5FC13266
Run Code Online (Sandbox Code Playgroud)
所以我有这个问题,任何帮助赞赏.
我正在尝试创建一个操作码来跳转到一个地址.
我查看了手册,我看到:
B<c> <label>
31 30 29 28 | 27 26 25 24 | 23 ................. 0
cond 1 0 1 0 imm24
Run Code Online (Sandbox Code Playgroud)
我不明白什么cond和imm24有.我如何创建一个操作码来分支到某个地址,例如分支到0xbeffffbc?
我仍在学习汇编并尝试将指令与其操作码连接起来.通过https://code.google.com/p/corkami/wiki/PE101?show=content阅读pdf
它只是剖析一个简单程序的PE文件,在windows中显示消息框,代码是"删除所有不相关的条目"
push 0
push Title + DATADELTA
push Caption + DATADELTA
push 0
call [__imp__MessageBoxA]
Run Code Online (Sandbox Code Playgroud)
当试图查看生成的exe文件".text"部分时,最后一次调用表示操作码"FF15",检查英特尔手册还有操作码列表http://ref.x86asm.net/coder32.html
你会发现"call"指令操作码只是"FF",那么"15"是指或来自哪个?
我只知道x86 AT&T语法中的je,jnl等指令.
jcc究竟意味着什么?所有跳转说明?
使用Perl,我有两个类似的语法,
if ($a && $b) { exit() }
do { exit() } if ($a && $b)
Run Code Online (Sandbox Code Playgroud)
我认为这些应该是相同的,但最上面的一个创建一个null vK操作码,
<1> null vK*/1 ->-
Run Code Online (Sandbox Code Playgroud)
它的意义是null vK什么,它有什么作用?
$ perl -MO=Concise -e'if ($a && $b) { exit() }'
8 <@> leave[1 ref] vKP/REFC ->(end)
1 <0> enter ->2
2 <;> nextstate(main 1 -e:1) v:{ ->3
- <1> null vK/1 ->8
6 <|> and(other->7) vK/1 ->8
- <1> null sK/1 ->6
4 <|> and(other->5) sK/1 ->8
- <1> ex-rv2sv sK/1 ->4 …Run Code Online (Sandbox Code Playgroud) 为什么要nop分配给0x90intel x86组件?
凭直觉,我希望它0x00会映射到nop(也xchg eax, eax位于intel x86上),这ARM A32和其他一些体系结构一样。