%if 0 Register size macros by C. Masloch, 2020 Usage of the works is permitted provided that this instrument is retained with the works, so that any entity that uses the works is notified of this instrument. DISCLAIMER: THE WORKS ARE WITHOUT WARRANTY. %endif %include "lmacros3.mac" %imacro regindexdef 2.nolist %push %define _%1 256 %assign %$size 0 %assign %$exit 0 %rep 5 %ifn %$exit %if %$size == 0 %define %$regnames "ah ch dh bh " %elif %$size == 1 %define %$regnames "al cl dl bl spl bpl sil dil r8b r9b r10br11br12br13br14br15b" %elif %$size == 2 %define %$regnames "ax cx dx bx sp bp si di r8w r9w r10wr11wr12wr13wr14wr15w" %elif %$size == 4 %define %$regnames "eax ecx edx ebx esp ebp esi edi r8d r9d r10dr11dr12dr13dr14dr15d" %elif %$size == 8 %define %$regnames "rax rcx rdx rbx rsp rbp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15 " %endif %assign %$index 0 %rep 16 %ifn %$exit %substr %$reg %$regnames %$index * 4 + 1, 4 %deftok %$reg %$reg %ifnempty %$reg %ifidni %$reg, %2 %assign _%1 %$index %assign %$exit 1 %exitrep %endif %endif %endif %assign %$index %$index + 1 %endrep %if %$exit %exitrep %endif %assign %$size !%$size + %$size * 2 %endif %endrep %ifn %$exit %error Invalid register name: %2 %endif %pop %endmacro %imacro regsizedef 3.nolist %push %define _%1 invalidregister %assign %$size 0 %assign %$highbyte 0 %ifidni %2, byte %assign %$size 1 %elifidni %2, highbyte %assign %$size 1 %assign %$highbyte 1 %elifidni %2, word %assign %$size 2 %elifidni %2, dword %assign %$size 4 %elifidni %2, qword %assign %$size 8 %else %assign %$size %2 %endif %if %$size == 0 %error Invalid register size: %2 %else %ifnnum %3 %error Invalid register number: %3 %elif (%3) >= 16 %error Invalid register number: %3 %elif (%3) < 0 %error Invalid register number: %3 %else %if %$size == 1 && %$highbyte %define %$regnames "ah ch dh bh " %elif %$size == 1 %define %$regnames "al cl dl bl spl bpl sil dil r8b r9b r10br11br12br13br14br15b" %elif %$size == 2 %define %$regnames "ax cx dx bx sp bp si di r8w r9w r10wr11wr12wr13wr14wr15w" %elif %$size == 4 %define %$regnames "eax ecx edx ebx esp ebp esi edi r8d r9d r10dr11dr12dr13dr14dr15d" %elif %$size == 8 %define %$regnames "rax rcx rdx rbx rsp rbp rsi rdi r8 r9 r10 r11 r12 r13 r14 r15 " %else %define %$regnames "" %endif %substr %$reg %$regnames (%3) * 4 + 1, 4 %deftok %$reg %$reg %ifempty %$reg %error Invalid register type selected %else %xdefine _%1 %$reg %endif %endif %endif %pop %endmacro bits 64 regsizedef REG, 2, 0 mov _REG, 1234h regsizedef REG, 4, 0 mov _REG, 12345678h regsizedef REG, qword, 0 %warning REG=>>_REG<< regsizedef REG, highbyte, 2 %warning REG=>>_REG<< regindexdef INDEX, rdi regsizedef REG, word, _INDEX mov _REG, 1234h regindexdef INDEX, cx regsizedef REG, qword, _INDEX %warning REG=>>_REG<< INDEX=>>_INDEX<< numdef ERROR, 0 %if _ERROR regsizedef REG, highbyte, 4 regsizedef REG, byte, 16 regsizedef REG, 3, 4 regindexdef INDEX, quux %if _ERROR >= 2 regsizedef REG, foo bar, 0 %endif %endif