13 Star 20 Fork 2

Firas / FirasOS

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
Macro.source 3.38 KB
一键复制 编辑 原始数据 按行查看 历史
<head language="Chinese">
</head>
<head language="English">
</head>
<comment language="Chinese">
-- 在MBR、VBR之类的对代码占用的空间要小的地方,
用xor指令清零再用or 1或inc指令比但用一条
mov 1指令所需空间更少
-- 例如mov eax, 1的机器码为5字节的0xB8 0x01 0x00 0x00 0x00
或0xC7 0x01 0x00 0x00 0x00
mov rax, 1的机器码为10字节的
0x48 0xB8 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
或7字节的0x48 0xC7 0xC0 0x01 0x00 0x00 0x00
-- 而xor eax, eax的机器码为0x31 0xC0
xor rax, rax的机器码为0x48 0x31 0xC0
32位模式中inc eax的机器码为0x40
64位模式中inc eax的机器码为0xFF 0xC0
or al, 1的机器码为0x0C 0x01
</comment>
<assemblyX86 compiler="fasm">
IF ~DEFINED _MACRO_H_
_MACRO_H_ EQU 1
; reg can be a 32-bit general register
MACRO MOV1TO reg{
xor reg, reg
inc reg
} ; MACRO MOV1TO
</assemblyX86>
<assemblyX64 compiler="fasm">
IF ~DEFINED _MACRO_H_
_MACRO_H_ EQU 1
; reg can be a 64-bit or 32-bit general register
MACRO MOV1TO reg{
xor reg, reg
MATCH =rax, reg \{ or al, 1 \}
MATCH =rbx, reg \{ or bl, 1 \}
MATCH =rcx, reg \{ or cl, 1 \}
MATCH =rdx, reg \{ or dl, 1 \}
MATCH =rbp, reg \{ inc ebp \}
MATCH =rsi, reg \{ inc esi \}
MATCH =rdi, reg \{ inc edi \}
MATCH =eax, reg \{ or al, 1 \}
MATCH =ebx, reg \{ or bl, 1 \}
MATCH =ecx, reg \{ or cl, 1 \}
MATCH =edx, reg \{ or dl, 1 \}
MATCH =ebp, reg \{ inc ebp \}
MATCH =esi, reg \{ inc esi \}
MATCH =edi, reg \{ inc edi \}
} ; MACRO MOV1TO
</assemblyX64>
<cpp>
#ifndef _MACRO_H_
#define _MACRO_H_
#if defined(_X64_)
#define CALLCONV __fastcall
#elif defined(_X86_)
#define CALLCONV __stdcall
#else
#define CALLCONV
#endif
typedef signed char INT8;
typedef signed short INT16;
typedef signed long INT32;
typedef signed long long INT64;
typedef unsigned char BYTE, UINT8;
#if 1
// on x86 and x64
typedef unsigned short WORD, UINT16;
typedef unsigned long DWORD, UINT32;
typedef unsigned long long QWORD, UINT64;
#elif 0
typedef unsigned short HWORD, UINT16;
typedef unsigned long WORD, UINT32;
typedef unsigned long long DWORD, UINT64;
#endif
typedef float REAL4;
typedef double REAL8;
typedef long double REAL10;
typedef unsigned int BOOLEAN;
#define TRUE ((BOOLEAN)1)
#define FALSE ((BOOLEAN)0)
const INT8 INT8_MAX = 0x7F, INT8_MIN = 0x80;
const UINT8 UINT8_MAX = 0xFF;
const INT16 INT16_MAX = 0x7FFF, INT16_MIN = 0x8000;
const UINT16 UINT16_MAX = 0xFFFF;
const INT32 INT32_MAX = 0x7FFFFFFF, INT32_MIN = 0x80000000;
const UINT32 UINT32_MAX = 0xFFFFFFFF;
const INT64 INT64_MAX = 0x7FFFFFFFFFFFFFFFLL;
const INT64 INT64_MIN = 0x8000000000000000LL;
const UINT64 UINT64_MAX = 0xFFFFFFFFFFFFFFFFLL;
</cpp>
<assemblyX64 compiler="fasm">
INT8_MAX EQU 7Fh
INT8_MIN EQU 80h
UINT8_MAX EQU 0FFh
INT16_MAX EQU 7FFFh
INT16_MIN EQU 8000h
UINT16_MAX EQU 0FFFFh
INT32_MAX EQU 7FFFFFFFh
INT32_MIN EQU 80000000h
UINT32_MAX EQU 0FFFFFFFFh
INT64_MAX EQU 7FFFFFFFFFFFFFFFh
INT64_MIN EQU 8000000000000000h
UINT64_MAX EQU 0FFFFFFFFFFFFFFFFh
MACRO TEST_NULL reg{
test reg, reg
jnz @F
; TODO: NullPointerException
xor rax, rax
ret
@@:
} ; MACRO TEST_NULL
END IF ; ~DEFINED _MACRO_H_
</assemblyX64>
<assemblyX86 compiler="fasm">
INT8_MAX EQU 7Fh
INT8_MIN EQU 80h
UINT8_MAX EQU 0FFh
INT16_MAX EQU 7FFFh
INT16_MIN EQU 8000h
UINT16_MAX EQU 0FFFFh
INT32_MAX EQU 7FFFFFFFh
INT32_MIN EQU 80000000h
UINT32_MAX EQU 0FFFFFFFFh
MACRO TEST_NULL mem, n{
cmp mem, 0
jne @F
; TODO: NullPointerException
xor eax, eax
retn n
@@:
} ; MACRO TEST_NULL
END IF ; ~DEFINED _MACRO_H_
</assemblyX86>
<cpp>
#endif // _MACRO_H_
</cpp>
Assembly
1
https://gitee.com/Firas/FirasOS.git
git@gitee.com:Firas/FirasOS.git
Firas
FirasOS
FirasOS
master

搜索帮助