程式語言 - JWasm - Hello, world!



參考資訊:
https://www.masm32.com/

經典的Hello, world!程式框架總是能夠讓人細心品味一款程式語言的美好,司徒就使用一個簡單的Message對話盒來展現Hello, world!框架

main.s

   .386
    .model flat,stdcall
    option casemap:none
  
include /opt/wadk/masm32/include/windows.inc
include /opt/wadk/masm32/include/kernel32.inc
include /opt/wadk/masm32/include/user32.inc
  
    .data
szCaption db "main",0
szContent db "Hello, world!",0
  
    .code
start:
    invoke MessageBox, NULL, offset szContent, offset szCaption, MB_OK
    invoke ExitProcess, 0
end start

Line 1:CPU指令
Line 2:記憶體類型是flat,calling convention使用stdcall
Line 3:程式區分大小寫
Line 5~7:Header檔案
Line 9:初始化的資料區段
Line 10~11:初始化的Global變數,型態是byte(char)且最後一個byte是0
Line 13:程式區段
Line 14:程式進入點
Line 15:顯示Message對話盒,invoke是一個偽指令,最終會展開成call + push的綜合指令
Line 16:結束Process並且釋放相關資源
Line 17:檔案結尾,end指令後的程式將不會被編譯

Makefile

export OBJASM_PATH=/opt/wadk/objasm_linux

TARGET   = main
MYWINE   = WINEPREFIX=~/.wine_x86 box86 wine
CFLAGS   = -coff
LDFLAGS  = -lgdi32
LDFLAGS += -luser32
LDFLAGS += -ladvapi32
LDFLAGS += -lkernel32
LDFLAGS += -e _start@0

all:
	uasm ${CFLAGS} ${TARGET}.s
	i686-w64-mingw32-ld ${TARGET}.o -o ${TARGET}.exe ${LDFLAGS}

run:
	${MYWINE} ${TARGET}.exe

clean:
	rm -rf ${TARGET}.exe ${TARGET}.o

編譯、執行

$ make
$ make run