本系列以80X86系列微型計算機為基礎,以MASM5.0為匯編上機實驗環境,重點介紹Intel8086指令系統。Intel8086指令系統中有100多條指令,利用這些指令可以編寫出復雜的程序實現更多功能。
匯編語言是直接控制計算機硬件工作的最簡便的語言。學習了匯編語言可具有在CPU寄存器級上進行控制和操作的能力,可獲得直接對計算機硬件底層編程的經驗。
一個計算的例子
例 * 編寫一個匯編語言程序,實現下列公式計算。
假設X=4,Y=5
匯編指令如下:
如果在DEBUG下用A命令輸入這些指令,必須把X、Y換成具體的數值;Z、Z1是存儲單元地址,最后兩條指令可寫為MOV [0],AL和MOV [1],AH,這樣才能用T命令執行。
D:\dos〉DEBUG -A MOV AL,4 ADD AL,5 MOV BL,8 IMUL BL MOV BL,4 MOV BH,0 SUB AX,BX MOV BL,2 IDIV BL MOV [0],AL MOV [1],AH
采用DEBUG的A命令輸入程序的做法明顯不方便,一是無法給出變量名即符號地址,二是調試修改程序不便。
1. 編寫
一個完整的匯編語言源程序需要增加段定義偽指令和定義數據存儲單元偽指令等必須有的偽指令。
偽指令與C語言等高級語言中的說明性語句的含義類似,起到說明作用。
用記事本gedit或者vi編寫,保存到dos目錄下
注釋符號為;號
2. 匯編、鏈接、執行
匯編語言源程序既可以用大寫字母也可以用小寫字母書寫。匯編語言程序建立及匯編過程如圖所示。
用戶編寫的源程序要經匯編程序MASM匯編(翻譯)后生成二進制目標程序,文件名默認與源程序同名、擴展名為.OBJ;再經過LINK連接生成可執行程序,文件名默認與源程序同名、擴展名為.EXE。注意:
源程序一定要和MASM和LINK文件放在同一個文件夾中。 執行MASM和LINK命令時需要按多次回車。
3. 在DEBUG下執行程序
MOV AH,4C指令對應的偏移地址是0023,這就是斷點(所謂斷點,就是程序執行到該處停下來不再繼續)。用G 0023(G 斷點)執行程序。
帶彩色顯示的算術程序
屏幕顯示和鍵盤輸入
凡是涉及到鍵盤輸入、屏幕顯示等輸入輸出操作,都可以用軟件中斷指令INT n的功能調用來實現。
在微機系統中,功能調用分兩個層次,最底層的是BIOS功能調用,其次是DOS功能調用,它們都是通過軟件中斷指令INT n來進行調用的。
除了用INT指令實現輸入和顯示之外,還可以通過直接寫顯示緩沖區的方式顯示字符。
DOS功能調用
DOS的功能調用采用INT 21H指令,調用時要求在AH中提供功能號,在指定的寄存器和存儲單元中提供調用必需的參數和緩沖區地址,執行后系統在AL中放入返回參數。
常用的DOS功能調用有5個:
- 鍵盤輸入1個字符: 1號DOS功能調用
- 顯示器輸出1個字符: 2號DOS功能調用
- 鍵盤輸入緩沖區: 10號DOS功能調用
- 顯示字符串: 9號DOS功能調用
- 返回DOS控制: 4CH號DOS功能調用
注意:
I/O處理操作的都是ASCⅡ碼,對於鍵盤輸入的數字,做計算時需將ASCⅡ碼轉變為二進制數,輸出顯示數據時需將二進制數轉為ASCⅡ碼。數字0~9的ASCII碼為30H~39H,可以看出兩者之間相差30H。
DOS功能調用例子
例: 顯示兩行字符串(回車換行功能)。第1行為“Input x:”,第2行為“Output y=x+1:”。從鍵盤輸入x,輸出y=x+1的值。
data segment mess1 db 'Input x:','$' mess2 db 0ah,0dh, 'Output y:$' ;0ah和0dh是換行和回車 y db ? data ends code segment assume cs:code,ds:data start: mov ax, data mov ds,ax ;數據段的段地址→ds mov dx,offset mess1 mov ah,9 ;顯示提示信息“Input x:” int 21h mov ah,1 ;1號功能,鍵盤輸入,鍵入的值在al int 21h add al,1 ;al+1→al mov y,al ;保存到y單元 mov dx,offset mess2 mov ah,9 ;在下一行顯示提示信息“Output y:” int 21h mov ah,2 ;2號功能,顯示一個字符 mov dl,y ;顯示的字符要放入dl,顯示x+1的值 int 21h mov ah,4ch int 21h code ends end start
另一個示例
簡化的程序結構
從MASM5.0開始,提供了簡化的段定義結構,這種結構用於小規模的程序設計中。
一般格式為.MODEL SMALL。這種格式是小型模式,程序可以有一個代碼段、一個數據段,每段不大於64KB。
示例* 用簡化的程序格式從鍵盤輸入兩個一位的十進制數,做加法運算。相加后以藍底黃字顯示在屏幕上。
設計思路:
(1)鍵盤輸入用DOS中斷調用1號功能;顯示采用寫顯存方法;
(2) 經非壓縮BCD碼加法調整指令AAA調整后會將AL的高4位清零,因此鍵盤輸入的數字不必去掉30H,可直接運算;
(3)用BIOS中斷調用INT 10H的3號功能獲得光標的位置,讓結果顯示在光標處;
(4)由於計算結果不會超過兩位十進制數,可用SI寄存器保存十進制數的ASCII碼。
注意到,這里使用了BIOS中斷調用INT 10H。
小貼士: 彩色字符顯示屬性字節為前景色由4位(0~3位)組合,背景色由3位(4~6位)組合。最高位BL表示閃爍,RGB為紅、綠、藍,I代表亮度。例如藍底黃字的屬性值為1EH。表4-3列出了16種顏色組合。