Цитата(Виктория @ Aug 27 2009, 12:52)

2) Компилятор ругается на строчку с out (неправильный суффикс или операнд?), причём ругается именно на al (т.е. при замене out на mov - одно и тоже сообщение об ошибке). Непонятно

У Вас строковый литерал (собственно ассемблерная вставка) распался на две строки.
Кроме этого я вижу тут следующие неприятности:
1. В as для i386 символом начала комментария является '#', а вовсе не точка с запятой (';') как у Вас. Ну еще, кажется, можно использовать /* вот такие */ комментарии, как в C. В вышеприведенном случае ассемблер должен ругаться на "мусор" после команды (начиная с символа ';').
2. Вы поместили сразу две ассемблерные команды в одну строку, поэтому ассемблер будет считать вторую команду продолжением комментария (если Вы исправите предыдущий пункт, заменив '';' на '#'). Перед каждой ассемблерной инструкцией (кроме первой) надо добавлять перевод строки и отступ (обычно ставят табуляцию), чтобы каждая новая инструкция была в новой строке.
3. Нумерация параметров ассемблерной вставки ведется с нуля, а не с единицы, то есть вместо "%1" и "%2" должно быть "%0 и "%1" соответственно.
4. В списке "испорченных" регистров указывается только имя регистра, без символа процентов.
5. Совершенно необязательно (часто даже вредно) выполнять загрузку данных в регистры в ассемблерной вставке. Лучше доверить это компилятору.
6. Адрес порта команд out, насколько я знаю, 16-битный, а не 32-битный.
7. По-моему, вывод 8-битных данных выполняется командой outb, а не out (я ассемблер i386 практически не знаю, так что проверяйте сами).
8. Адрес порта должен загружаться не в любой регистр, а непременно в dx.
9. Перепутаны аргументы команды out.
Вот, как мне кажется, будет более правильно:
Код
#include <stdint.h>
void outportb(uint16_t addr, uint8_t data)
{
asm("outb %0, %1" :: "a"(data), "d"(addr));
}
Результат компиляции:
Код
outportb:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %edx
movb 12(%ebp), %al
#APP
outb %al, %dx
#NO_APP
leave
ret
Цитата(Виктория @ Aug 27 2009, 12:52)

3) Тип void тоже почему-то не понимает... Придется вводить фиктивную выходную переменную типа int, например.
Чтооо??? Это какая версия GCC не понимает тип void?

Напишите подробнее, что за проблема с void.
Сообщение отредактировал alx2 - Aug 27 2009, 11:18