1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Firas-FirasOS

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Macro.source 3.4 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Firas Отправлено 03.12.2014 13:01 5ed999e
<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>

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/Firas-FirasOS.git
git@api.gitlife.ru:oschina-mirror/Firas-FirasOS.git
oschina-mirror
Firas-FirasOS
Firas-FirasOS
master