Russian Qt Forum

Qt => Общие вопросы => Тема начата: lem от Август 13, 2011, 16:11



Название: inline assembler
Отправлено: lem от Август 13, 2011, 16:11
здравствуйте, уважаемые программисты :)
я начинаю разбираться с inline assembler в qt и на первой же тестовой программе столкнулся с проблемой:

код:

Цитировать
void MainWindow::on_pushButton_clicked()
{
    int x;
    asm("mov %[var],5" : [var]"=r"(x));
    QMessageBox box;
    box.setText(QString::number(x));
    box.exec();
}

по идее после нажатия кнопки должен появиться messagebox с текстом "5" , но вместо этого происходит неожиданное завершение программы с кодом "0". объясните пожалуйста в чем причина происходящего. :)


Название: Re: inline assembler
Отправлено: merke от Август 13, 2011, 19:40
Код
ASM
asm("mov %1,%0" : "=r"(x) : "r"(10));


Название: Re: inline assembler
Отправлено: lem от Август 13, 2011, 20:46
спасибо, сработало. но код:
int x;
    asm("mov %1,5" : "=r"(x));
    QMessageBox box;
    box.setText(QString::number(x));
    box.exec();

не сработал. объясни плз в чем причина


Название: Re: inline assembler
Отправлено: LisandreL от Август 13, 2011, 22:21
не сработал. объясни плз в чем причина
Причина в том, что синтаксис ассемблера тут ожидается AT&T'шный, а не видимо привычный вам Intel'овский.
Код
C++ (Qt)
asm("mov $10,%0" : "=r"(x) );
Т.е.:
1) порядок операторов обратный к тому, который вы ожидаете.
2) Числа предваряются знаком доллара.


Название: Re: inline assembler
Отправлено: merke от Август 14, 2011, 06:50
http://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html


Название: Re: inline assembler
Отправлено: lem от Август 14, 2011, 10:46
спасибо большое. если Вам не сложно, дайте пожалуйста ссылку на литературу по поводу использование api в ассемблере (все что я нашел это ttp://asm.sourceforge.net/syscall.html).