我有兴趣为自己的学习目的开发 PowerPC 模拟器。我已经找到了大量有关 PowerPC 汇编编程的资源,但是经过一段时间的查找,我还没有能够在任何地方找到指令/操作码映射表。当然,我需要操作码才能编写模拟器。我在哪里可以找到一个?
我试图将原始机器代码字节写为0和1到文本文件中,并通过BIOS执行它.
然而,我有一些问题需要理解寻址,乘法,偏移,寻址,操作数和指令在组合安排中的作用,即MOV AL, 07和之间的区别MOV BL, AL.
我的意思是它在Assembly中是有意义的,但在机器代码中,获取参数的想法变得非常困难.
所以我想知道的是:我怎样才能更好地理解这一点?我发现没有教程可以准确地解释/描述组合相关中的指令或数据传递,MMIO,寻址模式,算术等之间的连接中的0和1.
在这个网站http://ref.x86asm.net/coder32.html#x00它尝试,但我不明白这一点.
示例:假设我想将5移入AL ...我是否将二进制文件中的文字'5'指定为使用AL/MOV指令链接的二进制前缀中的操作码的一部分,或者我是否每个都有一个固定的二进制代码教学,无论价值多少?这就是我想知道的...如何解释如何编写机器代码.
我刚刚发现 push 指令可以有一个立即数 byte 、 word 、 dword 参数,并且每个参数都有不同的操作码。我正在阅读的书中没有示例,所以我不明白汇编程序如何区分这三种类型。例如,如果我编写push 12h汇编器将如何解释它以及堆栈上实际会发生什么?
即不同的寻址模式是否以某种方式编码在操作码中?可以通过编程方式提取它们还是这些信息仅存在于 6502 的文档中?我正在编写一个模拟器,我不关心性能。如果可能的话,最好有一个接受操作码并返回寻址模式的函数。
到目前为止,我还没有发现任何迹象表明代码中存在某种模式,除了所有零页指令似乎都设置了第三位之外。
我试图通过仅针对我的实现执行本机php函数来了解更深入的PHP内部信息。
但是在每个操作码转储中,我都会看到以下两个操作码:
EXT_NOP :http : //php.net/manual/tr/internals2.opcodes.ext-nop.php
EXT_STMT:http : //php.net/manual/tr/internals2.opcodes.ext-stmt.php
如您在文档中所见,没有详细的解释。
即使在文档中给出的以下示例中,我的转储也不同于文档的特殊化。我真的很想知道为什么每个垃圾场都有这两个摊位吗?它们的功能是什么?
<?php
/*
* no operation
* opcode number: 0
*/
function A(){};
?>
Run Code Online (Sandbox Code Playgroud)
环保化:
LXC
Linux web 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt11-1+deb8u5 (2015-10-09) x86_64 GNU/Linux
PHP 5.6.15-1~dotdeb+7.1 (cli) (built: Nov 3 2015 16:29:58)
Copyright (c) 1997-2015 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2015 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright (c) 1999-2015, by Zend Technologies
with Xdebug v2.3.3, Copyright (c) 2002-2015, by …Run Code Online (Sandbox Code Playgroud) 我有以下汇编代码:
global _start
section .text
_start:
add byte [eax], al
Run Code Online (Sandbox Code Playgroud)
编译和链接后,我尝试看到操作码:
$ objdump -d eax.o
eax.o: file format elf32-i386
Disassembly of section .text:
00000000 <_start>:
...
$
Run Code Online (Sandbox Code Playgroud)
为什么我得到一个空操作码?
看http://ref.x86asm.net/coder32.html我发现两个匹配语句的操作码
xor eax,eax
1)操作码31 XOR r/m16/32 r16/32
2)操作码33 XOR r16/32 r/m16/32
两者都指操作数1和操作数2的32位寄存器.那么,XORing两个32位寄存器的这种特殊情况有什么不同吗?
我正在制作一种与hlsl非常相似但只支持像素着色器的小语言.此语言使用reflection.emit构建实现相同功能的点网络程序集.我正在测试我的分支指令"if"的实现,并且在我的一个单元测试中(一个大的if if inner if else)失败并出现以下错误消息:
System.NotSupportedException:位置上的非法单字节分支:32.请求的分支是:132.
在我的案例OpCodes.Br_S中,我已经将问题追溯到使用简短格式指令.解决方案很简单,我用OpCodes.Br替换了OpCodes.Br_S但是我对这个解决方案有几个问题:
此解决方案对生成的代码的性能有影响吗?如果我想为单个字节正确生成Br_S而对于其他情况需要Br,我该怎么做?这里的问题是我正在使用访问者模式和像"if"这样的分支指令我必须首先输出Br或Br_s,此时我无法知道剩下的代码是否需要多个单字节跳到标签.为了更好地说明我的问题,这是我为以下语句生成的代码:
我的语言:
int a = -1; if (1>1) { a=1; } else if(2>2) { a=2; }
IL:
.method public virtual final instance int32 Main() cil managed
{
.maxstack 4
.locals init (
[0] int32 num)
L_0000: ldc.i4.m1
L_0001: stloc.0
L_0002: ldc.i4.1
L_0003: ldc.i4.1
L_0004: ble.s L_000a
L_0006: ldc.i4.1
L_0007: stloc.0
L_0008: br.s L_0010
L_000a: ldc.i4.2
L_000b: ldc.i4.2
L_000c: ble.s L_0010
L_000e: ldc.i4.2
L_000f: stloc.0
L_0010: ldloc.0
L_0011: ret
Run Code Online (Sandbox Code Playgroud)
}
int a … 在查看由NASM生成的列表文件时,我发现有三种操作码:
他们是什么意思?什么时候使用它们?
这是展示以上所有内容的列表文件的示例:
1 section .text
2 extern printf
3 extern fgets
4 00000000 313233 str3: db "123"
5 main:
6 00000003 68[00000000] push str1
7 00000008 68[09000000] push str2
8 0000000D 68[00000000] push str3
9 00000012 E8(00000000) call func1
10 00000017 E8(04000000) call func2
11 0000001C E80B000000 call func3
12 00000021 E8(00000000) call printf
13 00000026 E8(00000000) call fgets
14 0000002B C3 ret
15
16 0000002C 90 func3: nop
17 0000002D C3 ret
18
19
20 …Run Code Online (Sandbox Code Playgroud) 所有x86 cpu都有指令指针寄存器,它保存下一条要执行的指令的偏移量(地址).如果没有分支或跳转,那么下一条获取指令的递增(或递减)的典型量是多少?我认为这可能是32位典型指令的大小?
opcode ×10
assembly ×6
x86 ×4
disassembly ×2
6502 ×1
binary ×1
binaryfiles ×1
c# ×1
callstack ×1
cpu ×1
emulation ×1
hlsl ×1
instructions ×1
machine-code ×1
nasm ×1
objdump ×1
offset ×1
php ×1
php-opcode ×1
powerpc ×1
xdebug ×1
xor ×1