OSDev http://osdev.su/ |
|
запись в память с выше 1MB (0010:0000h) http://osdev.su/viewtopic.php?f=6&t=698 |
Страница 2 из 5 |
Автор: | pavia [ 23 фев 2013, 18:01 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
Ошибка ты в один адрес пишешь другой проверяешь. Пишешь в 10 мегабайт физический. А проверяешь 0 байт физический. (И да вашу структуру GDT я считал телепатически) |
Автор: | scuter [ 23 фев 2013, 18:22 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
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 ................ |
Автор: | pavia [ 23 фев 2013, 18:53 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
[100050h] [10:0050h] [10h:0050h] Это три разных адреса. |
Автор: | iz56 [ 23 фев 2013, 19:33 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
mov 0x01000000,eax mov [0x01000000],eax это не одно и то же косвенная адресация, типа |
Автор: | scuter [ 23 фев 2013, 19:36 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
и как же произвести запись в адрес больше мегобайта вот так mov [10:0050h],eax я зписывать не могу. Цитата: mov 0x01000000,eax mov [0x01000000],eax это не одно и то же а так компилятор не переваривает, mov 0x01000000,eax |
Автор: | iz56 [ 23 фев 2013, 22:46 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
Ну да трансляторы(компиляторы это типа СИ когда язык) косвенную по разному понимают. Просто в фасме твои примеры в квадратных скобках - это косвенная - а нужна прямая адресация .Я как бы на фасме. А твой транслятор может и правильно обрабатывает всё. Короче , какой у тебя ассемблер? |
Автор: | iz56 [ 23 фев 2013, 22:57 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
Я сам запарился по ходу с фасмом. Последнее время пишу на своём асме - а у меня именно так. Сейчас посмотрел - я че-то совсем не то пишу. И правда так не работает mov 0x01000000,eax пойду читать мануал - а то может и хуже будет короче синтаксис сильно разный - видимо за те несколько дней ,что я программировал на своём языке - вообще забыл фасм и по ходу архитектуру х86. Не ожидал от себя. |
Автор: | scuter [ 24 фев 2013, 01:23 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
iz56 писал(а): Короче , какой у тебя ассемблер? у меня то же фасм, и вобщем то ответа я либо не понял, либо недождался, нашёл работающий код, только не понял в чём я ошибался, ведь перепробовал все варианты. |
Автор: | pavia [ 24 фев 2013, 10:33 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
У новичков бывает. Одну ошибку исправил вторую добавил. Вот оно и не работает. А кажется что все варианты проверил. Больше знаешь меньше ошибок. И учиться надо постепенно. Для того чтобы ошибок было меньше, надо правильно оформлять код. Набросал код. Вот так вот надо оформлять и писать код. Код: ; Будем делать 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 ; Указываем точку входа в программу |
Автор: | phantom-84 [ 24 фев 2013, 13:32 ] |
Заголовок сообщения: | Re: запись в память с выше 1MB (0010:0000h) |
В этом коде как минимум не разрешаются прерывания (до возврата в RM). Для включения шлюза A20 и выключения немаскируемых прерываний используется такой же "примитивно-кривоватый" (упрощенный и не совсем корректный) код, как и у тебя. |
Страница 2 из 5 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |