реклама на сайте
подробности

 
 
> Использование ассемблера в MinGW, вопросики...
Виктория
сообщение Aug 27 2009, 07:52
Сообщение #1


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Осваиваем инлайновский ассемблер в MinGW.
Текст функции
Код
/******* Вывод байта в порт *******/
void outportb(unsigned addr,        // адрес регистра
                      unsigned char data)    // данные для записи
{
      asm(“mov %%eax, %2; \        // шаблон кода на ассемблере для
               out %1, %%al;”          // вывода байта в порт
               :                    // выходных переменных нет
               : “r” (addr), “r” (data)        // список входных операндов
               : “%%eax”, “%%al”);        // используемые регистры
}


1) Компилятор не желает передавать параметры через короткие регистры, даже для unsigned char (кто-нибудь знает какая, кстати, у него длина в Минималисте?). Поэтому используем eax.

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

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

Плиз, помогите. Может у кого-нибудь были похожие ситуации и в другом gcc (не обязательно под Windows, для любого МК)? Передать, естеств., хотелось бы байт. Т.к. это для учебной лабы.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Виктория
сообщение Aug 27 2009, 12:33
Сообщение #2


инженер
****

Группа: Свой
Сообщений: 520
Регистрация: 19-09-05
Из: Самара
Пользователь №: 8 701



Проблема, что запуск из-под Windows XP. Так что немножко времени необходимо для чтения про корректность постановки задачи. Хотя ключей для запуска приложения в NetBeans штук 5 (тоже надо бы разобраться!).


...

Нет, оказывается из-за запуска из под NetBeans. Нет никакого защищенного режима. При трансляции Минималистом в командной строке и запуска оттуда же всё работает.
Пробую варианты...

Спасибо всем!

А что означают буковки "a" и "Nd"? blush.gif У нас нет никакой литературы по gcc, кроме Артура Гриффитса "GCC. Настольная книга..."
Go to the top of the page
 
+Quote Post
ReAl
сообщение Aug 27 2009, 14:42
Сообщение #3


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Виктория @ Aug 27 2009, 15:33) *
А что означают буковки "a" и "Nd"? blush.gif У нас нет никакой литературы по gcc, кроме Артура Гриффитса "GCC. Настольная книга..."


http://gcc.gnu.org/onlinedocs/gcc/Constrai...tml#Constraints

a - это для данного аргумента годится только eax
%b0 - это от нулевого аргумента нас интересует байт, т.е. %al

Nd - это для данного аргумента подходит 8-битная константа либо регистр edx

Код
uint16_t base;

inline uint8_t
read(unsigned addr)
{
    uint8_t value;
    __asm__ __volatile__(
        "inb %w1, %0"
        : "=a"(value)
        : "Nd"(addr)
    );
    return value;
}

uint8_t a, b;

void test(void)
{
    a = read(0xB0);   // тут будет непосредственный адрес
    b = read(base);    // тут в DX загрузится значение переменной
    a = read(0x3B0);  // тут в DX загрузится константа, которая не лезет в 8 бит
}

gcc -O2 -fomit-frame-pointer -S
Код
_test:
    inb $176, %al                     <--- это от   a = read(0xB0);
    movzwl    _base, %edx      <--- это от   b = read(base);
    movb    %al, _a              <--- это от   a = read(0xB0);
    inb %dx, %al                      <--- это от   b = read(base);
    movl    $944, %edx                <--- это от   a = read(0x3B0);
    movb    %al, _b              <--- это от   b = read(base);
    inb %dx, %al                      <--- это от   a = read(0x3B0);
    movb    %al, _a              <--- это от   a = read(0x3B0);
    ret


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th July 2025 - 22:00
Рейтинг@Mail.ru


Страница сгенерированна за 0.01371 секунд с 7
ELECTRONIX ©2004-2016