1

(198 відповідей, залишених у Системне програмування)

0xDADA11C7 написав:

Зазвичай, підсистема вказується так:/SUBSYSTEM:WINDOWS для віконних застосунків і /SUBSYSTEM:CONSOLE для консольних. Ще є NATIVE себто рідне для ОС але то рідковжвана річ - драйвери та системні засоби для роботи в нульовому кільці. Так от, треба до оцього параметру через кому додати нижню межу версії системи(ядра).

Ще є параметр /OSVERSION.
Тоді повний рядок буде такий, наприклад:

Link /SUBSYSTEM:CONSOLE,4.0 /OSVERSION:4.0 %NAME%.obj

Додав би, що згаданий BAT-файл зручно оформлювати таким чином:

set NAME=YourProgramName
 \masm32\bin\ml /c /coff              %NAME%.asm
 \masm32\bin\Link /SUBSYSTEM:WINDOWS  %NAME%.obj

3

(22 відповідей, залишених у Системне програмування)

ReAl написав:

Тю. «саморобні програми завжди сумнівні», асемблери, компілятори не треба використовувати взагалі.

) Ля, всьому ж є межа. Одна справая, якщо реалізуються якісь примітиви, це буває потрібно.
А інша, коли намагаються відтворити синтаксис мови високого рівня. То аби похизуватись
та зробити непортабельний код.
Он, доречі, були такі забаганки із "програмуванням tasm російською мовою",
суцільне макробуйство, але в межах:
-> Тиць <-.

4

(22 відповідей, залишених у Системне програмування)

То є так.
Наприклад, якщо case'и можуть бути тільки послідовними цілими в інтервалі [0..MAX],
тоді табличний метод виправданий практично завжди, якщо  MAX>3 (орієнтовно).
Наприклад, при перекодуванні ASCII-тексту однозначні переваги табличного методу "гілкування".
Якщо ж case'и мають не послідовні значення (ак у темі цього топіка), тоді доцільність табличного метода
знижується, й "тупий" метод <cmp+jnz> сповна має право на використання.

..До речі, у Сі-компілятора є ключі компіляції "за розміром" або "за швидкістю".
Значною мірою це стосується способу реалізації switch'ів.
Дійсно, файл із таблицею переходів буде більшим завдяки додатковим таблицям,
але виконання переходів буде швидшим
(але не завжди, а тільки якщо case'ів більше, ніж якесь порогове число.
Завдання компілятора це число знайти та прийняти рішення про метод реалізації switch'ів).

У аттачі два EXE-файли, отримані трансляцією зразка у стартовому пості теми,
- відтрансльовані один з таблицями переходів, інший без них.
Розмір порівняти можна, швидкість роботи порівняти можна тільки теоретично.

..Але, потестувавши фрагмент із переходами окремо, можна сказати,
що у даному конкретному випадку конструкція з таблицею переходів
(30 case'ів та їхні рандомні значення не з діапазону [1..30]) -
ця конструкція буде працювати разів у п'ять повільніше, ніж простий варіант перебору <cmp+jnz>.
Тут маємо 30 case'ів, - тому, щоб отримати переваги від застосування
табличного методу, треба мати більше, ніж 200 case'ів.

І тому у зразку коду зі стартового посту теми сміливо замінюємо використання макро case/switch
серією порівнянь <cmp+jnz>, й усе буде працювати гарно.
.

5

(22 відповідей, залишених у Системне програмування)

ReAl написав:

Питання в тому, заради чого це робити. Якщо єдина мета — не шукати файл макросів (який має бути доволі поширеним), то навряд чи варто витрачати час на нудну роботу.

Колись, кілька років тому, вже зтикався з отією ідеєю switch/case на asm'i,
й прийшов до висновку, що воно негоже. Зручностей добавляє обмаль,
та й сумнівних, до того ж повноцінно (як у Cі) все одно не вийде,
а на виході неоптимальний код та необхідність тягати усюди файл із макро.

ReAl написав:

[..] можна було при бажанні структуру switch/case/break/endswitch змусити генерувати таблицю переходів

Тоді інша справа. Але саморобні макро-реалізації завжди сумнівні.

На Сі, до речі, switch/case реалізується у результаті табличним методом,
тому там навпаки switch/case дуже сприяє ефективності коду.

Ну, то таке, філософія..

ReAl написав:

Проте хочу сказати, що «якість» має різні метрики, серед них легкість читання-супроводу коду конкретними людьми, а це вже починає залежати від смаків.

Табличний метод швидко працює, його швидкість мало залежить від значення аргументу, й таблицю легко модифікувати та розширювати. (Не далі як учора замінював в себе конструкцію з послідовністю <cmp+jnz> на таблицю й то дало моментальне полегшення у модифікації вибору переходу, там було біля десяти case'ів).
Це той випадок, коли з першого погляду більший обсяг роботи (по оформленню табличного методу) на ділі дає перевагу і у часі, і у зусиллях, і у швидкості виконання коду.
Проте, якщо у switch'і лише 3-5 case'ів, то краще не заморочуватись, тупо перебрати <cmp+jnz> для кожного.
Якщо ж case'ів більше, то табличний метод однозчно має переваги.

Проте це типу офтоп.

6

(22 відповідей, залишених у Системне програмування)

То так.
Замінюється нудною послідовністю:

    mov eax, [kbHook.vkCode]
;....
;.....
    cmp eax,  VK_F12
    jnz @@not_VK_F12
        stdcall WriteToFile, sF12
        jmp @@endsw
        @@not_VK_F12:
;.....
;.....
@@endsw:

Або зануритися у тему -> Отут <-.
Проте найкраще то зробити класичну jump_table, воно буде якісніше.

Згоден. Актуально.

8

(22 відповідей, залишених у Системне програмування)

sec2015 написав:

Хлопці а де можна знайти цей файл macro/SWITCH.inc, без нього програма не компілюється

) Пробував закоментувати увесь рядок?

;;include 'macro/SWITCH.inc'

9

(629 відповідей, залишених у Обговорення)

) Хай, олл.
Май нейм із dosprog.

Це мій перший пост, так би мовити, вітальний.
Треба ж було щось замастирити..
Ну ось і.

Натрапив на цей форум пошуком,
фаундед оця тема, сподобалася:
http://replace.org.ua/topic/4351/