169 похожих чатов

Как вам такой препроцессор? // macro - preproc entity type // namesp

- 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;
};

9 ответов

39 просмотров
Vi-Chapmann Автор вопроса

допустим, по умолчанию компиль инклудит этот листинг, т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

Vi Chapmann
допустим, по умолчанию компиль инклудит этот листи...

а не проще С-- тогда юзать? почему в jmp ip-2 не r::ip? почему вообще такой, хм, подход к использованию асма?

Vi-Chapmann Автор вопроса
Mixail Frolov
а не проще С-- тогда юзать? почему в jmp ip-2 не ...

1 - это скорее не язык, а движок для языков уже 2 - очепятка 3 - через эксперименты рождаются интересные решения

Vi-Chapmann Автор вопроса
Vi-Chapmann Автор вопроса
Vi Chapmann
2 - там должно быть jmp r::ip-2

это чтобы реальный проц не долбился в потолок и не шумел кулерами

Vi Chapmann
это чтобы реальный проц не долбился в потолок и не...

да это то понятно, хотя прыжок можно убрать, там же cli hlt

Vi-Chapmann Автор вопроса
Vi Chapmann
а вдруг?)

вдруг hlt каким-то магическим образом слетит

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта