NASM汇编helloworld图解
? ? NASM是一個為可移植性與模塊化而設計的一個80x86的匯編器。它支持相當多的目標文件格式,包括
Linux和''NetBSD/FreeBSD'',''a.out'',''ELF'',''COFF'',微軟16位的''OBJ''和''Win32''。
它還可以輸出純二進制文件。它的語法設計得相當的簡潔易懂,和Intel語法相似但更簡單。它
持''Pentium'',''P6'',''MMX'',''3DNow!'';
nasm下載地址
https://www.nasm.us/pub/nasm/
?
nasm helloworld程序;
section .textglobal _start;_start:mov eax, 4mov ebx, 1mov ecx, stringmov edx, lengthint 80h;exit的系統調用mov eax, 1mov ebx, 0int 80hsection .datastring: db 'hello world',0Ahlength: equ 13section .bssvar:resb 1使用nasm構建為.com程序,然后運行,如下圖,不能運行;
構建為.exe,運行,不能運行,如下;因為不是Windows下的程序;?
干完上述活有下面文件;?
下面這個程序也是nasm的helloworld;
org 0100h ;PSP前綴,程序從0100h開始運行 mov ax, cs ;初始化 ds和dx寄存器,為調用9號程序(顯示字符串)做準備 mov ds, ax mov dx, string ;取偏移地址,等價于MASM的 lea dx, string 或 mov dx, offset string mov ah, 9 int 21h MOV AH,4CH ;回到操作系統 INT 21H string db "Hello, OS world!$"?構建以后運行,也是不能運行;
看資料說,使用 nasm -f win32 *.asm 編譯出obj文件,再link,就可構建出Win下的程序;
操作如下;找不到 link 工具;
剛才下的nasm版本是解壓版的,可能不帶link;下個安裝版的;
安裝完以后,從桌面圖標進入構建環境;?
把 1.asm 拷貝到nasm安裝目錄,準備編譯和鏈接;但是看了一下,安裝目錄也沒有link工具;?
仔細看一下網上資料;原來是用VS的link工具來鏈接的;
正確的編譯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來測試你的程序了。
?下回再整;
先試一下用VC6的cl.exe能不能鏈接出來;操作如下;沒鏈接成功;下回再整;
?
nasm和masm的一些區別
1. nasm是區分大小寫的;
2. nasm中訪問內存需要使用[]將內存地址括起來;
3.?
nasm不存儲類型信息,所以也不能使用MOVS這樣沒有表明大小的命令,而只能使用MOVSW這樣的命令;
另外往內存中存放數據也需要注意:
如果寫成這樣:
? ? var equ 2
? ? mov [var], 1
會報錯,
需要寫成如下的形式:
var equ 2
mov word [var], 1
4. nasm中沒有ASSUME偽指令;
5. nasm沒有SMALL、COMPACT這樣的內存模型;
6. nasm引用浮點寄存器的方式與masm不同;
7. 聲明數據塊的方式不同:
? ? stack db 64 dup (?) ? ?; masm
? ? stack resb 64 ? ? ? ? ?; nasm
? ? nasm不支持dup,且?是一個可用的變量名;
總結
以上是生活随笔為你收集整理的NASM汇编helloworld图解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows内核工具Win64AST初
- 下一篇: Win32汇编获取和设置文本框的内容