С Новым годом! Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361

Выбор компилятора для 16 и 32

06.10.2012, 18:33. Показов 2078. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
.386p                                           ; разрешить привилегированные инструкции i386
        
; СЕГМЕНТ КОДА (для Real Mode)
; ---------------------------------------------------------------------------------------------------------
RM_CODE     segment     para public 'CODE' use16
        assume      CS:RM_CODE,SS:RM_STACK
@@start:
; очистка экрана:
                mov             AX,3
                int             10h
                
; открываем линию А20 (для 32-х битной адресации):
        in      AL,92h
        or      AL,2
        out     92h,AL
 
; вычисляем линейный адрес метки ENTRY_POINT (точка входа в защищенный режим):
        xor     EAX,EAX             ; обнуляем регистра EAX
        mov     AX,PM_CODE          ; AX = номер сегмента PM_CODE
        shl     EAX,4               ; EAX = линейный адрес PM_CODE
        add     EAX,offset ENTRY_POINT      ; EAX = линейный адрес ENTRY_POINT
        mov     dword ptr ENTRY_OFF,EAX     ; сохраняем его в переменной     
; (кстати, подобный "трюк" называется SMC или Self Modyfing Code - самомодифицирующийся код)
 
; теперь надо вычислить линейный адрес GDT (для загрузки регистра GDTR):
        xor     EAX,EAX
        mov     AX,RM_CODE          ; AX = номер сегмента RM_CODE
        shl     EAX,4               ; EAX = линейный адрес RM_CODE
        add     AX,offset GDT           ; теперь EAX = линейный адрес GDT
 
; линейный адрес GDT кладем в заранее подготовленную переменную:
        mov     dword ptr GDTR+2,EAX
; а подобный трюк назвать SMC уже нельзя, потому как по сути мы модифицируем данные :)
 
; собственно, загрузка регистра GDTR:
        lgdt        fword ptr GDTR
 
; запрет маскируемых прерываний:
        cli
 
; запрет немаскируемых прерываний:
        in      AL,70h
        or      AL,80h
        out     70h,AL
 
; переключение в защищенный режим:
        mov     EAX,CR0
        or      AL,1
        mov     CR0,EAX
 
; загрузить новый селектор в регистр CS
        db      66h             ; префикс изменения разрядности операнда
        db      0EAh                ; опкод команды JMP FAR
ENTRY_OFF   dd      ?               ; 32-битное смещение
        dw      00001000b           ; селектор первого дескриптора (CODE_descr)
 
; ТАБЛИЦА ГЛОБАЛЬНЫХ ДЕСКРИПТОРОВ:
GDT:  
; нулевой дескриптор (обязательно должен присутствовать в GDT!):
NULL_descr  db      8 dup(0)
CODE_descr  db      0FFh,0FFh,00h,00h,00h,10011010b,11001111b,00h
DATA_descr  db      0FFh,0FFh,00h,00h,00h,10010010b,11001111b,00h
VIDEO_descr      db              0FFh,0FFh,00h,80h,0Bh,10010010b,01000000b,00h
GDT_size    equ                 $-GDT               ; размер GDT
 
GDTR        dw      GDT_size-1          ; 16-битный лимит GDT
        dd      ?               ; здесь будет 32-битный линейный адрес GDT
RM_CODE         ends
; ---------------------------------------------------------------------------------------------------------
 
 
 
; СЕГМЕНТ СТЕКА (для Real Mode)
; ---------------------------------------------------------------------------------------------------------
RM_STACK       segment          para stack 'STACK' use16
           db          100h dup(?)                     ; 256 байт под стек - это даже много
RM_STACK       ends
; --------------------------------------------------------------------------------------------------------- 
 
 
 
; СЕГМЕНТ КОДА (для Protected Mode)
; ---------------------------------------------------------------------------------------------------------
PM_CODE     segment     para public 'CODE' use32
        assume      CS:PM_CODE,DS:PM_DATA
ENTRY_POINT:
; загрузим сегментные регистры селекторами на соответствующие дескрипторы:
                mov        AX,00010000b                ; селектор на второй дескриптор (DATA_descr)
            mov        DS,AX                       ; в DS его
            mov        AX,00011000b                ; селектор на третий дескриптор (VIDEO_descr)
            mov        ES,AX                       ; а этого в ES
 
            xor            SI,SI                       ; обнуляем SI
            mov            SI,PM_DATA                  ; SI = номер сегмента PM_DATA
            shl            ESI,4                       ; ESI = линейный адрес сегмента PM_DATA
            add        ESI,offset message          ; ESI = линейный адрес строки message
                xor            EDI,EDI                     ; EDI = позиция на экране (относительно 0B8000h)
            mov        ECX,mes_len                 ; длина текста в ECX
 
