編寫一個(gè)完整的匯編語言
-
匯編語言由2類指令組成
assume cs:code code segment mov ax,1122H mov bx,3344H add ax,bx mov ah,4cH int 21H code ends end
- 匯編指令
如mov龙填、add骗奖、sub等
有對(duì)應(yīng)的機(jī)器指令,可以被編譯為機(jī)器指令,最終被CPU執(zhí)行 - 偽指令
如assume、segment访敌、ends翩伪、end等
沒有對(duì)應(yīng)的機(jī)器指令,由編譯器解析戒职,最終不被CPU執(zhí)行
- 匯編指令
-
注釋以分號(hào)開頭
偽指令 - segment,ends透乾,end
assume cs:code
code segment
mov ax,1122H
mov bx,3344H
add ax,bx
mov ah,4cH
int 21H
code ends
end
- segment和ends的作用是定義一個(gè)段洪燥,segment代表一個(gè)段的開始,ends代表一個(gè)段的結(jié)束乳乌,使用格式為
段名 segment
:
段名 ends
- 一個(gè)有意義的匯編程序中捧韵,至少要有一個(gè)段作為代碼段存放代碼
- assume
- 將用作代碼段的code段和CPU中的CS寄存器關(guān)聯(lián)起來
- end
- 編譯遇到end是,就結(jié)束對(duì)源程序的編譯
- 下面2句代碼的作用是退出程序
mov ah,4cH
int 21H
- 也可以寫成
mov ax,4c00H
int 21H
中斷
- 中斷
- 中斷是由于軟件的或硬件的信號(hào)汉操,使得CPU暫停當(dāng)前的任務(wù)再来,轉(zhuǎn)而去執(zhí)行另一段子程序
-也就是說,在程序運(yùn)行過程中磷瘤,系統(tǒng)出現(xiàn)了一個(gè)必須由CPU立即處理的情況芒篷,此時(shí),CPU暫時(shí)終止當(dāng)前程序的執(zhí)行轉(zhuǎn)而處理這個(gè)新事件的過程就叫做中斷
- 中斷是由于軟件的或硬件的信號(hào)汉操,使得CPU暫停當(dāng)前的任務(wù)再来,轉(zhuǎn)而去執(zhí)行另一段子程序
- 中斷的分類
- 硬中斷(外中斷)采缚,由外部設(shè)備(比如網(wǎng)卡针炉、硬盤)隨機(jī)引發(fā)的,比如當(dāng)前網(wǎng)卡收到數(shù)據(jù)包的時(shí)候扳抽,就會(huì)發(fā)出一個(gè)中斷
- 軟中斷(內(nèi)中斷)篡帕,由執(zhí)行中斷指令產(chǎn)生的,可以通過程序控制觸發(fā)
從本質(zhì)上來講摔蓝,中斷是一種電信號(hào)赂苗,當(dāng)設(shè)備有某種事件發(fā)生時(shí),它就會(huì)產(chǎn)生中斷贮尉,通過總線把電信號(hào)發(fā)送給中斷控制器拌滋。如果中斷的線是激活的,中斷控制器就把電信號(hào)發(fā)送給處理器的某個(gè)特定引腳猜谚。處理器于是立即停止自己正在做的事败砂,跳到中斷程序的入口點(diǎn),進(jìn)行中斷處理魏铅。
- 可以通過int n產(chǎn)生中斷
- n是中斷碼昌犹,內(nèi)存中有一張中斷向量表,用來存放中斷碼對(duì)應(yīng)的中斷處理程序的入口地址
- CPU在接收到中斷信號(hào)后览芳,暫停當(dāng)前正在執(zhí)行的程序斜姥,跳轉(zhuǎn)到中斷碼對(duì)應(yīng)的中斷向量表地址處,去執(zhí)行中斷處理程序
- 常見中斷(中斷向量表)
- int 10H用于執(zhí)行BIOS中斷
- int 3是"斷點(diǎn)中斷",用于調(diào)試程序
- int 21H用于執(zhí)行DOS系統(tǒng)功能調(diào)用铸敏,AH寄存器存儲(chǔ)功能號(hào)
DOS系統(tǒng)功能調(diào)用
- DOS系統(tǒng)功能調(diào)用
- 由DOS提供的一組實(shí)現(xiàn)特殊功能的子程序供程序員在編寫自己的程序時(shí)調(diào)用缚忧,以減輕編程的工作量
- 涉及屏幕顯示、文件管理杈笔、I/O管理等等
- 每個(gè)子程序 都有一個(gè)功能號(hào)闪水,所有的功能調(diào)用的格式都是一致的。調(diào)用的步驟大致如下
- 系統(tǒng)功能號(hào)送到寄存器AH中
- 入口參數(shù)送到指定的寄存器中
- 用int 21H指令執(zhí)行功能調(diào)用
- 根據(jù)出口參數(shù)分析功能調(diào)用執(zhí)行情況
;----數(shù)據(jù)段----
data segment
string db 'Hello World!$'
data ends
mov ax,data
mov ds,ax ;設(shè)置ds為數(shù)據(jù)段
mov ah,9H ;功能號(hào)9H代表在屏幕顯示字符串
mov dx,offset string ;ds: dx代表字符串地址
int 21H ;執(zhí)行DOS系統(tǒng)功能調(diào)用
emu8086常用快捷鍵
- F5:調(diào)試運(yùn)行
- F4:重新加載
- F8:下一步(單步執(zhí)行)
- F9:直接一步到位運(yùn)行整個(gè)程序
-
Ctrl + F8:跳過前面代碼蒙具,斷點(diǎn)到單擊選中的代碼那行