[英]Assembly on Windows
我對在Windows上進行最少的匯編編程感興趣。 沒有GUI,只有一個普通的舊.exe
程序,它將向控制台輸出一些字符。 為了查看是否甚至可以在Windows上簡單地編譯和運行程序集,我嘗試了以下操作:
test.s:
ret
命令行:
gcc test.s
我得到了以下錯誤:
在函數“ main”中:對“ WinMain”的未定義引用
所以問題是我該如何將簡單的匯編程序什么都不做的程序編譯為Windows可執行文件? 我需要在每個程序中定義WinMain
嗎? 它是gcc
的標志嗎?
我並不在乎我使用哪個匯編程序,但是如果有人知道gcc
( gas
), masm
和其他匯編程序是否相同,那也很好。
您說要進行純粹或干凈的組裝,這是按照這些原則進行的嗎?
摘自《匯編程序員入門》
語言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
這個程序的字面意思是“什么都不做”,但是它只是一個純粹的錯誤,什么也沒做。
如果您想在Windows中進行編程而無需C的幫助,則必須使用WIN32 api進行編程,您可以在網上找到對該api的引用,該引用稱為win.hlp
win32.hlp
,它似乎在此網絡上-頁
也許是一個方便的鏈接-> MASM 6.1文檔
編輯:使用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
標志進行編譯來獲得c / c ++程序的程序集清單( -masm=intel
為您提供intels語法)。
也就是說,您需要為鏈接器指定一個entry point
,以知道代碼從哪里開始,還需要為代碼創建一個text segment
,這是一個非常簡單的示例,返回1
;
.text
.intel_syntax noprefix
.globl _main
_main: // entry point!
mov eax, 1
ret
gcc [file].s
產生a.exe
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.