Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables MASM-宏变量?_Variables_Macros_Emulation_Masm_Gameboy - Fatal编程技术网

Variables MASM-宏变量?

Variables MASM-宏变量?,variables,macros,emulation,masm,gameboy,Variables,Macros,Emulation,Masm,Gameboy,这是我在这里的第一个问题,我希望你能帮助我! 我目前正在开发一个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 (([e

这是我在这里的第一个问题,我希望你能帮助我! 我目前正在开发一个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_表中获取一个值,它应该是这样工作的:

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这样的变量,使其更容易访问。我希望你能理解我。也许用宏可以做到这一点?

所以我在整理了一些东西后回答了自己的问题。 实际上,您可以使用以下寄存器创建常量:

REGISTER_A equ [esi+CPU_CORE.registers.A]
但您只能像这样加载它:

mov eax, REGISTER_A ;EAX will now contain the value of the register 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
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')>
我刚刚为LD R,R操作码创建了一个参数列表。 这看起来像:

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
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')>
此函数将
CPU_核心
加载到
ESI
中,将
PARAM
加载到
EDI
,将
PARAM
的指针添加到
CPU_核心
。在测试标志之后,如果设置了
位0
,它将从CPU内存中读取(例如:
(HL)
),如果没有设置,它将从寄存器中获取值。
位1
表示大小,如果设置了,函数将读取16位寄存器(
BC
DE
HL
)或8位寄存器(
B
C
D
E
H
L
a

我希望你能理解我写的东西。如果您有任何问题,请随意提问,这是迄今为止我解决问题的“最简单”的方法

如果您想知道我为什么创建此表:
您可以“解码”操作码以获取更多信息,请使用谷歌“z80解码”。

欢迎使用StackOverflow!我们通常希望帖子有正确的语法和拼写(尽管你已经纠正了拼写错误)。除此之外,这是一篇很好的第一篇文章!非常感谢。我为我犯的每一个语法/拼写错误感到抱歉,英语不是我的母语,但我会尽力提高!