我在过去几周一直在学习C ++和x64汇编,并希望使用Qt IDE进行GUI编程。问题是我找不到链接和编译包含汇编代码的文件的方法。我一直在浏览互联网和这个网站而没有找到任何帮助。
这是我到目前为止所尝试的内容: 的.pro
QMAKE_CXXFLAGS += -save-temps
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test---
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
QMAKE_EXTRA_COMPILERS += nasm
SOURCES += main.cpp\
mainwindow.cpp\
asm.s
HEADERS += mainwindow.h
FORMS += mainwindow.ui
mainwindow.cpp
//code
extern "C" __int64 assembly();
//code
void MainWindow::on_pushButton_clicked()
{
int zahl = assembly(); // place what the assembly function return into "zahl"
}
asm.s
.code
.global
assembly proc
mov rax, 1
ret
xor rax, rax
assembly endp
end
尝试编译项目会导致以下错误消息:
mainwindow.obj:-1: Fehler: LNK2019: unresolved external symbol assembly referenced in function "private: void __cdecl MainWindow::on_pushButton_clicked(void)" (?on_pushButton_clicked@MainWindow@@AEAAXXZ)
我还为控制台应用程序找到了一个关于此的设置指南。但它似乎不适合GUI应用程序:http://dvisagie.blogspot.de/2011/09/setting-up-qt-creator-for-assemblylinux.html
以下是我在Visual Studio中编译程序集文件的方法: 的.cpp:
#include "stdafx.h"
#include<iostream>
using namespace std;
extern "C" __int64 _stdcall assembly();
int main()
{
cout << assembly() << endl;
system("pause");
return 0;
}
.ASM: 。码 汇编过程
mov rax, 1234
ret
xor rax, rax
assembly endp
end
答案 0 :(得分:1)
代码应如下所示(在您的专业文件中)。第一个编译器(nasm)从asm文件生成lst文件。然后第二个编译器(nasm_ld)运行ld以生成目标文件。
对于nasm编译器, var slideIndex = 1;
var length = $(".tile").length;
$( "#right" ).click(function() {
if(slideIndex != 1){
$( ".tile" ).animate({ "left": "+=365px" }, "1000" );
slideIndex--;
}
});
$( "#left" ).click(function() {
if(slideIndex >= length-1 ){
}else{
$( ".tile" ).animate({ "left": "-=365px" }, "1000" );
slideIndex++;
}
});
是它从中读取的输入变量,并将生成的lst的名称写入ASM_FILES
,该名称由nasm_ld处理,并且对象添加到{{ 1}},它应该为链接器提供。
LST_FILES
编辑:我已根据评论更新了代码。试试这是否有效。它应该编译asm文件并将目标文件添加到链接器。请先删除自定义构建步骤。
答案 1 :(得分:0)
我可以使用以下prom文件使用asm文件编译64位MSVC 2017。 注意:我正在使用MDd和MD cxx标志构建静态库,以便可以将库静态链接到另一个项目,但是pro文件底部的ASM部分仍然可以正常工作。
TEMPLATE = lib
TARGET = mystaticlib
INCLUDEPATH += .
CONFIG -= qt
CONFIG += staticlib
CONFIG -= debug_and_release debug_and_release_target
LIBS += -lws2_32
QMAKE_CXXFLAGS_DEBUG += /MDd
QMAKE_CXXFLAGS_RELEASE += /MD
win32: DESTDIR = ./
OBJECTS_DIR = ./.obj
HEADERS += myheader.h
SOURCES += mysource.cpp
#add additional compiler for asm source using MS 2017 macro assembler 64 bit
ml64.name = ML64 ${QMAKE_FILE_IN}
ml64.input = ASM_FILES
ml64.variable_out = OBJECTS
ml64.commands = ML64 /c ${QMAKE_FILE_NAME} /Fo ${QMAKE_FILE_OUT}
ml64.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${first(QMAKE_EXT_OBJ)}
ml64.CONFIG += target_predeps
QMAKE_EXTRA_COMPILERS += ml64
ASM_FILES += \
myx64.asm