【问题标题】:Assembly on Windows在 Windows 上组装
【发布时间】:2014-01-21 19:47:11
【问题描述】:

我有兴趣在 Windows 上进行最小的汇编编程。没有 GUI,只是一个普通的旧 .exe 程序,它将在控制台打印几个字符。为了看看是否可以在 Windows 上简单地编译和运行程序集,我尝试了以下方法:

test.s:

ret

命令行:

gcc test.s

我收到以下错误:

在函数“main”中:未定义对“WinMain”的引用

所以问题是如何将一个简单的无操作程序集编译为 Windows 可执行文件?我需要在每个程序中定义WinMain 吗?是gcc的标志吗?

我真的不在乎我使用哪个汇编器,但如果有人知道这对于gcc(gas)、masm 和其他汇编器是否相同或不同,那也很好。

【问题讨论】:

标签: windows assembly


【解决方案1】:

你说你想要 pureclean 组装,是这样吗?

取自The Assembly Programmers Master Book
语言masm32汇编器,链接器ml,link

来源;

.586P
; Flat memory model
.MODEL FLAT, STDCALL
;---------------------------------------
; Data segment
_DATA SEGMENT

_DATA ENDS
; Code segment
_TEXT SEGMENT
START:
    RET  ; Exit
_TEXT ENDS
END START

组装和链接;

ML /c /coff PROG1.ASM
LINK /SUBSYSTEM:WINDOWS PROG1.0BJ

这个程序的字面意思是“什么都不做”,但它是纯粹的 masm,什么都不做。

如果你想在 windows 中编程而不需要 C 的帮助,你将不得不使用 WIN32 api 进行编程,你可以在网上找到这个 api 的引用,称为 win.hlp win32.hlp ,它似乎在这个web-page

也许是一个方便的链接 -> MASM 6.1 Documentation


编辑:使用as (gas) & ld;

.globl _start

_start: // ld looks for _start by default
    movl $22, %eax // AT&T syntax
    ret

编译;

c:\Users\James\Desktop\asm\>as file.s

c:\Users\James\Desktop\asm\>ld a.out

c:\Users\James\Desktop\asm\>a.exe

c:\Users\James\Desktop\asm\>echo %errorlevel%
22

段.text的反汇编:

00401000 <_start>:
  401000:       b8 16 00 00 00          mov    $0x16,%eax
  401005:       c3                      ret
  401006:       90                      nop
  401007:       90                      nop

简单地输入ret 不会让您走得太远,您可以通过使用-S 标志(-masm=intel 为您提供 intel 语法)进行编译来获取 c/c++ 程序的汇编列表。

也就是说你需要为链接器指定一个entry point 才能知道代码从哪里开始,你还需要为代码创建一个text segment,这是一个真的简单示例返回1;

    .text
    .intel_syntax noprefix
    .globl _main

_main: // entry point!
    mov eax, 1
    ret

gcc [file].s 输出a.exe

【讨论】:

  • 另外,使用 -S 编译会给我需要与 C 标准库链接的程序集。我想要干净的组装
  • 我不知道你是怎么出错的,我只是在两台不同的计算机上编译了这段代码,同时在 linux 和 windows 下运行???
  • 我在 Windows 上试了一下,得到了那个错误。你用的是哪个 gcc?
  • 输入gcc --version 输出gcc (rev2, Built by MinGW-builds project) 4.8.1 Copyright (C) 2013 Free Software Foundation, Inc.,使用asld 以另一种方式编辑
猜你喜欢
  • 2011-06-10
  • 2014-06-26
  • 2016-06-05
  • 2013-12-25
  • 2018-06-16
  • 2018-09-29
  • 2014-02-07
  • 2019-01-07
  • 2013-11-27
相关资源
最近更新 更多