編寫一個完整的匯編語言
-
匯編語言由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等
有對應的機器指令,可以被編譯為機器指令,最終被CPU執行 - 偽指令
如assume、segment、ends、end等
沒有對應的機器指令,由編譯器解析,最終不被CPU執行
- 匯編指令
-
注釋以分號開頭
匯編注釋
偽指令 - 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的作用是定義一個段,segment代表一個段的開始,ends代表一個段的結束,使用格式為
段名 segment
:
段名 ends
- 一個有意義的匯編程序中,至少要有一個段作為代碼段存放代碼
- assume
- 將用作代碼段的code段和CPU中的CS寄存器關聯起來
- end
- 編譯遇到end是,就結束對源程序的編譯
- 下面2句代碼的作用是退出程序
mov ah,4cH
int 21H
- 也可以寫成
mov ax,4c00H
int 21H
中斷
- 中斷
- 中斷是由于軟件的或硬件的信號,使得CPU暫停當前的任務,轉而去執行另一段子程序
-也就是說,在程序運行過程中,系統出現了一個必須由CPU立即處理的情況,此時,CPU暫時終止當前程序的執行轉而處理這個新事件的過程就叫做中斷
- 中斷是由于軟件的或硬件的信號,使得CPU暫停當前的任務,轉而去執行另一段子程序
- 中斷的分類
- 硬中斷(外中斷),由外部設備(比如網卡、硬盤)隨機引發的,比如當前網卡收到數據包的時候,就會發出一個中斷
- 軟中斷(內中斷),由執行中斷指令產生的,可以通過程序控制觸發
從本質上來講,中斷是一種電信號,當設備有某種事件發生時,它就會產生中斷,通過總線把電信號發送給中斷控制器。如果中斷的線是激活的,中斷控制器就把電信號發送給處理器的某個特定引腳。處理器于是立即停止自己正在做的事,跳到中斷程序的入口點,進行中斷處理。
中斷過程
- 可以通過int n產生中斷
- n是中斷碼,內存中有一張中斷向量表,用來存放中斷碼對應的中斷處理程序的入口地址
- CPU在接收到中斷信號后,暫停當前正在執行的程序,跳轉到中斷碼對應的中斷向量表地址處,去執行中斷處理程序
- 常見中斷(中斷向量表)
- int 10H用于執行BIOS中斷
- int 3是"斷點中斷",用于調試程序
- int 21H用于執行DOS系統功能調用,AH寄存器存儲功能號
DOS系統功能調用
- DOS系統功能調用
- 由DOS提供的一組實現特殊功能的子程序供程序員在編寫自己的程序時調用,以減輕編程的工作量
- 涉及屏幕顯示、文件管理、I/O管理等等
- 每個子程序 都有一個功能號,所有的功能調用的格式都是一致的。調用的步驟大致如下
- 系統功能號送到寄存器AH中
- 入口參數送到指定的寄存器中
- 用int 21H指令執行功能調用
- 根據出口參數分析功能調用執行情況
;----數據段----
data segment
string db 'Hello World!$'
data ends
mov ax,data
mov ds,ax ;設置ds為數據段
mov ah,9H ;功能號9H代表在屏幕顯示字符串
mov dx,offset string ;ds: dx代表字符串地址
int 21H ;執行DOS系統功能調用
emu8086常用快捷鍵
- F5:調試運行
- F4:重新加載
- F8:下一步(單步執行)
- F9:直接一步到位運行整個程序
-
Ctrl + F8:跳過前面代碼,斷點到單擊選中的代碼那行