首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MASM -宏变量?

MASM -宏变量?
EN

Stack Overflow用户
提问于 2015-06-15 23:28:16
回答 1查看 243关注 0票数 4

这是我在这里的第一个问题,我希望你能帮助我!我现在正在做一个GameBoy模拟器,我想用MASM语言编写它,为了处理CPU指令,我想创建一个带有变量的数组,让我更容易访问它。

下面是我想要实现的一个示例:

代码语言:javascript
运行
复制
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中获取一个值,它应该是这样工作的:

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

EN

回答 1

Stack Overflow用户

发布于 2015-06-16 04:10:35

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

代码语言:javascript
运行
复制
REGISTER_A equ [esi+CPU_CORE.registers.A]

但是你只能像这样加载它:

代码语言:javascript
运行
复制
mov eax, REGISTER_A ;EAX will now contain the value of the register A.

然后我发现你可以直接访问一个结构的偏移量(我不知道为什么我以前从来没有用过它)。

代码语言:javascript
运行
复制
REGISTER_A equ CPU_CORE.registers.A

由于这是可行的,我创建了一个名为PARAM的结构,它看起来像这样:

代码语言:javascript
运行
复制
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操作码创建了一个参数列表。看起来是这样的:

代码语言:javascript
运行
复制
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')>

以及从寄存器中读取的函数

代码语言:javascript
运行
复制
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位寄存器(BCDEH、<代码>D23、<代码>D24)的大小。

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

如果你想知道我为什么要创建这个表:你可以“解码”操作码以获取更多信息,谷歌"z80解码“。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30849068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档