OSDev
http://osdev.ru/

Подскажите как правильно из gcc вызвать int 10h?
http://osdev.ru/viewtopic.php?f=6&t=1838
Страница 1 из 1

Автор:  kvonosan [ 15 фев 2018, 16:25 ]
Заголовок сообщения:  Подскажите как правильно из gcc вызвать int 10h?

Подскажите как правильно из 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
);
^

Автор:  kvonosan [ 15 фев 2018, 17:38 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

сделал так:
Код:
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 в используемые регистры если пишу, то тоже ругается..

Автор:  kvonosan [ 15 фев 2018, 17:45 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

Возник другой вопрос, почему то когда курсор устанавливается, после установки вызывается перерисовка и выводятся строки загрузки, хотя должен быть отрисован мой текст и курсор в положении 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"
     );
}

Автор:  Himik [ 15 фев 2018, 20:52 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

"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

Автор:  pavia [ 15 фев 2018, 22:14 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

У большинства эмуляторов есть баг с кареткой. Она корректно отображается только если включить прерывания от таймера. А у вас они заблокированы.

Автор:  kvonosan [ 16 фев 2018, 00:13 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

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, 00:14 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

pavia писал(а):
У большинства эмуляторов есть баг с кареткой. Она корректно отображается только если включить прерывания от таймера. А у вас они заблокированы.

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

Автор:  Himik [ 16 фев 2018, 11:25 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

Прерывания таймера включены постоянно, если только глобально не запрещены прерывания процессора, командой CLI. Если ты специально не делал команду cli, то прерывания таймера должны идти. Можно принудительно включить прерывания командой STI, если не уверен. Или пробуй запускать в другом эмуляторе/компьютере.

Автор:  kvonosan [ 16 фев 2018, 14:32 ]
Заголовок сообщения:  Re: Подскажите как правильно из gcc вызвать int 10h?

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

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/