; вывод на экран: 
            rep            movsb                       ; DS:ESI (наше сообщение) -> ES:EDI (видеопамять)
            jmp            $                           ; погружаемся в вечный цикл
PM_CODE         ends
; ---------------------------------------------------------------------------------------------------------
 
; СЕГМЕНТ ДАННЫХ (для Protected Mode)
; ---------------------------------------------------------------------------------------------------------
PM_DATA         segment        para public 'DATA' use32
        assume         CS:PM_DATA                 
        
; сообщение, которое мы будем выводить на экран (оформим его в виде блока повторений irpc):
message:
irpc            mes,           
                db             '&mes&',0Dh
endm
mes_len         equ            $-message           ; длина в байтах
PM_DATA         ends
; ---------------------------------------------------------------------------------------------------------  
 
                end         @@start
 
; ------------------------CUT HERE----------------------
Дело в том что в программе присутствуют команды и прерывания которые пойдут в 16-разрядном компиляторе ,а есть и регистры 32-разрядные которые пойдут в 32-разрядном компиляторе. Так какой мне компилятор подойдет или нужен какой то другой? Код программы взял из wasm.ru в статье про защищенный режим.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.10.2012, 18:33
Ответы с готовыми решениями:

Выбор редактора + компилятора для C++
Здравствуйте! Посмотрел темы про редакторы - нужного не нашел. Нужен какой-нибудь нормальный редактор с интегрированным...

Выбор компилятора для приведенного кода
Добрый день! Возможно тема уже заезжена, но вопрос такой {$M $1000,0,0} Program Scan_code; Uses Crt,Dos; Var OldKey:...

Выбор компилятора для Windows XP SP3
У меня стоит windows XP SP3. Как сделать, чтобы работал С(СИ)? Какой нужен компилятор?

10
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
06.10.2012, 19:17
вопрос не совсем понятен
в той же статье написано чем и как собирать
0
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
06.10.2012, 19:42  [ТС]
Цитата Сообщение от Vort_ Посмотреть сообщение
вопрос не совсем понятен
в той же статье написано чем и как собирать
Команду cli можно выполнить только в 16-разрядном компиляторе ,но в этом компиляторе 16-разрядном нет 32-разрядные регистров(EAX) которые используются в данном примере. То есть их нет в 16 разрядном компиляторе ,но они есть в 32-разрядном. Так как быть в этом безвыходном положении?
0
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
06.10.2012, 20:26
указанные в статье компиляторы умеют делать как 16битный код, так и 32х битный
какой именно будет генерироваться указано при определении сегмента - use16 или use32
---
что касается линковки, то тут ситуация отличается
код предназначен для запуска под DOS, поэтому нужен соответствующий формат исполняемого файла
для MASM32 подошла вот такая команда линковки: LINK16 PM.obj,,NUL,,,
первый же попавшийся в сети TLINK сделал файл точно по команде из статьи: TLINK /x /3 PM.obj
---
по запуску exe выявилась проблема - на экране пусто
опытным путём выяснил что дело в директиве irpc
(ранее не имел с ней дело, по коду понять как она должна применяться не смог. возможно исходный код повреждён)
выпилил её к чёрту - уже кракозяблики на экране - есть прогресс =)
---
что касается команды cli (опкод FA) - она может применяться и в 16ти битном и в 32хбитном коде. это 100%
1
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
06.10.2012, 23:40  [ТС]
Да все же я думал проблема в компиляторе ,а как оказалась в отладчике. Данная программа запускается под 16-битный отладчик ,а дело в том что в программе есть регистр eax 32-битный ,но отладчик 16-битный как мне тогда посмотреть регистр eax через что или может другой специальный отладчик есть? Или есть другой выход?
0
Maniac
Эксперт С++
 Аватар для ISergey
1464 / 965 / 160
Регистрация: 02.01.2009
Сообщений: 2,820
Записей в блоге: 1
07.10.2012, 02:53

Не по теме:

