2012-01-17 4 views
2

Как написать этот код сборки как встроенную сборку? Компилятор: gcc (i586-elf-gcc). Синтаксис GAS меня смущает. Пожалуйста, расскажите, как написать это как встроенную сборку, которая работает для gcc.Перепишите код сборки в стиле Intel в сборку GCC

.set_video_mode: 
    mov ah,00h 
    mov al,13h 
    int 10h 

.init_mouse: 
    mov ax,0 
    int 33h 

Аналогичный вариант, который у меня есть в сборке. Я написал их отдельно как процедуры сборки, чтобы вызвать их из моей программы на C. Мне нужно вызвать эти и еще несколько прерываний от самого C.

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

Все, что я хочу сделать, это подпрограммы прерывания вызова из C. Это нормально для меня, даже для этого, используя int86(), но у меня нет исходного кода этой функции. Я хочу int86(), чтобы я мог звонить прерываниям от C.

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

+0

erm ...если вы не используете gcc для компиляции ядра в формате ELF (вам все равно нужен загрузчик), это не будет работать, потому что любая ОС, предоставляющая прямой доступ к прерываниям BIOS (например, MSDOS), не сможет запустить ваш двоичный код – sehe

+0

Я использую grub – geek1000

+0

Итак, это в основном вопрос синтаксиса? –

ответ

2

Я не проверял, но это должно вам начать работу:

void set_video_mode (int x, int y) { 
    register int ah asm ("ah") = x; 
    register int al asm ("al") = y; 

    asm volatile ("int $0x10" 
       : /* no outputs */ 
       : /* no inputs */ 
       : /* clobbers */ "ah", "al"); 
} 

Я поместил в двух «затирает» в качестве примера, но вам нужно установить правильный список clobbers, так что компилятор знает, что вы перезаписали значения регистра (может быть, нет).

+0

Глядя на это снова ... вам может потребоваться сделать два ints 'volatile', чтобы компилятор не оптимизировал их. Заметьте. – ams

+0

Также неверен синтаксис ассемблера. –

+0

@ IsmaelLuceno Я не уверен, как должен выглядеть x86-ассемблер (я в основном использую его для ARM). Точка ответа - синтаксис C "asm". Я отредактировал его, чтобы посмотреть, как некоторые другие ответы. Это лучше? – ams

0

Во-первых, имейте в виду, что GCC еще не поддерживает 16-разрядный код, поэтому вы закончите компиляцию 32-битного кода в 16-разрядном режиме, что очень неэффективно, но выполнимо (оно используется, например , Linux и SeaBIOS). Это может быть сделано следующим за попрошайничество каждого файла:

__asm__ (".code16gcc"); 

Новые версии GCC (с 4,9 IIRC) поддерживают -m16 флаг, который делает то же самое.

Кроме того, нет доступных драйверов мыши, если вы не загрузите их раньше, чем ядро ​​работает init_mouse.

Возможно, вы используете API, обычно доступный в нескольких x86 DOS.

asm может позаботиться о регистровых заданиях, так что код может быть уменьшен до:

void set_video_mode(int mode) 
{ 
    mode &= 255; 
    __asm__ __volatile__ (
     "int $0x10" 
     : "+a" (mode) /* %eax = mode & 255 => %ah = 0, %al = mode */ 
    ); 
} 

void init_mouse(void) 
{ 
    /* XXX it is really important to check the IDT entry isn't 0 */ 
    int tmp = 0; 
    __asm__ __volatile__ (
     "int $0x33" 
     : "+a" (tmp) /* %eax = 0*/ 
     :: "ebx" /* %ebx is also clobbered by DOS mouse drivers */ 
    ); 
} 

asm инструкция описана в руководстве GCC, хотя, возможно, не в достаточной глубине и не хватает примеров x86. Выходы (после первого двоеточия) имеют явно непонятный синтаксис, в то время как остальное гораздо легче понять (второй двоеточие указывает входы, а третий - забитые регистры, флаги и/или память).

Выходы должны иметь префикс =, то есть вам не важно предыдущее значение, которое оно могло иметь, или +, что означает, что вы хотите использовать его как вход. В этом контексте мы используем это вместо ввода, потому что значение изменено прерыванием, и вам не разрешено указывать входные регистры в списанном списке (потому что компилятор запрещен к их использованию).

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