所以,我在设计我自己的虚拟CPU。我有一些寄存器和内存,可以执行一些基本的指令。但是现在我被困住了。
如何区分(在组装的“机器代码”中):
LDA $02 ; Load the hex value 0x01 into register A和
LDA B ; Load the value of B into A现在,我已经将操作数($02和B)编码为0x02的值。指令LDA被编码为一个单词(此时为uint16)。
这显然会带来问题。解决这个问题的最好方法是什么?我想我有以下几个选择:
LOADIA、LOADRA、LOADMA分别用于文字、寄存器和内存。国际水文学组织的备选方案1是最好的办法。您能确认1是一个有效的选项或提供其他方法来处理这个问题吗?谢谢!
发布于 2014-07-01 11:55:35
首先,将助记符转换为长手。
lda $02变成ld a $02变成load immediate a with 02
lda b变成ld a b变成copy register a from b
可以看到,lda并不一定是指令,您需要查看全部内容。另外,如果您将所有指令保持相同的长度,则可以获得更好的性能(使用真正的处理器)。
看一看ARM处理器,它已经有了很好的记录,干净并且仍然使用(很多)。inst.pdf
发布于 2014-07-01 11:35:20
X86 CPU使用的是所谓的Mod /M字节或后置字节。
Instruction Prefix 0 or 1 Byte
Address-Size Prefix 0 or 1 Byte
Operand-Size Prefix 0 or 1 Byte
Segment Prefix 0 or 1 Byte
Opcode 1 or 2 Byte
Mod R/M 0 or 1 Byte
SIB, Scale Index Base (386+) 0 or 1 Byte
Displacement 0, 1, 2 or 4 Byte (4 only 386+)
Immediate 0, 1, 2 or 4 Byte (4 only 386+)
Format of Postbyte(Mod R/M from Intel)
------------------------------------------
MM RRR MMM
MM - Memory addressing mode
RRR - Register operand address
MMM - Memory operand address
RRR Register Names
Filds 8bit 16bit 32bit
000 AL AX EAX
001 CL CX ECX
010 DL DX EDX
011 Bl BX EBX
100 AH SP ESP
101 CH BP EBP
110 DH SI ESI
111 BH DI EDI
---
16bit memory (No 32 bit memory address prefix)
MMM Default MM Field
Field Sreg 00 01 10 11=MMM is reg
000 DS [BX+SI] [BX+SI+o8] [BX+SI+o16]
001 DS [BX+DI] [BX+DI+o8] [BX+DI+o16]
010 SS [BP+SI] [BP+SI+o8] [BP+SI+o16]
011 SS [BP+DI] [BP+DI+o8] [BP+DI+o16]
100 DS [SI] [SI+o8] [SI+o16]
101 DS [DI] [DI+o8] [SI+o16]
110 SS [o16] [BP+o8] [BP+o16]
111 DS [BX] [BX+o8] [BX+o16]
Note: MMM=110,MM=0 Default Sreg is DS !!!!
32bit memory (Has 67h 32 bit memory address prefix)
MMM Default MM Field
Field Sreg 00 01 10 11=MMM is reg
000 DS [EAX] [EAX+o8] [EAX+o32]
001 DS [ECX] [ECX+o8] [ECX+o32]
010 DS [EDX] [EDX+o8] [EDX+o32]
011 DS [EBX] [EBX+o8] [EBX+o32]
100 SIB [SIB] [SIB+o8] [SIB+o32]
101 SS [o32] [EBP+o8] [EBP+o32]
110 DS [ESI] [ESI+o8] [ESI+o32]
111 DS [EDI] [EDI+o8] [EDI+o32]
Note: MMM=110,MM=0 Default Sreg is DS !!!!
---
SIB is (Scale/Base/Index)
SS BBB III
Note: SIB address calculated as:
<sib address>=<Base>+<Index>*(2^(Scale))
Fild Default Base
BBB Sreg Register Note
000 DS EAX
001 DS ECX
010 DS EDX
011 DS EBX
100 SS ESP
101 DS o32 if MM=00 (Postbyte)
SS EBP if MM<>00 (Postbyte)
110 SS ESI
111 DS EDI
Fild Index
III register Note
000 EAX
001 ECX
010 EDX
011 EBX
100 never Index SS can be 00
101 EBP
110 ESI
111 EDI
Fild Scale coefficient
SS =2^(SS)
00 1
01 2
10 4
11 8发布于 2014-07-01 12:50:29
既然你已经有了一些回放,我就试着简化答案。
您可以以特定的方式定义cpu命令。例如,您的LDA命令可以定义为: 1010101x (二进制格式),其中1010101表示LDA,最后一个位指定下一个字节是即时值(0)还是寄存器(1)。
所以在你的情况下应该是:
LDA $02 = 10101010 00000010
LDA B = 10101011 00000010这只是一个例子,但我所知道的所有处理器都是这样工作的。对于某些命令,您可以使用更多的xxx位。您也可能拥有其中的零(例如NOP指令)。
https://stackoverflow.com/questions/24503822
复制相似问题