.::. Typucm .::. » 05 ноя 2025, 22:27
Посмотрел о чём речь. При Sbasic есть код компилятора и его оболочки. Ради интереса запросил анализ у глубины. Вопрос, он прав или он всё переврал?
Развернуть: что ответил deepseek1. Прямая генерация машинного кода
Подпрограмма вывода байта (11000-11006):
basic
11000 REM *** Byte ausgeben ***
11001 PC!=PC!+1
11002 IF PASS=0 THEN RETURN
11003 POKE EXEADR!,AUS ; Запись байта в память
11004 EXEADR!=EXEADR!+1 ; Увеличение указателя
11006 RETURN
Подпрограмма вывода слова (11040-11046):
basic
11040 REM *** Wort ausgeben ***
11041 PC!=PC!+2
11042 IF PASS=0 THEN RETURN
11043 AUS1=FNHI(WORT):AUS=WORT-256*AUS1 ; Разделение на старший/младший байт
11044 GOSUB 11003 ; Вывод младшего байта
11045 AUS=AUS1
11046 GOTO 11003 ; Вывод старшего байта
Работа с сегментами памяти:
basic
129 DEF SEG=SEGADR!+30!:BLOAD PATH$+"PRE",14407! ; Загрузка препроцессора
131 GOSUB 13500:DEF SEG=SEGADR!:BUFADR!=80! ; Установка сегмента данных
148 DEF SEG=SEGADR!:EXEADR!=448 ; Сегмент для выходного файла
2. Генерация конкретных инструкций x86
MOV инструкции:
basic
1010 AUS=&HB8:GOSUB 11000 ; MOV AX, immediate
1011 GOSUB 11040 ; Значение для MOV
PUSH/POP инструкции:
basic
11085 AUS=&H50:GOTO 11003 ; PUSH AX
1169 AUS=&HC3:GOSUB 11000 ; RET (возврат из подпрограммы)
1517 AUS=&H53:GOSUB 11000 ; PUSH BX
CALL инструкции:
basic
11207 AUS=&HE8:GOSUB 11000 ; CALL relative
11208 X!=UPADR(UP)-RC!-PC!-2 ; Вычисление относительного смещения
JMP инструкции:
basic
1157 AUS=&HE9:GOSUB 11000 ; JMP relative
1159 GOSUB 12000 ; Расчет адреса перехода
Арифметические операции:
basic
1176 WORT=&HC031:GOSUB 11040 ; XOR AX,AX
1177 WORT=&H5050:GOSUB 11040 ; PUSH AX, PUSH AX
1228 WORT=&H8058:GOSUB 11040 ; POP AX, ADD [BX+SI],AL
3. Структура EXE-файла (строки 149-163)
Заголовок EXE:
basic
149 REM *** EXE-Header schreiben ***
150 WORT=&H5A4D:GOSUB 11043 ; Сигнатура "MZ"
151 WORT=FNI(32+RC!+PC!) AND 511:GOSUB 11043 ; Размер по модулю 512
152 WORT=INT((32+RC!+PC!+511)/512):GOSUB 11043 ; Количество страниц
153 WORT=0:GOSUB 11043 ; Количество элементов в таблице релокаций
154 WORT=2:GOSUB 11043 ; Размер заголовка в параграфах
155 WORT=FNI(256+INT((VC!+15)/16)+SC):GOSUB 11043 ; Минимальная память
157 WORT=FNI(INT((RC!+PC!+15)/16)):GOSUB 11043 ; Смещение сегмента кода
Сегментная адресация:
basic
1007 WORT=FNI(INT((PC!+RC!+15)/16)+256) ; Расчет сегментного адреса
1013 WORT=FNI(INT((VC!+15)/16)+SC):GOSUB 11040 ; Сегмент данных
Релокация кода:
basic
12000 REM *** Relative Adresse schreiben ***
12001 X!=FNR!(WORT)-PC!-2 ; Расчет относительного смещения
12002 IF X!<-32767 THEN X!=X!+65536! ; Коррекция для отрицательных значений
12003 WORT=FNI(X!) ; Преобразование в беззнаковое
12004 GOTO 11040 ; Запись относительного адреса
«Не стесняйтесь думать. Неэффективно пытаться помочь людям, которые не желают помогать себе сами. Нормально чего-то не знать, прикидываться идиотом — нет.» (Слава С.ПО.)