Russian Qt Forum
Ноябрь 24, 2024, 10:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QMAKE_CXXFLAGS += -masm=intel  (Прочитано 3751 раз)
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]'

я так понял что происходит ошибка при доступе к членам класса.
но не понятно почему это происходит.
« Последнее редактирование: Октябрь 22, 2010, 08:38 от Sterk » Записан
sy
Гость
« Ответ #1 : Декабрь 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;
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.061 секунд. Запросов: 20.