Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Sterk от Октябрь 22, 2010, 08:19



Название: QMAKE_CXXFLAGS += -masm=intel
Отправлено: Sterk от Октябрь 22, 2010, 08:19
Пишу dll, есть необходимость делать асм вставки. AT&T асм мне не понравился,
но при переключение в режим интел асма начинают возникать ошибки на пустом( ??? ) месте.
Вот урезанный код dll'ки для вывода MessageBox`a.
При стандартном билде, без флага интела, все работает нормально.
При переходе в интел асм вылетают ошибки. Если закомментировать блок вывода
MessageBox`a(выделен в коде) то ошибок не возникает в любом варианте.
Код:
#include <QtGui/QMessageBox>
#include <QApplication>
#include <windows.h>

void WorkerThread()
{
    QApplication *pApp;
    int argc = 0;
    pApp = new QApplication(argc, 0);
    //###################
    QMessageBox m;
    m.setText("111111");
    m.show();
    //###################
    pApp->exec();
    delete pApp;
}

extern "C"// __declspec(dllexport)
bool  WINAPI  DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID /*lpvReserved*/ )
{
    if ( dwReason == DLL_PROCESS_ATTACH )
    {
        HANDLE hWorkThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)WorkerThread, NULL, 0, NULL);
        if (hWorkThread == NULL)
        {
                MessageBoxA(0,"Thread not start","",MB_OK);
                ExitProcess(0);
                return true;
        }
    }
 //   if ( dwReason == DLL_PROCESS_DETACH );

    return true;
}
.pro file:
Код:
TEMPLATE     = lib
CONFIG    += dll
#флаг для перехода
#QMAKE_CXXFLAGS += -masm=intel
SOURCES = main.cpp
TARGET = qtdll

вот что выдает QtCreator

Цитировать
error: Assembler messages:
error: Error: no such instruction: `decl DWORD PTR [eax]'
error: Error: no such instruction: `decl DWORD PTR [edx]'

я так понял что происходит ошибка при доступе к членам класса.
но не понятно почему это происходит.


Название: Re: QMAKE_CXXFLAGS += -masm=intel
Отправлено: sy от Декабрь 01, 2010, 17:04
без вставок в формате AT&T обойтись не получится, так как в формате интела не поддерживается передача С переменных в asm-вставки.
Вот пример:
Код:
int foo(void)
{
    int iAddress;
    asm
    (
     ".intel_syntax noprefix\n\t"
     "call t1\n\t"
"t1:\n\t"
     "pop eax\n\t"
     ".att_syntax\n"
    );
    __asm__ __volatile__(
            "movl %%eax,%0\n\t"
                : "=r"(iAddress)
            );
    return iAddress;
}