簡體   English   中英

在Windows上組裝

[英]Assembly on Windows

我對在Windows上進行最少的匯編編程感興趣。 沒有GUI,只有一個普通的舊.exe程序,它將向控制台輸出一些字符。 為了查看是否甚至可以在Windows上簡單地編譯和運行程序集,我嘗試了以下操作:

test.s:

ret

命令行:

gcc test.s

我得到了以下錯誤:

在函數“ main”中:對“ WinMain”的未定義引用

所以問題是我該如何將簡單的匯編程序什么都不做的程序編譯為Windows可執行文件? 我需要在每個程序中定義WinMain嗎? 它是gcc的標志嗎?

我並不在乎我使用哪個匯編程序,但是如果有人知道gccgas ), 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文檔


編輯:使用asgas )& 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM