代码拉取完成,页面将自动刷新
<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>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。