NASM汇编helloworld图解
? ? NASM是一個為可移植性與模塊化而設(shè)計的一個80x86的匯編器。它支持相當(dāng)多的目標(biāo)文件格式,包括
Linux和''NetBSD/FreeBSD'',''a.out'',''ELF'',''COFF'',微軟16位的''OBJ''和''Win32''。
它還可以輸出純二進(jìn)制文件。它的語法設(shè)計得相當(dāng)?shù)暮啙嵰锥?#xff0c;和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的系統(tǒng)調(diào)用mov eax, 1mov ebx, 0int 80hsection .datastring: db 'hello world',0Ahlength: equ 13section .bssvar:resb 1使用nasm構(gòu)建為.com程序,然后運行,如下圖,不能運行;
構(gòu)建為.exe,運行,不能運行,如下;因為不是Windows下的程序;?
干完上述活有下面文件;?
下面這個程序也是nasm的helloworld;
org 0100h ;PSP前綴,程序從0100h開始運行 mov ax, cs ;初始化 ds和dx寄存器,為調(diào)用9號程序(顯示字符串)做準(zhǔn)備 mov ds, ax mov dx, string ;取偏移地址,等價于MASM的 lea dx, string 或 mov dx, offset string mov ah, 9 int 21h MOV AH,4CH ;回到操作系統(tǒng) INT 21H string db "Hello, OS world!$"?構(gòu)建以后運行,也是不能運行;
看資料說,使用 nasm -f win32 *.asm 編譯出obj文件,再link,就可構(gòu)建出Win下的程序;
操作如下;找不到 link 工具;
剛才下的nasm版本是解壓版的,可能不帶link;下個安裝版的;
安裝完以后,從桌面圖標(biāo)進(jìn)入構(gòu)建環(huán)境;?
把 1.asm 拷貝到nasm安裝目錄,準(zhǔn)備編譯和鏈接;但是看了一下,安裝目錄也沒有l(wèi)ink工具;?
仔細(xì)看一下網(wǎng)上資料;原來是用VS的link工具來鏈接的;
正確的編譯helloworld.asm的命令如下:
nasm -f win32 helloworld.asm
使用以上命令NASM生成一個名為helloworld.obj的文件。
現(xiàn)在要使用鏈接器將.obj文件鏈接到.exe文件中。打開Visual Studio Command Prompt然后輸入如
下內(nèi)容:
link.exe helloworld.obj libcmt.lib?
// or?
cl.exe helloworld.obj /link libcmt.lib
printf()函數(shù)通過libcmt.lib(此庫屬于C運行時庫)被靜態(tài)包含。如果你省略了libcmt.lib的話你將得
到錯誤error LNK2001: unresolved external symbol _printf
現(xiàn)在你可以執(zhí)行helloworld.exe來測試你的程序了。
?下回再整;
先試一下用VC6的cl.exe能不能鏈接出來;操作如下;沒鏈接成功;下回再整;
?
nasm和masm的一些區(qū)別
1. nasm是區(qū)分大小寫的;
2. nasm中訪問內(nèi)存需要使用[]將內(nèi)存地址括起來;
3.?
nasm不存儲類型信息,所以也不能使用MOVS這樣沒有表明大小的命令,而只能使用MOVSW這樣的命令;
另外往內(nèi)存中存放數(shù)據(jù)也需要注意:
如果寫成這樣:
? ? var equ 2
? ? mov [var], 1
會報錯,
需要寫成如下的形式:
var equ 2
mov word [var], 1
4. nasm中沒有ASSUME偽指令;
5. nasm沒有SMALL、COMPACT這樣的內(nèi)存模型;
6. nasm引用浮點寄存器的方式與masm不同;
7. 聲明數(shù)據(jù)塊的方式不同:
? ? stack db 64 dup (?) ? ?; masm
? ? stack resb 64 ? ? ? ? ?; nasm
? ? nasm不支持dup,且?是一個可用的變量名;
總結(jié)
以上是生活随笔為你收集整理的NASM汇编helloworld图解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Windows内核工具Win64AST初
- 下一篇: Win32汇编获取和设置文本框的内容