使用NASM和CL(或LINK)寫HelloWorld

duweix發表於2014-02-25

原文地址:http://www.tech-juice.org/2011/02/26/assembler-tutorial-hello-world-with-nasm-and-cl-exe-or-link-exe/


前言

...


編譯彙編程式碼

我們來編譯連結這個名為helloworld.asm的彙編程式碼

; This is a Win32 console program that writes "Hello, World" on one line and
; then exits.  It needs to be linked with a C library.
 
global  _main
extern  _printf
 
section .text
_main:
push    message
call    _printf
add     esp, 4
ret
message:
db      'Hello, World', 10, 0
正如你所看到的我們使用printf來列印出Hello, World。這個函式使用了extern,因為它是匯入函式(它屬於C執行時庫)。

Paul Carter的教程中提供了用於編譯例子程式碼的命令

; To assemble for Microsoft Visual Studio
 
; nasm -f win32 -d COFF_TYPE asm_io.asm

遺憾的是語法錯誤。-d開關似乎在NASM2.09.04版本中被廢棄,它不起任何作用。表示檔案型別的win32看上去是沒問題的(它表示檔案輸出格式為win32)。

正確的編譯helloworld.asm的命令如下:

nasm -f win32 helloworld.asm
使用以上命令NASM生成一個名為helloworld.obj的檔案。現在我們要使用連結器將.obj檔案連結到.exe檔案中。開啟Visual Studio Command Prompt然後輸入如下內容:

link.exe helloworld.obj libcmt.lib
 
// or
 
cl.exe helloworld.obj /link libcmt.lib
printf()函式通過libcmt.lib(此庫屬於C執行時庫)被靜態包含。如果你省略了libcmt.lib的話你將得到錯誤error LNK2001: unresolved external symbol _printf


現在你可以執行helloworld.exe來測試你的程式了。


相關文章