2016-01-13 3 views
-1

У меня есть простая функция для построения пикселя с встроенным ассемблером в с использованием DJGPP и 256 VGA в DOS Box:Участка пиксели VGA с встроенным ассемблером

byte *VGA = (byte *)0xA0000; 
void plot_pixel(int x, int y, byte color){ 

    int offset; 
    if(x>32 && x <=320 && y>0 && y<180){ 
    //x=x-1; 
    //y=y-1; 
    if(x<0){x=0;} 
    if(y<0){y=0;} 
    offset = (y<<8) + (y<<6) + x; 
    VGA[offset]=color; 

    } 


} 

я работаю над переводом его встраивать в сбор и У меня есть следующее:

void plot_pixel(int x, int y, byte color){ 

    int offset; 
    if(x>32 && x <=320 && y>0 && y<180){ 
    //x=x-1; 
    //y=y-1; 
    if(x<0){x=0;} 
    if(y<0){y=0;} 
    // offset = (y<<8) + (y<<6) + x; 
    // VGA[offset]=color; 

    __asm__ (
      "mov $0xA000,%edx;" 
      "mov $320,%ax;" 
      "mul y;" //not sure how to reference my variable here 
      "add x,%ax;" //not sure how to reference my variable here 
      "mov %ax,%bx;" 
      "mov color,%al;" //not sure how to reference my variable here 
      "mov %al,%bx:(%edx);" 


     ); 
    } 


} 

Однако я получаю несколько ошибок в компиляторе. Я не ознакомлен с встроенной сборкой GCC, поэтому любая помощь в исправлении моего кода будет оценена.

+0

Возможный дубликат [Печатать символ с встроенной сборкой в ​​C (компилятор gcc)] (http://stackoverflow.com/questions/34748733/printing-character-with-inline-assembly-in-c-gcc-compiler) – Olaf

ответ

2

Во-первых, для сегментации вам придется использовать регистр сегментов (и вы не можете загрузить 0xA000 в регистр общего назначения и использовать это). Однако ...

DJGPP имеет свой собственный «расширитель DOS» и запускает ваш код в 32-битном защищенном режиме; и сегменты работают по-разному в защищенном режиме. По этой причине вы не можете использовать сегменты, как если бы вы были в реальном режиме; и должны создать «дескриптор сегмента», который вы можете использовать со специальными библиотечными функциями. Например, см. http://www.delorie.com/djgpp/v2faq/faq18_4.html

Для встроенной сборки GCC компилятор вообще не понимает сборку и в основном просто вставляет ваш код непосредственно в вывод компилятора (возможно, после выполнения простых текстовых замещений). Из-за этого вам нужно сообщить компилятору, какие регистры используются для входов, какие регистры используются для выходов, а какие вещи (регистры, память и т. Д.) «Сбиты» (изменены вашим кодом).

Вы должны быть в состоянии найти несколько страниц в Интернете, которые описывают, как обеспечить списки ввода/вывода/клоблирования и их формат.

Примечание: DJGPP является «GCC, перенесенным в DOS», поэтому большая часть информации для GCC работает одинаково для DJGPP; и вам будет больше удачи в поиске (например, «GCC inline assembly»), чем вы будете искать «встроенную сборку DJGPP», потому что GCC все еще используется.

Смежные вопросы