gpt4 book ai didi

具有非内联汇编的 Qt C++ 项目

转载 作者:行者123 更新时间:2023-12-04 18:25:50 26 4
gpt4 key购买 nike

我使用的是 Windows XP,以及带有 QtSDK 和内置 gcc 编译器的最新 Qt Creator。

问题是,如何在 C++ Qt 项目中使用完整的汇编。我知道如何使用内联汇编,但我不知道如何在 Qt C++ 项目中进行非内联(写在单独的 .asm 文件中)完整汇编。

这对于 Qt C++ 项目是否可行,如果可行,如何实现?

编辑:

*专业文件

TEMPLATE = app
CONFIG += console
CONFIG -= qt

SOURCES += \
calc.S

calc.S

section .data
hello: db 'Hello world!', 10
helloLen: equ $-hello

section .text
global _start

_start:
mov eax, 4
mov ebx, 1
mov ecx, hello
mov edx, helloLen
int 80h

proexit:
mov eax, 1
mov ebx, 0
int 80h

编译错误

..\plain_cpp\calc.S: Assembler messages:
..\plain_cpp\calc.S:1: Error: no such instruction: `section .data'
..\plain_cpp\calc.S:2: Error: no such instruction: `db 72ello world!4410'
..\plain_cpp\calc.S:3: Error: no such instruction: `equ $-hello'
..\plain_cpp\calc.S:5: Error: no such instruction: `section .text'
..\plain_cpp\calc.S:6: Error: no such instruction: `global _start'
..\plain_cpp\calc.S:9: Error: too many memory references for `mov'
..\plain_cpp\calc.S:10: Error: too many memory references for `mov'
..\plain_cpp\calc.S:11: Error: too many memory references for `mov'
..\plain_cpp\calc.S:12: Error: too many memory references for `mov'
..\plain_cpp\calc.S:13: Error: junk `h' after expression
..\plain_cpp\calc.S:13: Error: suffix or operands invalid for `int'
..\plain_cpp\calc.S:16: Error: too many memory references for `mov'
..\plain_cpp\calc.S:17: Error: too many memory references for `mov'
..\plain_cpp\calc.S:18: Error: junk `h' after expression
..\plain_cpp\calc.S:18: Error: suffix or operands invalid for `int'

编辑 2 - AT&T 风格

PRO 文件

TEMPLATE = app
CONFIG += console
CONFIG -= qt

SOURCES += \
calc.S

calc.S

.data
hello:
.string "Hello World\n"

.globl main
main:
movl $4, %eax
movl $1, %ebx
movl $hello,%ecx
movl $12,%edx
int $0x80

ret

错误

undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

最佳答案

虽然 @karlphillip 方法通常是正确的,但您应该记住一些窗口指定的东西:

  1. 当您编译 @karlphillip 的代码时,您会遇到 MinGw 标准库文件产生的链接器错误:

    c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../libmingw32.a(main.o): In function `main':
    C:\MinGW\msys\1.0\src\mingwrt/../mingw/main.c:73: undefined reference to `WinMain@16'

    那不是你的 main,那是 libmingw32.a 的 main。它期望 WinMain 作为您的 代码的入口点。问题是 WinMain 是 Microsoft 定义的 Windows 应用程序的默认入口点。 libmingw32.a 定义实际的 main,从实际的入口点调用。该 main 执行一些操作,然后调用 WinMain。但是很明显,您没有定义 WinMain

    在这个简单的例子中你实际上不需要标准库,那么你可以删除标准库并用命令行编译上面的代码

    gcc -Wl,-subsystem,console 1.S -nostdlib

    应该相当于Qt设置QMAKE_CXXFLAGS+=-nostdlib

    然后上面的代码编译,并且... segfaults。然后转到第2点:

  2. int 80h 是特定的 linux 系统调用。似乎它在 Windows 上不起作用。您应该在 Windows 上调用 WriteConsole 以写入 stdin。但作为“概念证明”,您可以运行以下代码:

    .text
    .globl main
    main:
    movl $1, %eax
    ret

    这会将程序的退出代码设置为 1。

编辑如果您想要使用包含标准库编译的 Hello world 示例,您可以试试这个:

.data
hello:
.string "Hello World\n"

.text
.global _WinMain@16
_WinMain@16:
push $hello
call _puts
add $4, %esp

ret

gcc 1.S编译

关于具有非内联汇编的 Qt C++ 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9727831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com