Универсальный язык программирования

Тема в разделе "WASM.LANGS", создана пользователем Dmitriy1973, 9 окт 2026.

  1. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    907
    Dmitriy1973,

    Извините, но я это не понимаю. Блок кода в столбце это не компиляция, а самый последний ее шаг. Внешний вид это интерфейс, а не язык. jit-генерация похоже или нет.. такты это вовсе профайлер. Что то все запутанно слишком.

    ml64,

    п1-4 тут же асм академический!
     
    Последнее редактирование: 11 окт 2026 в 17:19
  2. Dmitriy1973

    Dmitriy1973 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2026
    Сообщения:
    5
    Согласен. Идея оригинальная (на сколько мне известно подобного нет) тяжело понять сразу. Поэтому я стараюсь объяснять потихоньку. В редакторе третьего столбца лежит только часть компилятора которая компилирует только одну команду. Поймите сначала механику третьего столбца, он проше.
    вот примерно это вам надо бы было вставить в редактор третьего столбца что бы сделать для себя команду x = 5 + 3

    .model small
    .stack 100h
    .data
    ; ---------- исходник на нашем языке ----------
    srcLine db 'x = 5 + 3', 0
    srcPtr dw 0 ; текущая позиция чтения
    ; ---------- буфер, куда генерируется код ----------
    codeBuf db 256 dup(?)
    codeLen dw 0
    numVal dw 0 ; распознанное число
    ; ---------- таблица символов ----------
    ; у нас одна переменная: x -> регистр BX
    varName db 'x'
    varReg db 1 ; 1 = BX
    exeName db 'MYPROG.EXE', 0
    handle dw 0
    errMsg db 'Oshibka kompilyacii!$'
    okMsg db 'MYPROG.EXE gotov!$'
    ; ---------- заголовок MZ ----------
    exeHdr db 4Dh,5Ah ; 'MZ'
    db ?,? ; байты последней страницы (заполним)
    db ?,? ; число страниц (заполним)
    db 0,0 ; релокации
    db 2,0 ; размер заголовка: 32 байта
    db 0,0 ; мин. доп. память
    db 0FFh,0FFh ; макс. доп. память
    db 0,0 ; SS
    db 0,1 ; SP
    db 0,0 ; контрольная сумма
    db 0,0 ; IP
    db 0,0 ; CS
    db 1Eh,0 ; таблица релокаций
    db 0,0 ; оверлей
    db 0,0,0,0,0,0 ; резерв
    .code
    start:
    mov ax, @data
    mov ds, ax
    ; ================= ПАРСИНГ выражения x = 5 + 3 =================
    ; --- токен 1: идентификатор (левая часть присваивания) ---
    call skipSpaces
    call getChar
    cmp al, varName ; поиск имени в таблице символов
    jne error
    inc srcPtr ; переменная найдена -> целевой регистр BX
    ; --- токен 2: знак '=' ---
    call skipSpaces
    call getChar
    cmp al, '='
    jne error
    inc srcPtr
    ; --- токен 3: первое число -> mov bx, N ---
    call skipSpaces
    call getNum
    mov ax, numVal
    call emitMovBX
    ; --- токен 4: знак '+' ---
    call skipSpaces
    call getChar
    cmp al, '+'
    jne error
    inc srcPtr
    ; --- токен 5: второе число -> add bx, N ---
    call skipSpaces
    call getNum
    mov ax, numVal
    call emitAddBX
    ; ================= ЭПИЛОГ: выход в DOS =================
    mov al, 0B4h ; mov ah,4Ch
    call emitByte
    mov al, 4Ch
    call emitByte
    mov al, 0B0h ; mov al,0
    call emitByte
    xor al, al
    call emitByte
    mov al, 0CDh ; int 21h
    call emitByte
    mov al, 21h
    call emitByte
    ; ================= ЗАПОЛНЕНИЕ ЗАГОЛОВКА MZ =================
    mov ax, 32
    add ax, codeLen ; весь файл = заголовок + код
    mov cx, ax
    and ax, 511 ; байты последней страницы = размер mod 512
    mov exeHdr+2, al
    mov exeHdr+3, ah
    mov ax, cx
    add ax, 511
    xor dx, dx
    mov bx, 512
    div bx ; страницы = (размер + 511) div 512
    mov exeHdr+4, al
    mov exeHdr+5, ah
    ; ================= ЗАПИСЬ EXE НА ДИСК =================
    mov ah, 3Ch ; создать файл
    xor cx, cx
    lea dx, exeName
    int 21h
    jc error
    mov handle, ax
    mov ah, 40h ; записать заголовок
    mov bx, handle
    mov cx, 32
    lea dx, exeHdr
    int 21h
    jc error
    mov ah, 40h ; записать сгенерированный код
    mov bx, handle
    mov cx, codeLen
    lea dx, codeBuf
    int 21h
    jc error
    mov ah, 3Eh ; закрыть файл
    mov bx, handle
    int 21h
    lea dx, okMsg
    mov ah, 09h
    int 21h
    jmp quit
    error:
    lea dx, errMsg
    mov ah, 09h
    int 21h
    quit:
    mov ax, 4C00h
    int 21h
    ; ================= ПОДПРОГРАММЫ =================
    ; --- прочитать текущий символ исходника в AL ---
    getChar proc
    mov si, srcPtr
    mov al, srcLine[si]
    ret
    getChar endp
    ; --- пропустить пробелы ---
    skipSpaces proc
    ss_loop:
    mov si, srcPtr
    cmp byte ptr srcLine[si], ' '
    jne ss_done
    inc srcPtr
    jmp ss_loop
    ss_done:
    ret
    skipSpaces endp
    ; --- распознать число, результат -> numVal ---
    getNum proc
    xor di, di
    gn_loop:
    call getChar
    cmp al, '0'
    jb gn_done
    cmp al, '9'
    ja gn_done
    mov bl, al
    sub bl, '0' ; символ -> цифра
    mov bh, 0
    mov ax, di
    mov dx, 10
    mul dx ; DI*10
    add ax, bx
    mov di, ax
    inc srcPtr
    jmp gn_loop
    gn_done:
    mov numVal, di
    ret
    getNum endp
    ; --- записать байт из AL в конец буфера кода ---
    emitByte proc
    это учебный фрагмент компилятора на ассемблере для этой команды.
     
  3. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    907
    Dmitriy1973

    Нужно учиться выражать свои мысли понятно, абстрактно. Применим робота для исследования ваших мыслей, иначе можно заблудиться.

    Код выше, тут есть тэг и кнопка для читаемого вида!

    - это компиляция одной команды(isa в частности) для одной архитектуры. Тоесть это перекодируемая строка, не выражение.

    Что такое третий уровень отображения(столбец) - сейчас компилятор(зачем видеть код компилера?), ранее имена(макросы). Кто компилирует компилятор :wacko:

     
  4. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    137
    УЯПа до сих пор нет (хотя идея вряд ли оригинальная).
    Остальное - есть.
    HEX_001[1].png
     
    Последнее редактирование: 11 окт 2026 в 20:12
    Ahimov нравится это.
  5. Dmitriy1973

    Dmitriy1973 New Member

    Публикаций:
    0
    Регистрация:
    11 мар 2026
    Сообщения:
    5
    Ahimov, извините что не получается свои мысли, я стараюсь.
    редактор третьего столбца — это мини-программа для сборщика. Выглядит он как таблица. В первой колонке Команда (Trigger): program (чтоб как то ее найти). Во второй колонке Шаблон кода (Template):B4 3C B9 00 00 BA 0F 00 CD 21 72 03 A3 00 02 (это как пример потому что эта таблица доступна для редактирования тому кто будет писать на этом языке). После того как в редакторе будут закончены вск действия Вы в третьей столбце пишите program filename и после нажатие ENTER программа ищет первый пробел в команде и начинает искать команду в редакторе третьего столбца. Найдя ее он записывает в переменную по адресу 000F. Это адрес операнда команды. в конкретном примере это адрес слова filename. BA 0F 00 я знаю это не совсем правильно надо было с адреса [000F] брать. и потом передаст управление где лежит первый код B4 3C через CALL поэтому в конце должен обязательно стоять ret.
     
  6. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    907
    Dmitriy1973,

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

    Обычно я так никогда не делаю, а разбираюсь сам. В данном случае ручной разбор слишком сложен.
     

    Вложения:

  7. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.210
    Адрес:
    подполье
    Добавлять четвертый столбец с изменяющимся видом для эльфов можно. Возможности как в hiew.
    Джва года ждал.
    --- Сообщение объединено, 12 окт 2026 в 08:23 ---
    Законпелял, короч, 'привет,мир' в одну строку, перешел на ассемблер, все регистры в шахматном порядке попереставлял, возвращаешься в высокоуровневый код, а там домики деревянные набигают. Можно декомпелировать сплоеты.
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.449
    Не туда воюешь, нужна гуишка для инде-визора, чтобы аверам тысячи семплов гонять, а не это всё...
     
  9. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.234
    1. Имхо прогресс движется в сторону большей отчужденности разработчика от всей этой низкоуровневой мишуры. Каковая интересна (была) только реверсёрам (года до 2022 примерно).
    2. Подводные камни выглядят вот так:
    изображение_2026-10-12_213751691.png
    (определив правильно прототип декомпилер решил, что ну ее нахрен эту директиву return, а абсолютный адрес стал отрицательным смещением потому что почему бы нет)
    3. Не уловил в чем связь между проектированием железа и программированием.
    4. Лет 20 назад наверное было бы интересным инструментом для заимствования чужого кода без разрешения автора. Сегодня васян с дипломом поварского пту загрузит бинарь в чатгпт и попросит реализовать что-то наподобие.
     
    Rel и Ahimov нравится это.
  10. ml64

    ml64 Active Member

    Публикаций:
    0
    Регистрация:
    29 окт 2017
    Сообщения:
    137
    А его сосед по общаге - студент 1 курса шифровального училища - зайдёт на гитхаб.
    --- Сообщение объединено, 13 окт 2026 в 23:51 ---
    Ну как бы нет.
    Десктопный софт - да, окуклился. Там всё давно написано, поэтому остаётся только #embed.
    А промка - нет. Там всё цветёт и пахнет.
    ...Сейчас у детей Ардуино и Распберри - это мастхэв, и это вселяет уверенность.
     
    Последнее редактирование: 14 окт 2026 в 00:09
  11. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.062
    Надо всегда делать RegisterClass в виде отдельной функции, тогда хеллворды на WinApi будут не такими мерзкими.
    Код (C):
    1. static void RegisterMainClass(void)
    2. {
    3.     WNDCLASSEX wc;
    4.     memset(&wc, 0, sizeof(wc));
    5.     wc.cbSize        = sizeof(wc);
    6.     wc.style         = CS_HREDRAW | CS_VREDRAW;
    7.     wc.lpfnWndProc   = MainWndProc;
    8.     wc.hInstance     = g_hInst;
    9.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    10.     wc.lpszClassName = "MainClass";
    11.     RegisterClassEx(&wc);
    12. }
    13.  
    14. ...
    15.  
    16. RegisterMainClass();
    17. CreateWindow();
    18. GetMessage();
    _____

    2026-10-14_14-03-23.png
    Код (C):
    1. #include <windows.h>
    2. #include <commctrl.h>
    3. #include <stdio.h>
    4. #include <stdlib.h>
    5. #include <string.h>
    6.  
    7. /* ---------------------------------------------------------------- */
    8. /*  Константы                                                       */
    9. /* ---------------------------------------------------------------- */
    10. #define BOTTOM_BAR     30
    11. #define GUTTER_WIDTH   44
    12.  
    13. #define BTN_NEW_ID     1001
    14. #define BTN_CLOSE_ID   1002
    15.  
    16. #ifndef TCM_FIRST
    17. #define TCM_FIRST      0x1300
    18. #endif
    19. #ifndef TCM_GETCURSEL
    20. #define TCM_GETCURSEL  (TCM_FIRST + 11)
    21. #endif
    22. #ifndef TCM_SETCURSEL
    23. #define TCM_SETCURSEL  (TCM_FIRST + 12)
    24. #endif
    25. #ifndef TCM_ADJUSTRECT
    26. #define TCM_ADJUSTRECT (TCM_FIRST + 40)
    27. #endif
    28.  
    29. /* ---------------------------------------------------------------- */
    30. /*  Типы                                                            */
    31. /* ---------------------------------------------------------------- */
    32. typedef struct {
    33.     HWND LineWnd;
    34.     HWND EditWnd;
    35.     int  LastLines;
    36.     int  LastTop;
    37. } TTab;
    38.  
    39. /* ---------------------------------------------------------------- */
    40. /*  Глобальные переменные                                           */
    41. /* ---------------------------------------------------------------- */
    42. static HWND  g_MainWnd    = NULL;
    43. static HWND  g_Notebook   = NULL;
    44. static TTab *g_Tabs       = NULL;
    45. static int   g_TabsCount  = 0;
    46. static int   g_TabsCap    = 0;
    47. static int   g_CurrentTab = -1;
    48. static HINSTANCE g_hInst  = NULL;
    49.  
    50. /* ---------------------------------------------------------------- */
    51. /*  Утилиты                                                         */
    52. /* ---------------------------------------------------------------- */
    53. static RECT TabClientRect(void)
    54. {
    55.     RECT r;
    56.     GetClientRect(g_Notebook, &r);
    57.     SendMessage(g_Notebook, TCM_ADJUSTRECT, 0, (LPARAM)&r);
    58.     return r;
    59. }
    60.  
    61. /* ---------------------------------------------------------------- */
    62. /*  Разметка                                                        */
    63. /* ---------------------------------------------------------------- */
    64. static void Layout(void)
    65. {
    66.     RECT R, T;
    67.     int i;
    68.  
    69.     if (!g_MainWnd || !g_Notebook) return;
    70.  
    71.     GetClientRect(g_MainWnd, &R);
    72.     MoveWindow(g_Notebook, 0, 0, R.right, R.bottom - BOTTOM_BAR, TRUE);
    73.  
    74.     T = TabClientRect();
    75.     for (i = 0; i < g_TabsCount; i++)
    76.     {
    77.         MoveWindow(g_Tabs[i].LineWnd,
    78.                    T.left, T.top,
    79.                    GUTTER_WIDTH, T.bottom - T.top, TRUE);
    80.         MoveWindow(g_Tabs[i].EditWnd,
    81.                    T.left + GUTTER_WIDTH + 2, T.top,
    82.                    (T.right - T.left) - GUTTER_WIDTH - 4,
    83.                    T.bottom - T.top, TRUE);
    84.     }
    85.  
    86.     MoveWindow(GetDlgItem(g_MainWnd, BTN_NEW_ID),
    87.                R.right - 180, R.bottom - 25, 80, 22, TRUE);
    88.     MoveWindow(GetDlgItem(g_MainWnd, BTN_CLOSE_ID),
    89.                R.right - 90,  R.bottom - 25, 80, 22, TRUE);
    90. }
    91.  
    92. /* ---------------------------------------------------------------- */
    93. /*  Отрисовка номеров строк                                         */
    94. /* ---------------------------------------------------------------- */
    95. static void UpdateGutter(int Idx)
    96. {
    97.     TTab *t;
    98.     char *buf;
    99.     int   LineCount, SavedLine, i;
    100.     int   pos, need;
    101.  
    102.     if (Idx < 0 || Idx >= g_TabsCount) return;
    103.     t = &g_Tabs[Idx];
    104.     if (!t->EditWnd || !t->LineWnd) return;
    105.  
    106.     LineCount = (int)SendMessage(t->EditWnd, EM_GETLINECOUNT, 0, 0);
    107.     SavedLine = (int)SendMessage(t->EditWnd, EM_GETFIRSTVISIBLELINE, 0, 0);
    108.  
    109.     if (LineCount == t->LastLines)
    110.     {
    111.         if (SavedLine != t->LastTop)
    112.         {
    113.             SendMessage(t->LineWnd, EM_LINESCROLL, 0, SavedLine);
    114.             t->LastTop = SavedLine;
    115.         }
    116.         return;
    117.     }
    118.  
    119.     need = LineCount * 12 + 2;
    120.     buf  = (char *)malloc(need);
    121.     if (!buf) return;
    122.  
    123.     pos = 0;
    124.     for (i = 1; i <= LineCount; i++)
    125.     {
    126.         int n = sprintf(buf + pos, "%d", i);
    127.         pos += n;
    128.         if (i < LineCount)
    129.         {
    130.             buf[pos++] = '\r';
    131.             buf[pos++] = '\n';
    132.         }
    133.     }
    134.     buf[pos] = '\0';
    135.  
    136.     SetWindowText(t->LineWnd, buf);
    137.     SendMessage(t->LineWnd, EM_LINESCROLL, 0, SavedLine);
    138.  
    139.     free(buf);
    140.  
    141.     t->LastLines = LineCount;
    142.     t->LastTop   = SavedLine;
    143. }
    144.  
    145. /* ---------------------------------------------------------------- */
    146. /*  Работа с вкладками                                              */
    147. /* ---------------------------------------------------------------- */
    148. static void ShowTab(int Idx);
    149. static void CreateTab(void);
    150.  
    151. static void ShowTab(int Idx)
    152. {
    153.     int i;
    154.     if (Idx < 0 || Idx >= g_TabsCount) return;
    155.  
    156.     for (i = 0; i < g_TabsCount; i++)
    157.     {
    158.         ShowWindow(g_Tabs[i].LineWnd, SW_HIDE);
    159.         ShowWindow(g_Tabs[i].EditWnd, SW_HIDE);
    160.     }
    161.  
    162.     ShowWindow(g_Tabs[Idx].LineWnd, SW_SHOW);
    163.     ShowWindow(g_Tabs[Idx].EditWnd, SW_SHOW);
    164.  
    165.     g_CurrentTab = Idx;
    166.     SendMessage(g_Notebook, TCM_SETCURSEL, (WPARAM)Idx, 0);
    167.     SetFocus(g_Tabs[Idx].EditWnd);
    168.  
    169.     g_Tabs[Idx].LastLines = -1;
    170.     UpdateGutter(Idx);
    171. }
    172.  
    173. static void CreateTab(void)
    174. {
    175.     int Idx;
    176.     TCITEM Item;
    177.     char   text[64];
    178.     char   unique[128];
    179.  
    180.     if (g_TabsCount == g_TabsCap)
    181.     {
    182.         int newCap = (g_TabsCap == 0) ? 4 : g_TabsCap * 2;
    183.         TTab *p = (TTab *)realloc(g_Tabs, newCap * sizeof(TTab));
    184.         if (!p) return;
    185.         g_Tabs    = p;
    186.         g_TabsCap = newCap;
    187.     }
    188.  
    189.     Idx = g_TabsCount++;
    190.     memset(&g_Tabs[Idx], 0, sizeof(TTab));
    191.  
    192.     g_Tabs[Idx].LineWnd = CreateWindowEx(0, "EDIT", NULL,
    193.         WS_CHILD | ES_MULTILINE | ES_READONLY | ES_NOHIDESEL,
    194.         0, 0, 0, 0, g_Notebook, (HMENU)0, g_hInst, NULL);
    195.  
    196.     g_Tabs[Idx].EditWnd = CreateWindowEx(0, "EDIT", NULL,
    197.         WS_CHILD | WS_VSCROLL | ES_MULTILINE | ES_NOHIDESEL | WS_TABSTOP,
    198.         0, 0, 0, 0, g_Notebook, (HMENU)0, g_hInst, NULL);
    199.  
    200.     SendMessage(g_Tabs[Idx].EditWnd, WM_SETFONT,
    201.                 (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
    202.     SendMessage(g_Tabs[Idx].LineWnd, WM_SETFONT,
    203.                 (WPARAM)GetStockObject(DEFAULT_GUI_FONT), 0);
    204.  
    205.     sprintf(unique, "Tab %d\r\nUnique content", Idx + 1);
    206.     SetWindowText(g_Tabs[Idx].EditWnd, unique);
    207.  
    208.     sprintf(text, "Tab %d", Idx + 1);
    209.     memset(&Item, 0, sizeof(Item));
    210.     Item.mask    = TCIF_TEXT;
    211.     Item.pszText = text;
    212.     SendMessage(g_Notebook, TCM_INSERTITEM, (WPARAM)Idx, (LPARAM)&Item);
    213.  
    214.     g_Tabs[Idx].LastLines = -1;
    215.     g_Tabs[Idx].LastTop   = -1;
    216.  
    217.     Layout();
    218.     UpdateGutter(Idx);
    219. }
    220.  
    221. static void CloseTab(int Idx)
    222. {
    223.     int i;
    224.     if (Idx < 0 || Idx >= g_TabsCount) return;
    225.  
    226.     if (g_TabsCount == 1)
    227.     {
    228.         SetWindowText(g_Tabs[0].EditWnd, "");
    229.         g_Tabs[0].LastLines = -1;
    230.         UpdateGutter(0);
    231.         return;
    232.     }
    233.  
    234.     DestroyWindow(g_Tabs[Idx].LineWnd);
    235.     DestroyWindow(g_Tabs[Idx].EditWnd);
    236.  
    237.     for (i = Idx; i < g_TabsCount - 1; i++)
    238.         g_Tabs[i] = g_Tabs[i + 1];
    239.  
    240.     g_TabsCount--;
    241.     SendMessage(g_Notebook, TCM_DELETEITEM, (WPARAM)Idx, 0);
    242.  
    243.     if (Idx >= g_TabsCount)
    244.         ShowTab(g_TabsCount - 1);
    245.     else
    246.         ShowTab(Idx);
    247. }
    248.  
    249. /* ---------------------------------------------------------------- */
    250. /*  Синхронизация прокрутки                                         */
    251. /* ---------------------------------------------------------------- */
    252. static void SyncScroll(int Idx)
    253. {
    254.     SCROLLINFO si;
    255.     if (Idx < 0 || Idx >= g_TabsCount) return;
    256.  
    257.     memset(&si, 0, sizeof(si));
    258.     si.cbSize = sizeof(si);
    259.     si.fMask  = SIF_POS | SIF_RANGE | SIF_PAGE;
    260.     GetScrollInfo(g_Tabs[Idx].EditWnd, SB_VERT, &si);
    261.     SetScrollInfo(g_Tabs[Idx].LineWnd, SB_VERT, &si, TRUE);
    262.     SendMessage(g_Tabs[Idx].LineWnd, WM_VSCROLL,
    263.                 SB_THUMBPOSITION + ((si.nPos & 0xFFFF) << 16), 0);
    264. }
    265.  
    266. /* ---------------------------------------------------------------- */
    267. /*  Оконная процедура                                               */
    268. /* ---------------------------------------------------------------- */
    269. static LRESULT CALLBACK MainWndProc(HWND hWnd, UINT Msg,
    270.                                     WPARAM wParam, LPARAM lParam)
    271. {
    272.     switch (Msg)
    273.     {
    274.     case WM_CREATE:
    275.     {
    276.         RECT R;
    277.         g_MainWnd = hWnd;
    278.         GetClientRect(hWnd, &R);
    279.  
    280.         g_Notebook = CreateWindowEx(0, WC_TABCONTROL, NULL,
    281.             WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN,
    282.             0, 0, R.right, R.bottom - BOTTOM_BAR,
    283.             hWnd, (HMENU)0, g_hInst, NULL);
    284.  
    285.         CreateTab();
    286.         ShowTab(0);
    287.  
    288.         CreateWindowEx(0, "BUTTON", "New", WS_CHILD | WS_VISIBLE,
    289.             R.right - 180, R.bottom - 25, 80, 22,
    290.             hWnd, (HMENU)BTN_NEW_ID, g_hInst, NULL);
    291.  
    292.         CreateWindowEx(0, "BUTTON", "Close", WS_CHILD | WS_VISIBLE,
    293.             R.right - 90, R.bottom - 25, 80, 22,
    294.             hWnd, (HMENU)BTN_CLOSE_ID, g_hInst, NULL);
    295.         return 0;
    296.     }
    297.  
    298.     case WM_SIZE:
    299.         Layout();
    300.         return 0;
    301.  
    302.     case WM_COMMAND:
    303.         switch (LOWORD(wParam))
    304.         {
    305.         case BTN_NEW_ID:
    306.             CreateTab();
    307.             ShowTab(g_TabsCount - 1);
    308.             return 0;
    309.         case BTN_CLOSE_ID:
    310.             CloseTab(g_CurrentTab);
    311.             return 0;
    312.         }
    313.         break;
    314.  
    315.     case WM_NOTIFY:
    316.     {
    317.         NMHDR *N = (NMHDR *)lParam;
    318.         if (N->code == TCN_SELCHANGE && N->hwndFrom == g_Notebook)
    319.         {
    320.             int NewIdx = (int)SendMessage(g_Notebook, TCM_GETCURSEL, 0, 0);
    321.             if (NewIdx != g_CurrentTab) ShowTab(NewIdx);
    322.             return 0;
    323.         }
    324.         else if (g_CurrentTab >= 0 &&
    325.                  N->hwndFrom == g_Tabs[g_CurrentTab].EditWnd)
    326.         {
    327.             if (N->code == EN_CHANGE)
    328.                 UpdateGutter(g_CurrentTab);
    329.             else if (N->code == EN_VSCROLL)
    330.                 SyncScroll(g_CurrentTab);
    331.             return 0;
    332.         }
    333.         break;
    334.     }
    335.  
    336.     case WM_DESTROY:
    337.         PostQuitMessage(0);
    338.         return 0;
    339.     }
    340.  
    341.     return DefWindowProc(hWnd, Msg, wParam, lParam);
    342. }
    343.  
    344. /* ---------------------------------------------------------------- */
    345. /*  Регистрация класса / инициализация                              */
    346. /* ---------------------------------------------------------------- */
    347. static void RegisterMainClass(void)
    348. {
    349.     WNDCLASSEX wc;
    350.     memset(&wc, 0, sizeof(wc));
    351.     wc.cbSize        = sizeof(wc);
    352.     wc.style         = CS_HREDRAW | CS_VREDRAW;
    353.     wc.lpfnWndProc   = MainWndProc;
    354.     wc.hInstance     = g_hInst;
    355.     wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    356.     wc.lpszClassName = "MainClass";
    357.     RegisterClassEx(&wc);
    358. }
    359.  
    360. static void InitCC(void)
    361. {
    362.     INITCOMMONCONTROLSEX icc;
    363.     icc.dwSize = sizeof(icc);
    364.     icc.dwICC  = ICC_TAB_CLASSES;
    365.     InitCommonControlsEx(&icc);
    366. }
    367.  
    368. /* ---------------------------------------------------------------- */
    369. /*  Точка входа                                                      */
    370. /* ---------------------------------------------------------------- */
    371. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    372.                    LPSTR lpCmdLine, int nCmdShow)
    373. {
    374.     MSG Msg;
    375.     (void)hPrevInstance;
    376.     (void)lpCmdLine;
    377.     (void)nCmdShow;
    378.  
    379.     g_hInst = hInstance;
    380.  
    381.     InitCC();
    382.     RegisterMainClass();
    383.  
    384.     g_MainWnd = CreateWindowEx(0, "MainClass", "IDE",
    385.         WS_OVERLAPPEDWINDOW | WS_VISIBLE,
    386.         200, 100, 800, 500,
    387.         NULL, NULL, g_hInst, NULL);
    388.  
    389.     if (!g_MainWnd) return 0;
    390.  
    391.     while (GetMessage(&Msg, NULL, 0, 0) > 0)
    392.     {
    393.         TranslateMessage(&Msg);
    394.         DispatchMessage(&Msg);
    395.     }
    396.  
    397. }
     

    Вложения:

    • _Tabs.rar
      Размер файла:
      21,3 КБ
      Просмотров:
      6
  12. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    907
    Application,

    Это же богомерзкий паскаль/ дельф!
     
  13. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.234
    То, что мужик пишет грандиозную вундервафлю, а ему дают советы как контрол в окошке нарисовать, не смутило? Васм, который мы заслужили.
     
  14. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    907
    f13nd,

    Не смутило, школа учит дельфи, это нормально.
     
  15. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.234
    Не знаю про какую промку речь. Открываю мануал по микроконтроллеру не 40-летней давности и вижу вот это:
    изображение_2026-10-14_154138160.png
    Вместо системы команд флеш-контроллера и блок-схем процедур стирания и записи, руководствуясь которыми можно было раньше реализовать всё самому, просто некая self-programming library, которую просто заинклудь в проект и вызови вот эту функцию.
     
  16. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.062
    Это распространенная задача для гуишек, напиши сразу на ассемблере, еще не видел для нее готового кода на васме.
     
  17. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    907
    Application,

    Зачем нужно окна писать на асм ?
     
  18. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.062
    Чтобы тысячи семплов гонять.
     
  19. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    907
    Application,

    Там он нужен, так как идет поток машинных инструкций/операций и переключение между задачами ручное, на подобие нитей. Окна это штатный вызов интерфейсов, там асм - только в дизасме может быть чужого приложения. Собирать их на асм может быть нужно исключительно в академических целях.
     
  20. Application

    Application Moderator Команда форума

    Публикаций:
    1
    Регистрация:
    8 дек 2007
    Сообщения:
    1.062
    Предполагаю, что весь этот цирк с кучей ошибок декодирования и других проблем, падает через раз, из-за этого не выкладывается.