2014-01-21 56 views
2

我对在Windows上进行最小程序集编程感兴趣。没有GUI,只是一个简单的旧的.exe程序,它将打印几个字符到控制台。为了看看它甚至可以简单地编译和运行在Windows组件,我试过如下:在Windows上汇编

test.s:

ret 

命令行:

gcc test.s 

我得到了以下错误:

In function 'main': undefined reference to 'WinMain'

所以问题是如何去编译一个简单的程序集do- Windows程序没有任何程序?我需要在每个程序中定义WinMain吗?它是gcc的标志吗?

我真的不关心我使用的汇编程序,但如果有人知道,如果这是gccgas),masm等装配相同的不同,那将是很好了。

+0

我会建议得到MASM32,并与工作。 –

+0

你可能想先看看这个问题:http://stackoverflow.com/questions/1023593/how-to-write-hello-world-in-assembler-under-windows – PhiS

回答

1

你说你想要干净大会,这是沿着这些线?从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,只是什么都不做。

如果你想在没有C的帮助窗口编程,你将不得不使用Win32 API编程,你可以找到这个API在网络上被称为win.hlpwin32.hlp一个参考,它似乎是对这个web-page

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


编辑:使用as气体)& ld;

.globl _start 

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

compile;

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 

拆卸部分。文本:

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

干脆把ret是不会让你走得很远,你可以通过与-S标志编译得到你的C/C++程序的汇编清单(-masm=intel为您提供了英特尔的语法)。

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

.text 
    .intel_syntax noprefix 
    .globl _main 

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

gcc [file].s yeilds a.exe

+1

编译这仍然给我同样的错误如上。 – baruch

+0

此外,使用-S编译会给我需要与C标准库链接的程序集。我想干净的程序集 – baruch

+0

看到我的编辑了吗? – James