Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как выключить компьютер? Не используя кнопку выключения питания. 
:(
    Опции темы
Leksey
Дата 27.9.2005, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Вот загружает BIOS мой загрузчик , в котором я перехожу в защищенный режим,
вывожу Hello World,жду нажатия клавиши и Что делать дальше?
Хотелось бы чтобы компьютер выключался, или перезагружался.

PM MAIL   Вверх
Mysterio
Дата 27.9.2005, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Планирующий
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 28.12.2004

Репутация: нет
Всего: нет



Выложи,please,файло,мне это интересно. Что касается перезагрузки, то есть в ПЗУ программа сброса системы:
0FFFF0H:0F000H. Насчёт работоспособности в защищённом режиме ничего сказать не могу.

PM MAIL   Вверх
Leksey
Дата 28.9.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Да тут-то и выкладывать нечего.
Вот код.
Загружается показывает Hello World и комп издает звук противный пока не нажмешь reset.
0FFFF0H:0F000H - Просто на него длинный jump сделать?
Код

%define SELECTORFLATCS                 00001000b ;Селектор кода
%define SELECTORFLATDS                 00010000b ;Селектор данных
%define SELECTOR16BITCS                00011000b ;Селектор кода
%define SELECTOR16BITDS                00100000b ;Селектор данных
%define VIDEOMEMORY                0xB8000   ;адрес видеопамяти

   [BITS 16]
   [ORG 0x7C00]             ;Команда ORG устанавливает начальный адрес от которого будут отчитываться смещения меток

                         
   
EntryPoint:         
                            
    cli                           ;Запрет прерываний                      
    mov         ax, cs
    mov             ds, ax
    mov             ss, ax
    mov             sp,EntryPoint
    ; Загрузка регистра GDTR
    lgdt         [gd_reg]
    ;A20
    in           al,   0x92
    or           al,   2
    out          0x92, al
    ;Переход в защищенный режим  
    mov          eax, cr0             ; прочитать регистр CRO
    or           al, 1                ; установить бит РЕ
    mov          cr0, eax                   ; Записать CR0
    jmp dword    SELECTORFLATCS: protected
ReturnFromPM:
    ;Выход из защищенного режима
    mov          eax, cr0              ;прочитать регистр CR0
    and          al,0xFE               ;сбросить бит РЕ
    mov          cr0, eax              ;Записать CR0          
    sti                                   ;Разрешить прерывания
    ;Остановка работы процессора
    call         makesound
    cli
    hlt
    jmp short $
 
makesound:
   mov    al,0xB6
   out    0x43,al
   mov    al,0x0D
   out    0x42,al
   mov    al,0x11
   out    0x42,al
   in     al,0x61
   or     al,3
   out    0x61,al
   ret
   
[BITS 32]
protected:
    ;; Загрузим регистры DS и SS селектором сегмента данных
    mov          ax, SELECTORFLATDS
    mov          ds, ax
    mov          ss, ax
    
    mov esi, pmessage
    call pprint
    jmp word SELECTOR16BITCS: ReturnFromPM

pprint:
    xor            ecx,ecx
 .loop:
   lodsb 
   test           al, al
   jz             .quit
   mov            [VIDEOMEMORY+ecx*2], al
   inc            ecx
   jmp short      .loop
 .quit:
    ret
    
gdt:
dw 0, 0, 0, 0                         ;Нулевой дескриптор

db 0xFF                               ;Сегмент кода с DPL=0 
db 0xFF                               ; Базой=0 и Лимитом=4 Гб 
db 0x00
db 0x00
db 0x00
db 10011010b
db 11001111b
db 0x00

db 0xFF                                 ; Сегмент данных с DPL=0
db 0xFF                                 ; Базой=0 и Лимитом=4Гб
db 0x00
db 0x00
db 0x00
db 10010010b
db 11001111b
db 0x00

; 64-килобайтный код, DPL = 00:
db 0xFF
db 0xFF
db 0
db 0
db 0
db 10011010b
db 0
db 0
; 64-килобайтные данные, DPL = 00:
db 0xFF
db 0xFF
db 0
db 0
db 0
db 10010010b
db 0
db 0

;Значение, которое мы загрузим в GDTR:
gd_reg:
dw $-gdt-1
dd gdt

;Строчка  с надписью, которая появится на экране.
pmessage: db "Hello world from PM!",0
;Заполнить оставшуюся часть файла нулями
times 510-($-$$) db 0 
;Последние два байта указывают на то,что дискета загрузочная
db 0xAA, 0x55


Добавлено @ 17:38
Да кстати это на NASM'ме.
И еще никто не подскажет почему после выхода в реальный режим и вызова прерывания например подождать прерывания от клавы:
mov ah,0
int 16h

Если вставить перед вызовом call makesound , то ничего не происходит ни звука.Сколько хочешь кнопки нажимай.
Вообще очень интересно было бы,если кто-то в этом разбирающийся оценил код и сказал что неверно.
PM MAIL   Вверх
Mysterio
Дата 29.9.2005, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Планирующий
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 28.12.2004

Репутация: нет
Всего: нет



Цитата
0FFFF0H:0F000H - Просто на него длинный jump сделать?

Да, по крайней мере это единственное,что у меня работало хорошо.
Код. Код- это конечно замечательно, но в синтаксисе NASMa я не силён.
Хотя он и похож.Хотелось бы для TASMa. Например, как реализовать строчку
times 510-($-$$) db 0. И что такое times вообще?

Sorry for terrible english. My native language is C++
PM MAIL   Вверх
Guest
Дата 29.9.2005, 23:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











times просто макрос.
Первый параметр количество раз,а второй последовательность действий.
Он просто вставляет db 0 нужное количество раз.
Кстати может кто подскажет как параметры задаваемые для динамика связаны с частотой звука?Например какая здесь частота задается?
mov al,0x7E
out 0x42,al
mov al,03
out 0x42,al
Более новый код.
Нуждается в рефакторинге и иправлениях.
Но судя по писку динамика все работает.
Код

[ORG 0x7C00]

%define VIDEOMEMORY                    0xB8000   ;линейный адрес видеопамяти

;Реальный режим
[BITS 16]
EntryPoint:                                                 
    cli                               ;Запрет прерываний     
    ;Установка сегментных регистров   
    xor eax,eax                        
    mov         ax, cs                     
    mov             ds, ax
    mov             ss, ax
    mov             sp,EntryPoint
    mov          si,[rmessage]
    call         rprint
    shl          eax,4 
    mov [gdt3 + 2],ax               ; set base address of 16-bit segments
    mov [gdt4 + 2],ax
    shr          eax,16
    mov [gdt3 + 4],al
    mov [gdt4 + 4],al
    mov [gdt3 + 7],ah
    mov [gdt4 + 7],ah
    
    xor ebx,ebx
    mov bx,cs                       
    shl ebx,4                       ;Линейный адрес сегмента
    
    lea eax,[gdt + ebx]             ; EAX=физический адрес gdt
    mov [gdt_reg + 2],eax
    ;Сохраняем значения cs и адрес метки 
    lea ax,[do_rm]
    mov [RealModeIP],ax
    
    ; Загрузка регистра GDTR
    lgdt         [gdt_reg]
    ;Запретить NMI-немаскируемые прерывания
    in         al,0x70
    or         al,0x80
    out        0x70,al
    ;Переключение в режим A20-32-х разрядные адреса
    in           al,   0x92
    or           al,   2
    out          0x92, al
    ;Переход в защищенный режим  
    mov          eax, cr0                   ; прочитать регистр CRO
    or           al, 1                      ; установить бит РЕ
    mov          cr0, eax                   ; Записать CR0
    jmp          FLAT_CODE_SEL: protected
ReturnFromPM:
    mov ax,REAL_DATA_SEL
    mov ss,ax
    mov ds,ax            
    ;Выход из защищенного режима
    mov          eax, cr0              ;прочитать регистр CR0
    and          al,0xFE               ;сбросить бит РЕ
    mov          cr0, eax              ;Записать CR0 
    jmp far [RealModeIP]     
    
RealModeIP:
    dw 0 
     
rmessage: db "Real Mode!",0     
rprint:
   pusha
    xor            ecx,ecx
 .loop:
   lodsb 
   test           al, al
   jz             .quit
   mov            [ 0xB800+ecx*2], al
   inc            ecx
   jmp short      .loop
 .quit:
    popa
    ret

makesound:
   push   ax
   mov    al,0xB6
   out    0x43,al
   mov    al,0x7E  
   out    0x42,al
   mov    al,03
   out    0x42,al
   ;разрешить сигнал
   in     al,0x61 
   or     al,00000011b
   out    0x61,al
   
   pop    ax
   ret
   
endsound:
   push ax
   ;Запретить сигнал 
   in      al, 0x61 
   and     al, 11111100b 
   out     0x61, al
   pop ax
   ret
 
;Нереальный режим
[BITS 16]
do_rm:
    mov ax,cs
    mov ds,ax
    mov ss,ax
    ;Разрешить  NMI-немаскируемые прерывания
    in         al,0x70
    and        al,0x7F
    out        0x70,al   
    sti
    call         makesound
    ;Остановка работы процессора
    cli
    hlt
    jmp short $

;Защищенный режим
[BITS 32]
protected:
    ;; Загрузим регистры DS и SS селектором сегмента данных
    mov          ax, FLAT_DATA_SEL
    mov          ds, ax
    mov          ss, ax
    
    mov esi, pmessage
    call pprint
    jmp  REAL_CODE_SEL: ReturnFromPM

pprint:
   pusha
    xor            ecx,ecx
 .loop:
   lodsb 
   test           al, al
   jz             .quit
   mov            [VIDEOMEMORY+ecx*2+0x1A], al
   inc            ecx
   jmp short      .loop
 .quit:
    popa
    ret
    
gdt:
;Нулевой дескриптор
dw 0, 0, 0, 0                       

FLAT_CODE_SEL                  equ    $-gdt   ;Селектор кода в режиме плоской памяти
gdt1:
db 0xFF                               ;Сегмент кода с DPL=0 
db 0xFF                               ; Базой=0 и Лимитом=4 Гб 
db 0x00
db 0x00
db 0x00
db 10011010b
db 11001111b
db 0x00


FLAT_DATA_SEL                 equ    $-gdt ;Селектор данных  в режиме плоской памяти
gdt2:
db 0xFF                              
db 0xFF                               
db 0x00
db 0x00
db 0x00
db 10010010b
db 11001111b
db 0x00

REAL_CODE_SEL                 equ    $-gdt ;Селектор кода в 16 битном режиме
gdt3:
db 0xFF
db 0xFF
db 0
db 0
db 0
db 10011010b
db 0
db 0

REAL_DATA_SEL                equ    $-gdt;Селектор данных в 16 битном режиме
gdt4:
db 0xFF
db 0xFF
db 0
db 0
db 0
db 10010010b
db 0
db 0

;Значение, которое мы загрузим в GDTR:
gdt_reg:
  dw $-gdt-1
  dd gdt

;Строчка  с надписью, которая появится на экране.
pmessage: db "Protected Mode!",0
;Заполнить оставшуюся часть файла нулями
times 510-($-$$) db 0 
;Последние два байта указывают на то,что дискета загрузочная
db 0xAA, 0x55


  Вверх
Leksey
Дата 30.9.2005, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Это опять я, никто не знает где скачать книгу Рудакова Финогенова?
PM MAIL   Вверх
Leksey
Дата 13.11.2005, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 332
Регистрация: 12.12.2004

Репутация: нет
Всего: 1



Новая версия демонстрации защищенного режима.
Полностью работающая.
Загружается, Ожидает нажатия клавиши и Перезагружает компутер.
Код

[ORG 0x7C00]

[BITS 16]
EntryPoint:                                                 
    cli                              ;Запрет прерываний   
    in            al,0x70           
    or            al,0x80         
    out           0x70,al            ;Запрещаем  немаскируемые прерывания 
    xor         eax,eax                        
    mov        ax, cs                     
    mov            ds, ax
    mov            ss, ax
    mov            sp,EntryPoint        
    mov         ax,0xB800            ;Установка сегментных регистров 
    mov         es,ax                ;Записываем в es адрес текстовой видеопамяти
    lea      si,[rmessage1]                       
    call        rprint               ;Вызываем функцию печати сообщения   
    xor         ebx,ebx
    mov         bx,ds
    shl         ebx,4                ;Записываем в ebx линейный адрес ds=cs
    mov         eax,ebx             
    mov         [gdt1 + 2],ax            
    mov         [gdt2 + 2],ax
    mov         [gdt3 + 2],ax             
    mov         [gdt4 + 2],ax
    shr         eax,16
    mov        [gdt1 + 4],al
    mov            [gdt2 + 4],al
    mov         [gdt3 + 4],al
    mov        [gdt4 + 4],al
    mov        [gdt1 + 7],ah
    mov        [gdt2 + 7],ah
    mov        [gdt3 + 7],ah
    mov        [gdt4 + 7],ah        ;Заполнили базу для сегментных дескрипторов
    lea         eax,[gdt + ebx]            
    mov         [gdt_reg + 2],eax    ;Записываем линейный адрес таблицы дескрипторов  
    mov         ax,cs
    mov         [RealModeCS],ax
    lea         ax,[EndRM]
    mov         [RealModeIP],ax      ;Запоминаем значения регистров ip и cs для возврата в реальный режим
    cli                              ;Запрещаем прерывания
    lgdt [gdt_reg]                   ;Загружаем регистр gdt_reg
    mov eax,cr0                     
    or al,1
    mov cr0,eax                      ;Устанавливаем бит PE(Protection Enabled) в регистре CR0
    jmp PM32_CODE_SEL:StartPM32      ;Прыжок в 32-х битный код и защищенный режим
    
rprint:                              ;Функция печати строки с нулем в конце в начало es
   push           ecx
   cld
   xor  ecx,ecx
 .loop:
   lodsb 
   test           al, al
   jz             .quit
   mov            [es:ecx], al
   mov            al,'8'
   inc            ecx
   mov            [es:ecx],al
   inc            ecx
   jmp short      .loop
 .quit:
   pop            ecx
   ret      
     
[BITS 32]
StartPM32:
    mov           ax,PM32_DATA_SEL
    mov           ds,ax
    mov           ss,ax
    mov           ax,PM32_VIDEO_SEL
    mov           es,ax                     ;Загружаем сегментные регистры
    lea           esi,[p32message]    
    call          pprint                    ;Вызываем  функцию печати из защищенного режима
    jmp           PM16_CODE_SEL:StartPM16   ;Прыжок в 16-битный защищенный режим
    
pprint:                                     ;Функция печати строки с нулем в конце в начало es
   push            ecx
   cld
   xor             ecx,ecx
 .loop:
   lodsb 
   test           al, al
   jz             .quit
   mov            [es:ecx+80*2], al
   inc            ecx
   mov            al,'8'
   mov            [es:ecx+80*2],al
   inc            ecx 
   jmp short      .loop
 .quit:
    pop           ecx
    ret 
      
[BITS 16]
StartPM16:
    mov            ax,PM16_DATA_SEL
    mov            ss,ax
    mov            ds,ax                ;Загужаем сегментные регистры
    mov            eax,cr0
    and            al,0xFE
    mov            cr0,eax                ;Сбрасываем бит PE(Protection Enabled) в регистре CR0
    jmp far        [RealModeIP]         ;Восстанавливаем значения cs и ip для реального режима 
    
[BITS 16]
   
EndRM:
    mov           ax,cs
    mov           ds,ax
    mov           ss,ax
    mov           ax,0xB814             ;Записываем начало третьей строки 80*4=0x140
    mov           es,ax                 ;Восстанавливаем  сегментные регистры реального режима  
    in            al,0x70             
    and           al,0x7F         
    out           0x70,al                ;Разрешаем немаскируемые прерывания
    sti                                 ;Разрешить прерывания
    lea           si,[rmessage2]        
    call          rprint                ;Вызов функции печати строки    
    mov           ax,0
    int           0x16                  ;Ожидем нажатия клавиши     
    mov           al, 0xfe 
    out           0x64,al               ;Программно нажимаем reset
    cli                   
    hlt
    jmp $

;Данные

RealModeIP: dw 0 
RealModeCS: dw 0 

gdt:    
gdt0:                                   ;Нулевой дескриптор
    db 0               ;Лимит 1,2 и первые 4 бита предпоследнего байта 
    db 0                              
    db 0               ;База 3,4,5 и последний байт               
    db 0                               
    db 0            
    db 0            
    db 0             
    db 0            
    
PM32_CODE_SEL    equ    $-gdt               ;Селектор дескриптора кода
gdt1:                                 
    db 0xFF                             ;Лимит 0xFFFFF
    db 0xFF                           
    db 0
    db 0                                ;База вычисляется в коде                                
    db 0
    db 10011010b                        
    db 11001111b                      
    db 0

PM32_DATA_SEL    equ    $-gdt                ;Селектор дескриптора данных
gdt2:   
    db 0xFF                              ;Лимит 0xFFFFF
    db 0xFF           
    db 0                                 ;База вычисляется в коде
    db 0    
    db 0
    db 10010010b            
    db 11001111b           
    db 0

PM16_CODE_SEL    equ    $-gdt                 ;Селектор дескриптора кода совместимый с реальным
gdt3:   
    db 0xFF                               ;Лимит 0xFFFF
    db 0xFF
    db 0                                  ;База вычисляется в коде
    db 0        
    db 0
    db 10011010b            
    db 0            
    db 0

PM16_DATA_SEL    equ    $-gdt                 ;Селектор дескриптора данных совместимый с реальным
gdt4:   
    db 0xFF                               ;Лимит 0xFFFF
    db 0xFF
    db 0                                  ;База вычисляется в коде
    db 0            
    db 0
    db 10010010b        
    db 0            
    db 0
    
PM32_VIDEO_SEL   equ    $-gdt             ;Селектор дескриптора данных(видеопамяти)
gdt5:
    db 0xFF                               ;Лимит 0xFFFF
    db 0xFF
    db 0x00                               ;База  0x0B8000
    db 0x80
    db 0x0B
    db 10010010b
    db 01000000b
    db 0
    
gdt_reg:
  dw $-gdt-1                             ;размер таблицы дескрипторов
  dd gdt                                 ;Здесь должен быть линейный адрес таблицы дескрипторов, заполняется в коде

p32message:   db "Protected Mode 32!",0
rmessage1:    db "Real Mode!",0
rmessage2:    db "Press Any Key to Exit...",0

times  510-($-$$)  db 0                  ;Доводим размер до 510 байт
db 0x55, 0xAA

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0905 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.