日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NASM汇编helloworld图解

發(fā)布時間:2025/4/14 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NASM汇编helloworld图解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? 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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。