gpt4 book ai didi

variables - MASM - 宏变量?

转载 作者:行者123 更新时间:2023-12-01 16:38:15 26 4
gpt4 key购买 nike

这是我的第一个问题,希望您能帮助我!我目前正在开发 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 这样的变量以使其更容易访问。我希望你能理解我。也许可以用宏来做到这一点?

最佳答案

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

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 位寄存器(BCDEHL)或 8 位寄存器(BCDE HLA)。

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

如果您想知道我为什么创建该表:您可以通过谷歌“解码”操作码来获取更多信息“z80 解码”

关于variables - MASM - 宏变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30849068/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com