X86彙編6.編寫彙編語言程序

最近學習了X86彙編,其實無論是古老的8086還是現在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位數,尋址空間,寄存器個數,指令集的擴充等方面有所不同,對於學習,8086永不過時。

1.程序從寫入到執行的過程
(1)編寫彙編程序代碼===>輸出程序文件,helloworld.asm 或 helloword.s(一般linux下用.S命名彙編文件)
(2)對代程序代碼進行編譯和鏈接
編譯就是: 源碼文件---編譯--->目標文件
鏈接就是: 目標文件---鏈接--->可執行程序
可執行程序包含兩部分:(1)代碼(彙編指令翻譯過來的機器碼)和數據(程序中定義的數據),前面說過,無論是代碼還是數據,都是二進制的(2)相關的描述信息,如:程序多大,佔用多少內存空間,哪裏是代碼,哪裏是數據
(3)執行可執行程序,操作系統依照可執行程序文件中的描述信息,將可執行程序的機器碼和數據加載如內存,並進行初始化(如:CS:IP指向第一條要執行的指令),然後CPU開始執行程序。

2.程序
彙編指令:有對應機器碼的指令,可以被編譯爲機器指令
僞指令:不被CPU執行,沒有對應的機器指令,是由編譯器來執行的指令,編譯器根據僞指令來進行相關的編譯操作。
示例:
assume cs:codesg
codesg segment
mov ax, 0123H
mov bx, 0456H
add ax, bx
mov ax,4c00H
int 21H
codesg ends
end
(1)僞指令segment...ends
格式:
XXX segment ;定義一個一個段開始,名稱爲XXX
XXX ends ;定義一個段結尾,名稱爲XXX
釋義:segment...ends指令對,定義一個段XXX。
(2)end
end是一個彙編程序結束的標誌。
(3)assume
表示假設,它假設某一段寄存器和程序中的某一個sgment...ends定義的段相關聯,上面示例assume cs:codesg就是將代碼段codesg和CPU中的段寄存器cs聯繫起來。

標號:代表一個地址,最終被鏈接器處理爲一個段的段地址
程序結構:段、彙編指令,段和cs關聯,程序返回,程序結束標誌

編譯(linux環境): nasm -felf64 hello.asm
鏈接(linux環境): ld -o hello hello.o

3.程序運行環境
在dos環境下,CPU是實時模式運行的,我們的彙編代碼可以寫入任何地址。
在非dos環境下,如:windows 2000/xp/7/8/10下,CPU是保護模式運行,即使是彙編代碼也不允許訪問一些嚴格保護的內存單元。

4.模塊化程序設計
call與ret共同支持了彙編語言的模塊化設計,也就是函數。用寄存器來存儲參數和結果是最常使用的方法。對於存放參數的寄存器和存放結果的寄存器,調用者和子程序的讀寫操作恰恰相反:調用者將參數送入參數寄存器,從結果寄存器中取到返回值,子程序從參數寄存器中取到參數,將返回值送入結果寄存器。
多個參數的傳遞:將參數存入一段內存地址,然後將段地址傳到寄存器,傳給程序。類似於C語言傳指針,但本質是用棧存參數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章