OSDev

для всех
Текущее время: 28 апр 2024, 02:03

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 23 фев 2013, 18:01 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Ошибка ты в один адрес пишешь другой проверяешь.
Пишешь в 10 мегабайт физический. А проверяешь 0 байт физический. (И да вашу структуру GDT я считал телепатически)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 23 фев 2013, 18:22 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
pavia писал(а):
(И да вашу структуру GDT я считал телепатически)

Цитата:
0008 CodeER Bas=00000000 Lim=fffff000 DPL=0 P A G BIG AVL=0 L=0
0010 DataRW Bas=00000000 Lim=fffff000 DPL=0 P A G BIG AVL=0 L=0
0018 DataRW Bas=000b8000 Lim=0000ffff DPL=0 P NA BIG AVL=0 L=0
0020 CodeER Bas=00000000 Lim=fffff000 DPL=0 P NA G BIG AVL=0 L=0


Цитата:
Ошибка ты в один адрес пишешь другой проверяешь.

вот этого не понял
Код:
mov ecx, 0FFh
mov edi, 110000h
mov AL, '<'
; так должно записываться в адрес [0011:0000]
mov AL, '<'
mov [100050h],eax
; так на прямую пишу что записал в адрес [0010:0050] регистр EAX

Цитата:
Пишешь в 10 мегабайт физический. А проверяешь 0 байт физический.

вот что пишет по адресам.
Код:
%0000000000000000: 3c 3c 3c 3c 3c 3c 3c 3c-3c 3c 3c 3c 3c 3c 3c 3c  <<<<<<<<<<<<<<<<
%0000000000000010: 3c 3c 3c 3c 3c 3c 3c 3c-3c 3c 3c 3c 3c 3c 3c 3c  <<<<<<<<<<<<<<<<
%0000000000000020: 3c 3c 3c 3c 3c 3c 3c 3c-3c 3c 3c 3c 3c 3c 3c 3c  <<<<<<<<<<<<<<<<
%0000000000000030: 3c 3c 3c 3c 3c 3c 3c 3c-3c 3c 3c 3c 3c 3c 3c 3c  <<<<<<<<<<<<<<<<
%0000000000000040: 3c 3c 3c 3c 3c 3c 3c 3c-3c 3c 3c 3c 3c 3c 3c 3c  <<<<<<<<<<<<<<<<
%0000000000000050: 3c 3c 3c 3c 3c 3c 3c 3c-3c 3c 3c 3c 3c 3c 3c 3c  <<<<<<<<<<<<<<<<
%0000000000100040: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000100050: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000100060: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000100070: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000100080: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000100090: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000110000: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000110010: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000110020: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000110030: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000110040: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
%0000000000110050: 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 23 фев 2013, 18:53 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
:lol:
[100050h]
[10:0050h]
[10h:0050h]
Это три разных адреса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 23 фев 2013, 19:33 
Аватара пользователя

Зарегистрирован: 16 апр 2010, 10:10
Сообщения: 320
Откуда: Псковская обл.
mov 0x01000000,eax
mov [0x01000000],eax
это не одно и то же
косвенная адресация, типа


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 23 фев 2013, 19:36 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
и как же произвести запись в адрес больше мегобайта
вот так mov [10:0050h],eax я зписывать не могу.
Цитата:
mov 0x01000000,eax
mov [0x01000000],eax
это не одно и то же

а так компилятор не переваривает,
mov 0x01000000,eax


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 23 фев 2013, 22:46 
Аватара пользователя

Зарегистрирован: 16 апр 2010, 10:10
Сообщения: 320
Откуда: Псковская обл.
Ну да трансляторы(компиляторы это типа СИ когда язык) косвенную по разному понимают. Просто в фасме твои примеры в квадратных скобках - это косвенная - а нужна прямая адресация .Я как бы на фасме. А твой транслятор может и правильно обрабатывает всё. Короче , какой у тебя ассемблер?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 23 фев 2013, 22:57 
Аватара пользователя

Зарегистрирован: 16 апр 2010, 10:10
Сообщения: 320
Откуда: Псковская обл.
Я сам запарился по ходу с фасмом. Последнее время пишу на своём асме - а у меня именно так. Сейчас посмотрел - я че-то совсем не то пишу. И правда так не работает mov 0x01000000,eax

пойду читать мануал - а то может и хуже будет
короче синтаксис сильно разный - видимо за те несколько дней ,что я программировал на своём языке - вообще забыл фасм и по ходу архитектуру х86. Не ожидал от себя.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 24 фев 2013, 01:23 

Зарегистрирован: 10 апр 2012, 23:19
Сообщения: 277
iz56 писал(а):
Короче , какой у тебя ассемблер?

у меня то же фасм,
и вобщем то ответа я либо не понял, либо недождался,
нашёл работающий код, только не понял в чём я ошибался,
ведь перепробовал все варианты.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 24 фев 2013, 10:33 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
У новичков бывает. Одну ошибку исправил вторую добавил. Вот оно и не работает. А кажется что все варианты проверил. Больше знаешь меньше ошибок. И учиться надо постепенно.
Для того чтобы ошибок было меньше, надо правильно оформлять код.