Команду cli можно выполнить только в 16-разрядном компиляторе ,но в этом компиляторе 16-разрядном нет 32-разрядные регистров(EAX) которые используются в данном примере. То есть их нет в 16 разрядном компиляторе ,но они есть в 32-разрядном. Так как быть в этом безвыходном положении?
Эта команда как-бы "Привилегированная" (в третьем кольце ее нельзя вызывать. )



Цитата Сообщение от ElvenDragon Посмотреть сообщение
Да все же я думал проблема в компиляторе
Ну эт врятли)

Цитата Сообщение от ElvenDragon Посмотреть сообщение
Данная программа запускается под 16-битный отладчик ,а дело в том что в программе есть регистр eax 32-битный ,но отладчик 16-битный как мне тогда посмотреть регистр eax через что или может другой специальный отладчик есть? Или есть другой выход?
WinDbg (но такой код проблемно отлаживать.. )
1
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
07.10.2012, 10:29
в этом и основная заморочка написания "своей ОС" и тому подобного - многое приходится отлаживать вслепую - чуть ли не выводить биты писком динамика :-D
0
 Аватар для ElvenDragon
3 / 8 / 1
Регистрация: 12.07.2009
Сообщений: 361
07.10.2012, 11:05  [ТС]
Цитата Сообщение от Vort_ Посмотреть сообщение
в этом и основная заморочка написания "своей ОС" и тому подобного - многое приходится отлаживать вслепую - чуть ли не выводить биты писком динамика :-D
А это идея воспользуюсь MessageBox чтоб выводить участки до которых добраться не могу))

Добавлено через 12 минут
Было бы вообще неплохо если бы еще код был бы рабочим ,а то и так всё вслепую и ошибку вслепую ищи.
0
 Аватар для Goodwin98
2537 / 833 / 10
Регистрация: 31.05.2009
Сообщений: 1,668
07.10.2012, 17:54
Цитата Сообщение от Vort_ Посмотреть сообщение
в этом и основная заморочка написания "своей ОС" и тому подобного - многое приходится отлаживать вслепую - чуть ли не выводить биты писком динамика :-D
А я, помню, пользовал отладчик, встроенный в виртуальную машину Bosch... Для первой поры нормально.

Добавлено через 1 минуту
Цитата Сообщение от ElvenDragon Посмотреть сообщение
Да все же я думал проблема в компиляторе ,а как оказалась в отладчике. Данная программа запускается под 16-битный отладчик ,а дело в том что в программе есть регистр eax 32-битный ,но отладчик 16-битный как мне тогда посмотреть регистр eax через что или может другой специальный отладчик есть? Или есть другой выход?
Turbo debugger вполне может показывать 32-разрядные регистры и команды.
1
 Аватар для Vort_
200 / 200 / 78
Регистрация: 10.07.2012
Сообщений: 409
09.10.2012, 14:46
Цитата Сообщение от Goodwin98 Посмотреть сообщение
Turbo debugger вполне может показывать 32-разрядные регистры и команды.
переход в защищённый режим однозначно приведёт его в нерабочее состояние
0
 Аватар для Kastaneda
5232 / 3205 / 362
Регистрация: 12.12.2009
Сообщений: 8,143
Записей в блоге: 2
10.10.2012, 11:43
Для 16 битного кода использование 32 битных регистров вполне нормально (это не делает код 32 битным). Но такой код нельзя отлаживать в обычном отладчике, при смене режима отладчик отвалится. Когда писал подобные вещи, использовал bochs (упомянутый выше), там есть встроеный отладчик. Им можно все отлаживать, даже обработку исключений.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.10.2012, 11:43
Помогаю со студенческими работами здесь

Выбор версии компилятора для онлайн проверки кода
Написал простую программку для теста на С++ в Microsoft Visual Studio Express 2012, в тесте просят указать язык: GNU C++ 4.9, GNU C++...

Выбор компилятора С++
Всем доброго времени суток.Такой вопрос:Какой компилятор или среду разработки взять для начала изучения С++? На Паскале писал,с Delphi...

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

Выбор компилятора: С или С++
Вопрос к знатокам MSP430. На каком языке писать, а точнее на какой язык лучше настраивать компилятор: С или С++? Какие есть ньюансы в обоих...

Выбор нужного компилятора
Сегодня стукнула моча в голову, сделать приложение для андроид. К делу: есть ли какой-нибуть незамудренная* среда для написания...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru