- namespace (for ns::member)
// pass - passthrough to fasm directly
// def - preprocessor constant definition
// fix - increase preprocessor passes number
// {} is body
// $ is from fasm
// parse is a macro accepts list of tokens or nodes to handle
macro namesp r { // preprocessor namespace "r"
pass { // passthrough registers names
al, ah, ax, eax, rax,
bl, bh, bx, ebx, rbx,
cl, ch, cx, ecx, rcx,
dl, dh, dx, edx, rdx,
sp, esp, rsp, bp, ebp, rbp,
cs, ds, ss, es, fs, gs
};
def { // rip isn't regular register
ip = $;
eip = $;
rip = $;
};
};
pass [use16, use32, use64]; // fasm preprocessor directive
macro pass format(a); // also
macro pass org(a); // also
macro fix typedef(s, t) def t = s; // syntax sugar
def fn __cdecl_fn__; // __cdecl_fn__ is built-in
macro label(n) { // also syntax sugar
n:
};
macro parse {type, name, equal, expr, semicolon} {
name:
type expr;
};
допустим, по умолчанию компиль инклудит этот листинг, тoгда можно писать такой код: format binary; use16; typealias word str; org 0x7C00; label _start { r::ah = 0; r::al = 3; int 0x10; printaz(test_string); cli; hlt; jmp ip-2; } fn printaz(str string) { r::si = string; r::ah = 14; for { lodsb; if (r::al) { int 0x10; continue; } else break; } return; } str test_string = "Hello, World!\r\n"; и дизасм у него будет такой: format binary use16 org 0x7C00 _start: mov ah, 0 mov al, 3 int 0x10 push word [test_string] call printaz add sp, 2 cli hlt jmp $-2 printaz: mov bp, sp push bp add sp, 2 mov si, word [sp] mov ah, 14 __for_1_start: lodsb test al, al jz __for_1_end int 0x10 jmp __for_1_start __for_1_end: mov ax, 0 sub sp, 2 pop bp mov sp, bp ret test_string: dw $+2 db "Hello, World!", 13, 10, "", 0
а не проще С-- тогда юзать? почему в jmp ip-2 не r::ip? почему вообще такой, хм, подход к использованию асма?
1 - это скорее не язык, а движок для языков уже 2 - очепятка 3 - через эксперименты рождаются интересные решения
2 - там должно быть jmp r::ip-2
это чтобы реальный проц не долбился в потолок и не шумел кулерами
да это то понятно, хотя прыжок можно убрать, там же cli hlt
вдруг hlt каким-то магическим образом слетит
Обсуждают сегодня