这是我在这里的第一个问题,我希望你能帮助我!我现在正在做一个GameBoy模拟器,我想用MASM语言编写它,为了处理CPU指令,我想创建一个带有变量的数组,让我更容易访问它。
下面是我想要实现的一个示例:
assume esi:ptr CPU_CORE
REGISTER_A equ (([esi].registers.AF AND 0F0h) SAR 3h)
REGISTER_B equ (([esi].registers.BC AND 0F0h) SAR 3h)
REGISTER_C equ (([esi].registers.BC AND 0Fh))
PARAM_TABLE [Type?] REGISTER_A
[Type?] REGISTER_B
[Type?] REGISTER_C
assume esi:ptr NOTHING如果我想从PARAM_TABLE中获取一个值,它应该是这样工作的:
lea esi, PARAM_TABLE
mov ecx, 1h ; just as example for accessing REGISTER_B
mov eax, [esi+ecx*[TYPE?]]
;EAX now contains the value from the hi-byte of the BC register, so: (([esi].registers.BC AND 0F0h) SAR 3h)因此,基本上我的想法是创建像REGISTER_A这样的变量,使其更容易访问。我希望你能理解我。也许使用宏可以做到这一点?
发布于 2015-06-16 04:10:35
所以我在整理了一些东西之后回答了我自己的问题。实际上,您可以使用以下寄存器创建常量:
REGISTER_A equ [esi+CPU_CORE.registers.A]但是你只能像这样加载它:
mov eax, REGISTER_A ;EAX will now contain the value of the register A.然后我发现你可以直接访问一个结构的偏移量(我不知道为什么我以前从来没有用过它)。
REGISTER_A equ CPU_CORE.registers.A由于这是可行的,我创建了一个名为PARAM的结构,它看起来像这样:
PARAM struct
pointer DWORD ? ;Register pointer
flags BYTE ? ;BIT 0: Content Flag, BIT 1: 8 or 16 bit
desc DWORD ? ;Description of the parameter
PARAM ends在此基础上,我为LD R,R操作码创建了一个参数列表。看起来是这样的:
PARAM_LIST_R PARAM <CPU_CORE.registers.B, 0, _stro('B')>
PARAM <CPU_CORE.registers._C, 0, _stro('C')>
PARAM <CPU_CORE.registers.D, 0, _stro('D')>
PARAM <CPU_CORE.registers.E, 0, _stro('E')>
PARAM <CPU_CORE.registers.H, 0, _stro('H')>
PARAM <CPU_CORE.registers.L, 0, _stro('L')>
PARAM <CPU_CORE.registers.H, 1, _stro('(HL)')>
PARAM <CPU_CORE.registers.A, 0, _stro('A')>以及从寄存器中读取的函数
LoadParam proc cpu_core:DWORD, param:DWORD
LOCAL value:DWORD
pushad
mov esi, cpu_core
mov edi, param
assume esi:ptr CPU_CORE
assume edi:ptr PARAM
add esi, [edi].pointer
movzx ebx, [edi].flags
bt ebx, 0
test ebx, ebx
jnc @NO_CONTENT
movzx edx, word ptr ds:[esi]
;-- ADDING CPU_READ FUNCTION --;
jmp @DONE
@NO_CONTENT:
bt ebx, 1
jc @GET16Bit
movzx eax, byte ptr ds:[esi]
jmp @DONE
@GET16Bit:
movzx eax, word ptr ds:[esi]
@DONE:
mov value, eax
assume esi:ptr NOTHING
assume edi:ptr NOTHING
popad
mov eax, value
ret
LoadParam endp此函数将CPU_CORE加载到ESI中,将PARAM加载到EDI中,PARAM的指针将添加到CPU_CORE中。然后对标志进行测试,如果设置了BIT 0,它将从CPU内存中读取(例如:(HL)),如果没有设置,则只从寄存器中获取值。BIT 1表示如果设置,函数将读取16位寄存器(BC、DE、HL)或8位寄存器(B、C、D、E、H、<代码>D23、<代码>D24)的大小。
我希望你能理解我写的东西。如果你有任何问题,请随意提问,这是迄今为止我解决问题的“最简单”的方法。
如果你想知道我为什么要创建这个表:你可以“解码”操作码以获取更多信息,谷歌"z80解码“。
https://stackoverflow.com/questions/30849068
复制相似问题