標籤:erro 入門 技術 相容性問題 緩衝 分段 大小寫 連結 資訊
附件下載:
http://pan.baidu.com/s/1i5R9qO9 密碼:rfgk
80x86微處理器組合語言編程。學習任何程式設計語言都免不了要跨越HelloWorld這道坎,面向機器的組合語言與面向過程/對象的進階語言不同,編碼過程中對寄存器、記憶體的分配等細節都需要編程人員去關心;而進階語言程式如C語言、C++,即使你不知道printf具體是怎麼實現的,只要掌握使用方法即可(封裝成模組)。C語言的helloworld程式簡單到只有一行執行語句:
printf("Hello,World!"); //在螢幕緩衝區中顯示"Hello,World!"一串字元
而組合語言的Helloworld,同樣很簡潔,卻讓很多初學者摸不到頭腦;打一個簡單比喻,上面的printf(.....)就好比一把手槍,字串"Hello,World!"好比子彈,給printf裝上“子彈”就能完成射擊的功能。當然你也可以更換其他子彈.....組合語言要實現往螢幕緩衝區輸出字串並顯示,所需做的工作就沒有這麼直觀容易理解了。 組合語言編程,面向的是“寄存器”,寄存器是電腦CPU內部的一種超快取(速度勝過記憶體數倍,但容量極小),對資料的各種操作都由“指令”來進行,也被稱作彙編指令,比如ADD AX,BX 意思是將寄存器AX與BX的值相加,結果存放到AX;AX/BX都屬於8086通用資料寄存器。更多彙編知識將在以後篇幅中講解。
hello.asm 來源程式
1 ;80x86組合語言<入門程式> 2 ;YPP.20170928 3 ;檔案名稱Hello.asm 4 5 DSEG SEGMENT 6 MESS DB ‘Hello,World!‘ ,0DH,0AH,24H 7 DSEG ENDS 8 9 SSEG SEGMENT PARA STACK 10 DW 256 DUP(?)11 SSEG ENDS12 13 CSEG SEGMENT14 ASSUME CS:CSEG,DS:DSEG15 BEGIN: MOV AX,DSEG16 MOV DS,AX17 MOV DX,OFFSET MESS18 MOV AH,919 20 INT 21H21 MOV AH,4CH22 INT 21H23 CSEG ENDS24 END BEGIN25
初學者首先需要知道的是,組合語言程式由兩個基本元素組成:作業碼、運算元
作業碼,指明要進行的操作,如加、減、乘、除....
運算元,被操作的對象,可以是數字、字串、儲存單元(變數)等
本文不對代碼細節做過多的解釋,因為需要很多前置知識做鋪墊,才能更好的理解這段代碼。
前置知識包括,位元制換算、CPU記憶體單元定址、14個16位寄存器組、儲存空間分段、中斷機制等等
上面的代碼編輯或複製到記事本中,另存新檔.asm檔案,這是組合語言的原始碼檔案,中間要進行彙編的操作,產生的.obj檔案是目標檔案,經過連結之後,才能形成最終的可執行檔.exe,整個過程與進階語言的運行過程是大致相仿的。
工具有很多,但還是推薦經典的Masm5.0,
註:編寫80x86平台的組合語言,不要在Win-Vista\7\8.1\10的系統上操作,因為16位程式會出現相容性問題。
本文均在Windows XP sp3作業系統上編輯、彙編、連結、運行.
Masm5.0下載:http://pan.baidu.com/s/1hsjCcRi 密碼:syqo
masm無需安裝,解壓到某磁碟根目錄下,進入DOS操作
Win+R輸入CMD進入DOS,先用DOS命令進入MASM5.0檔案目錄下,同時hello.asm源檔案也要複製到同一路徑下。
彙編命令格式> masm xxx.asm 斷行符號 註:DOS下不區分大小寫
連續斷行符號,表示使用預設檔案名稱,四個斷行符號下來,會產生Hello.obj檔案;如果出現錯誤應當更改源檔案後重新彙編,
0 Warning Errors.....表示沒有錯誤。
沒有錯誤後,下一步進行“Link”連結,命令格式>link xxx
註:連結時要指定檔案名稱,就是剛剛產生的Hello.obj 可以省略尾碼,名字不要省略!不然會報錯
link hello 斷行符號 三次斷行符號後,正常情況下會產生Hello.exe 那也就是程式的最終形態,直接輸入hello就運行了這個程式(不要雙擊運行,不然DOS視窗一閃而過看不到執行結果)
HelloWorld字串被成功輸出出來,這個程式也就完成了
源檔案Hello.asm——>目標檔案Hello.obj——>可執行檔Hello.exe
這就是整個過程。
另外補充一點,由asm到obj在組合語言中,這個過程叫做“彙編Assembly”;在進階語言中叫做“編譯Compile”
有的教程中會缺少堆棧段SSEG,沒有堆棧段 在masm中也會報錯,會提示no stack segment要注意。
==========================================================
掃一掃關注公眾號[Cracker之家],及時擷取更多編程、逆向/破解等技術類軟文資訊
8086組合語言入門-HelloWorld