OSDev

для всех
Текущее время: 27 дек 2024, 10:02

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




Начать новую тему Ответить на тему  [ Сообщений: 9 ] 
Автор Сообщение
СообщениеДобавлено: 15 фев 2018, 16:25 

Зарегистрирован: 13 фев 2018, 17:38
Сообщения: 11
Подскажите как правильно из gcc вызвать int 10h?
вот код:
Код:
void SetCursor(const unsigned char _x,const unsigned char _y)
{
   asm(
      ".intel_syntax;"
      "mov ah, 0x02;"
      "mov dh, %1;"
      "mov dl, %2;"
      "mov bh, 0x00;"
      "int 0x10;"
      :
      : "r"(_x), "r"(_y)
      : "ah", "dx", "bh"
      );
}


Компилирую. gcc ругается:
Цитата:
C:\Users\kvono\Desktop\kvonosanos>g++ -ffreestanding -c -o functions.o "src/functions.c"
src/functions.c: In function 'void SetCursor(unsigned char, unsigned char)':
src/functions.c:65:4: error: invalid 'asm': operand number out of range
);
^


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 фев 2018, 17:38 

Зарегистрирован: 13 фев 2018, 17:38
Сообщения: 11
сделал так:
Код:
void SetCursor()
{
   char a;
   asm(
        ".intel_syntax;"
        "mov ah, 0x02;"
        "mov dh, 0x00;"
        "mov dl, 0x00;"
        "mov bh, 0x00;"
        "int 0x10;"
        :
        : "r"(a)
        : "ah", "dx"
     );
}

без char a; и "r"(a) ругается, и bh в используемые регистры если пишу, то тоже ругается..


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 фев 2018, 17:45 

Зарегистрирован: 13 фев 2018, 17:38
Сообщения: 11
Возник другой вопрос, почему то когда курсор устанавливается, после установки вызывается перерисовка и выводятся строки загрузки, хотя должен быть отрисован мой текст и курсор в положении 0 0.
Курсор прыгает на другую позицию
как было
https://snag.gy/saWYFH.jpg
как становится
https://snag.gy/x7KVGe.jpg
эти два экрана меняются постоянно и курсор прыгает то вначало то на позицию на скриншотах.
как исправить?
куда копать?

вот исходники
Код:
void Clear(const char _color);
void DrawChar(const char _char,const unsigned int _x,const unsigned int _y,const char _color);
void DrawText(const char* _text,const unsigned int _x,const unsigned int _y,const char _color);
void SetCursor();

void kernel(void)
{
   Clear(0b00010000);
   DrawText("KVonosan Operating System version 14.02.2018",0,0,0b00011110);
   //DrawChar('B',1,1,0b00011110);
   SetCursor();
   for(;;)
   {
   }
}


Код:
#define VIDEO_RAM 0x000B8000

void Clear(const char _color)
{
   unsigned int i=0;
   char* address=0;
   
   address=(char*)VIDEO_RAM;
   
   for(i=0;i<80*25*2;i+=2)
   {
      *(address+i)=' ';
      *(address+i+1)=_color;
   }
}

void DrawChar(const char _char,const unsigned int _x,const unsigned int _y,const char _color)
{
   unsigned int i=0;
   char* address=0;
   
   i=160*_y+2*_x;
   address=(char*)VIDEO_RAM;
   
   *(address+i)   = _char;
   *(address+i+1)   = _color;
}

void DrawText(const char* _text,const unsigned int _x,const unsigned int _y,const char _color)
{
   unsigned int i=0;
   unsigned int j=0;
   unsigned int length=0;
   char* address=0;
   
   i=160*_y+2*_x;
   address=(char*)VIDEO_RAM;
   
   while(_text[length]) length++;
   
   while(length)
   {
      *(address+i)   = _text[j];
      *(address+i+1)   = _color;
      
      i+=2;
      j++;
      length--;
   }
}

void SetCursor()
{
   char a;
   asm(
        ".intel_syntax;"
        "mov ah, 0x02;"
        "mov dh, 0x00;"
        "mov dl, 0x00;"
        "mov bh, 0x00;"
        "int 0x10;"
        :
        : "r"(a)
        : "ah", "dx"
     );
}


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 фев 2018, 20:52 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
"r" представляет собой целый регистр, поэтому его нельзя скопировать в половину регистра командой mov.
Здесь нужно выбрать определённый регистр, и задать определённые команды копирования. Примерно так
Код:
void SetCursor(const unsigned char _x,const unsigned char _y)
{
   asm(
      ".intel_syntax;"
      "mov dh, AL;"
      "mov ah, 0x02;"
      "mov bh, 0x00;"
      "int 0x10;"
      :
      : "d"(_x), "a"(_y)
      : "ax", "bx", "dx"
      );
}

Программа должна компилироваться для реального режима или DPMI.
Чтобы результат был понятней, можно компилировать с ключами -save-temps -fverbose-asm -masm=intel
и смотреть полученные файлы типа *.s


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 15 фев 2018, 22:14 
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 фев 2018, 00:13 

Зарегистрирован: 13 фев 2018, 17:38
Сообщения: 11
Himik писал(а):
"r" представляет собой целый регистр, поэтому его нельзя скопировать в половину регистра командой mov.
Здесь нужно выбрать определённый регистр, и задать определённые команды копирования. Примерно так
Код:
void SetCursor(const unsigned char _x,const unsigned char _y)
{
   asm(
      ".intel_syntax;"
      "mov dh, AL;"
      "mov ah, 0x02;"
      "mov bh, 0x00;"
      "int 0x10;"
      :
      : "d"(_x), "a"(_y)
      : "ax", "bx", "dx"
      );
}

Программа должна компилироваться для реального режима или DPMI.
Чтобы результат был понятней, можно компилировать с ключами -save-temps -fverbose-asm -masm=intel
и смотреть полученные файлы типа *.s

спсибо за разъяснения


Последний раз редактировалось kvonosan 16 фев 2018, 01:11, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 фев 2018, 00:14 

Зарегистрирован: 13 фев 2018, 17:38
Сообщения: 11
pavia писал(а):
У большинства эмуляторов есть баг с кареткой. Она корректно отображается только если включить прерывания от таймера. А у вас они заблокированы.

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


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 фев 2018, 11:25 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Прерывания таймера включены постоянно, если только глобально не запрещены прерывания процессора, командой CLI. Если ты специально не делал команду cli, то прерывания таймера должны идти. Можно принудительно включить прерывания командой STI, если не уверен. Или пробуй запускать в другом эмуляторе/компьютере.


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 16 фев 2018, 14:32 

Зарегистрирован: 13 фев 2018, 17:38
Сообщения: 11
спасибо за пояснения


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 9 ] 

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


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

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


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

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