Набросал код. Вот так вот надо оформлять и писать код.
Код:
                              ; Будем делать COM файл.
    .486p                      ; Выбираем режим совместимости 486. 32 битные регистры появились в 386, данная директива их разрешает
    .model    tiny, PASCAL    ; Простая модель памяти, а именно код, данные, стек в одном сегменте
                              ; Выбираем в качестве соглашения о вызове функций формат PASCAL

   
CSEG SEGMENT  USE16           ; Создаем новый сегмен с именем CSEG. Устанавливаем выравнивание по параграфу. По умолчанию Формат кода 16 битный
     ASSUME CS:CSEG,DS:CSEG,ES:CSEG              ; Сообщаем компилятору о том физический сегменты CS,DS,ES связан с логическим CSEG
                              ; Теперь для смещение для меток будут отсчитываться от CSEG   
    org    100h               ; Нужно для ДОС чтобы линкер правильно сформировал смещения
                              ; Ко всем меткам прибавляется +100h

; Основной код
main PROC                       
    CALL OpenA20   
    CALL GoToPM
    CALL mainPM
    CALL GoToRM
    RET
main ENDP

; Основной код для защищённого режима
mainPM PROC               
    PUSH ESI
    MOV  EAX,  '1234'
    MOV  ESI, 100000h
    MOV  DWord PTR [ESI], EAX
    POP  ESI
    RET
mainPM ENDP

; Переход в защищенный режим.
; запрещает прерывания включаем защищенный режим.
; Настраиваем сегментые регистры DS,ES,FS,GS
; Не трогаем регистры SS, CS
GoToPM PROC
    PUSH BX
   
    CALL InitGDTR                       
    CALL DisableInt


    ;{ON_PM:}
    MOV  EAX,CR0
    OR   AL,1
    MOV  CR0,EAX

    MOV  BX, 10h           ; Устанавливаем селектор сегмента 10h; T=GDT index=2 RPL=0
    MOV  DS,BX
    MOV  ES,BX
    MOV  FS,BX
    MOV  GS,BX

    ; SS не трогаем
    ; CS не трогаем
    POP  BX
    RET
GoToPM ENDP

; Переход в реальный режим.
; Настраиваем сегментые регистры DS,ES,FS,GS
; разрешаем прерывания.
GoToRM PROC
   PUSh BX
   
    ;{OFF_PM:}
    MOV  EAX,CR0
    AND  AL,0FEh
    MOV  CR0,EAX

    XOR  BX,BX
    MOV  FS,BX
    MOV  GS,BX
    MOV  BX,CS
    MOV  DS,BX
    MOV  ES,BX
    CALL EnableInt
   
    POP BX
    RET
GoToRM ENDP

; Настраиваем GDTR;
; Входные параметры:
; Глобальные переменные GDT, GDTR
InitGDTR PROC
    PUSH ES
    PUSH EBX
    XOR  EAX, EAX
    XOR  EBX, EBX

    MOV  AX, DS
    MOV  BX, OFFSET GDT
    SHL  EAX,4
    ADD  EAX,EBX
    PUSH DS
    POP  ES
    MOV  DWord PTR ES:[GDTR+2],EAX
    LGDT QWord PTR ES:[GDTR]

    POP  EBX
    POP  ES
    RET
InitGDTR ENDP

; Запрещаем маскируемые и немаскируемые прерывания
DisableInt PROC
    CLI
    MOV  AL, 8Fh
    OUT  70h, AL
    IN    AL, 71h
    RET
DisableInt ENDP

; Разрешаем немаскируемые и маскируемые прерывания
EnableInt PROC
    MOV  AL, 0Fh
    OUT  70h, AL
    IN    AL, 71h
    STI
    RET
EnableInt ENDP


; Открываем, разрешаем 20 линию адреса
OpenA20 PROC
    IN   AL,92h
    OR   AL,2
    OUT  92h,AL
    RET
OpenA20 ENDP

ALIGN 16     ; GDT, GDTR должны быть выровнены на границе 16 байт.
GDT db 000h, 000h, 000h, 000h, 00h,  000h, 000h, 000h
    db 0FFh, 0FFh, 000h, 000h, 000h, 09Ah, 08Fh, 000h    ; Кодовый сегмент с разрешенным выполнение и чтением. Формат команд 16 бит!
    db 0FFh, 0FFh, 000h, 000h, 000h, 092h, 0CFh, 000h
    db 0FFh, 0FFh, 000h, 000h, 000h, 092h, 0CFh, 000h
GDTR dw 8*4-1      ;Лимит
     dd 0          ;Смещение
     dw 0          ;Резерв
CSEG ENDS
end  main               ;  Указываем точку входа в программу


Последний раз редактировалось pavia 24 фев 2013, 17:23, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: запись в память с выше 1MB (0010:0000h)
СообщениеДобавлено: 24 фев 2013, 13:32 

Зарегистрирован: 10 май 2007, 11:33
Сообщения: 1206
В этом коде как минимум не разрешаются прерывания (до возврата в RM). Для включения шлюза A20 и выключения немаскируемых прерываний используется такой же "примитивно-кривоватый" (упрощенный и не совсем корректный) код, как и у тебя.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 41 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB