Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2017, 15:19   #1
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию Нумерация бит в ОЗУ и регистрах

Всем доброго дня.
Пишу на ассемблере FASM. При переходе из Real Mode в Protected Mode
происходит какая-то фигня. В GDT - есть сегмент видеопамяти [Адрес: 08B00h]
Но на экран ничего не выводится. Просто сразу переходит в jmp $

Так вот может я не правильно заполняю регистр GDTR или сегменты.
То есть пример:
Код:
lgdt [GDTR]

  ;А тут таблица 
  
  TABLE:
  dq 0 
  db 0FFh ,0FFh ,00h ,00h ,00h ,019h, 0FCh, 00h	 ;code

GDTR:
     Limit   dw GDTR-TABLE - 1 
     Adress dd  TABLE
Если нужен полный код пишите. Я просто сейчас не за своим компом))) Позже скину.

Главное я хочу понять нумерацию битов
в переменных (db ,dd ,dq)
в регистрах (ax,cx)
в регистре (gdtr)
Спасибо.

Последний раз редактировалось Serge_Bliznykov; 23.08.2017 в 15:23.
Nikolay2015 вне форума Ответить с цитированием
Старый 23.08.2017, 18:18   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
Главное я хочу понять нумерацию битов
в переменных (db ,dd ,dq)
в регистрах (ax,cx)
в регистре (gdtr)
Спасибо.
Во всех регистрах биты нумеруются справа налево.
А вот элементы массивов напротив нумеруются с слева на права.
В числах разряды идут как и в регистрах справа налево.

2017-08-23_18-30-51.png
2017-08-23_18-37-49.png

Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
есть сегмент видеопамяти [Адрес: 08B00h]
Физический адрес видео памяти 0b8000h. Мало того что две цифры местами перепутали, так ещё и нолик потерялся.


Цитата:
Сообщение от Nikolay2015 Посмотреть сообщение
db 0FFh ,0FFh ,00h ,00h ,00h ,019h, 0FCh, 00h ;code
Это сегмент кода, не данных. Тем более у него запрещено чтение.

Так что как вы писали в видеопамять непонятно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 23.08.2017 в 18:46.
Pavia вне форума Ответить с цитированием
Старый 23.08.2017, 19:47   #3
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Спасибо.
То есть мне надо загружать сегменты в Protected mode.
Код:
mov ax, 10h ;Сегмент данных
mov ds, ax
mov ax, 18h ;Сегмент видеопамяти
mov es, ax
mov ax, 0
mov di , ax
И выводить по типу:
Код:
mov ah, 07h
mov al, 'R'
mov es:[di], ax
Я прав?
И спасибо за картинки. Понятно объяснил.
Nikolay2015 вне форума Ответить с цитированием
Старый 23.08.2017, 20:12   #4
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Да,только правильно заполните таблицу GDT. С правильными дескрипторами, для каждого сегмента.
Надеюсь поможет:
Вложения
Тип файла: zip GDT просмоторщик1.zip (224.9 Кб, 19 просмотров)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 23.08.2017 в 20:16.
Pavia вне форума Ответить с цитированием
Старый 23.08.2017, 20:15   #5
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Pavia Посмотреть сообщение
Да,только правильно заполните таблицу GDT. С правильными дескрипторами, для каждого сегмента.
Все равно не работает, через 15 мин скину таблицу, и код.
Чёрный экран + каретка ((((
Nikolay2015 вне форума Ответить с цитированием
Старый 23.08.2017, 20:40   #6
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Не хочет работать:

Таблица GDT:
Код:
GDT:
dq 0 
db 0FFh, 0FFh, 0, 0, 0, 09Ah, 0CFh, 0
db 0FFh,0FFh,0,0,0,92h,0CFh,0
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0

Код Protected Mode:

Код:
mov ax,10h
mov ds,ax
mov ax,18h
mov es,ax
mov ax, 0
mov di , ax

mov ah, 07h
mov al, 'R'
mov [es:di],ax
Черный экран и каретка на позиции 0x0

Пытался так, но fasm ругается "Invalid operand":
Код:
mov es:[di],ax
Nikolay2015 вне форума Ответить с цитированием
Старый 23.08.2017, 20:58   #7
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Найди различия в этих картинках:
Код:
mov [es:di],ax
Код:
mov es:[di],ax
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 23.08.2017, 20:59   #8
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Nikolay2015
Приведите весь код целиком.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 23.08.2017, 21:01   #9
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Цитата:
Сообщение от 7in Посмотреть сообщение
Найди различия в этих картинках:
Код:
mov [es:di],ax
Код:
mov es:[di],ax
Как я узнал, отличий нет. Но fasm ругается на второе
Nikolay2015 вне форума Ответить с цитированием
Старый 23.08.2017, 21:03   #10
Nikolay2015
Пользователь
 
Регистрация: 23.08.2017
Сообщений: 59
По умолчанию

Вот полный код:
Код:
use16
xor ax,ax
cli
mov ss,ax
xor sp,sp
sti
mov ax,3
int 10h

jmp 1000h:r_start

r_start:

mov ax,1000h
mov ds,ax 
mov es,ax

in al, 0x92
or al, 2
out 0x92, al

cli
mov al,8Fh
out 70h,al
in al,71h

lgdt fword [GDTR]
mov eax,cr0 
or al,1
mov cr0,eax

jmp fword 08h:PM_mode_st

align 8
GDT:
dq 0
db 0FFh, 0FFh, 0, 0, 0, 09Ah, 0CFh, 0 ;код
db 0FFh,0FFh,0,0,0,92h,0CFh,0;данные
db 0FFh,0FFh,0,80h,0Bh,92h,40h,0 ;видеосегмент
label GDT_SIZE at $-GDT
GDTR:
dw GDT_SIZE-1
dd GDT+10000h

virtual
rb 10000h-$;
end virtual

use32
org $+10000h

PM_mode_st:
mov ax,10h
mov ds,ax
mov ax,18h
mov es,ax
mov ax, 0
mov di , ax

mov ah, 07h
mov al, 'R'
mov [es:di],ax
jmp $
Nikolay2015 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод программы с 32 бит на 64 бит систему andreyxdd Общие вопросы Delphi 3 19.07.2017 11:04
Исправить код программы: Ввести с клавиатуры 8-разрядное двоичное число Х, установить младший бит этого числа так, чтобы количество единичных бит в двоичном числе Х стало четным Zhan1234 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 25.05.2017 12:41
ОЗУ esa2esa Компьютерное железо 2 29.12.2010 20:45
Ковертирование из png 24 бит в png 8 бит isat Общие вопросы .NET 0 22.03.2010 13:38