1. 程式人生 > >彙編實驗一 用表格形式顯示字元

彙編實驗一 用表格形式顯示字元

基礎知識:

1. 彙編中的幾個常用標誌符號

  CF是進位標誌,  PF是奇偶標誌  AF是輔助進位標誌  ZF是零標誌  SF是符號標誌  OF是溢位標誌.

2. cmp 的使用

 cmp 是將兩個運算元進行相減,但是不儲存結果,只儲存相關的標誌(AF,ZF等),有了這些標誌,可以輔助於轉移語句中。

3. 條件轉移指令及轉移條件

je     等於則轉移         zf=1

jne   不等於則轉移     zf=0

jb      低於則轉移        cf=1

jnb    不低於則轉移    cf=0

ja       高於則轉移        cf=0且zf=0

jna     不高於則轉移    cf=1或zf=1

4. loop 語句

 loop 迴圈語句利用cx的值來記錄迴圈次數,每次減一,直到為0。

5. int 21h

   int 21h 是系統呼叫,執行它以後,幹什麼取決於ax中的內容:

AH

功能

呼叫引數

返回引數

00

程式終止(同INT 20H)

CS=程式段字首

01

鍵盤輸入並回顯

AL=輸入字元

02

顯示輸出

DL=輸出字元

03

非同步通迅輸入

AL=輸入資料

04

非同步通迅輸出

DL=輸出資料

05

印表機輸出

DL=輸出字元

06

直接控制檯I/O

DL=FF(輸入) DL=字元(輸出)

AL=輸入字元

07

鍵盤輸入(無回顯)

AL=輸入字元

08

鍵盤輸入(無回顯) 檢測Ctrl-Break

AL=輸入字元

09

顯示字串

DS:DX=串地址 '$'結束字串

0A

鍵盤輸入到緩衝區

DS:DX=緩衝區首地址 (DS:DX)=緩衝區最大字元數

(DS:DX+1)=實際輸入的字元數

0B

檢驗鍵盤狀態

AL=00 有輸入 AL=FF 無輸入

0C

清除輸入緩衝區並 請求指定的輸入功能

AL=輸入功能號 (1,6,7,8,A)

0D

磁碟復位

清除檔案緩衝區

0E

指定當前預設的磁碟驅動器

DL=驅動器號 0=A,1=B,...

AL=驅動器數

0F

開啟檔案

DS:DX=FCB首地址

AL=00 檔案找到 AL=FF 檔案未找到

10

關閉檔案

DS:DX=FCB首地址

AL=00 目錄修改成功 AL=FF 目錄中未找到檔案

11

查詢第一個目錄項

DS:DX=FCB首地址

AL=00 找到 AL=FF 未找到

12

查詢下一個目錄項

DS:DX=FCB首地址 (檔案中帶有*或?)

AL=00 找到 AL=FF 未找到

13

刪除檔案

DS:DX=FCB首地址

AL=00 刪除成功 AL=FF 未找到

14  

順序讀  

DS:DX=FCB首地址  

AL=00 讀成功   =01 檔案結束,記錄中無資料   =02 DTA空間不夠   =03 檔案結束,記錄不完整

15

順序寫

DS:DX=FCB首地址

AL=00 寫成功   =01 盤滿   =02 DTA空間不夠

16

建檔案

DS:DX=FCB首地址

AL=00 建立成功   =FF 無磁碟空間

17

檔案改名

DS:DX=FCB首地址 (DS:DX+1)=舊檔名 (DS:DX+17)=新檔名

AL=00 成功 AL=FF 未成功

19

取當前預設磁碟驅動器

AL=預設的驅動器號 0=A,1=B,2=C,...

1A

置DTA地址

DS:DX=DTA地址

1B  

取預設驅動器FAT資訊  

AL=每簇的扇區數 DS:BX=FAT標識位元組 CX=物理扇區大小 DX=預設驅動器的簇數

1C

取任一驅動器FAT資訊

DL=驅動器號

同上

21  

隨機讀  

DS:DX=FCB首地址  

AL=00 讀成功   =01 檔案結束   =02 緩衝區溢位   =03 緩衝區不滿

22

隨機寫

DS:DX=FCB首地址

AL=00 寫成功   =01 盤滿   =02 緩衝區溢位

23

測定檔案大小

DS:DX=FCB首地址

AL=00 成功(檔案長度填入FCB) AL=FF 未找到

24

設定隨機記錄號

DS:DX=FCB首地址

25

設定中斷向量

DS:DX=中斷向量 AL=中斷型別號

26

建立程式段字首

DX=新的程式段字首

27  

隨機分塊讀  

DS:DX=FCB首地址 CX=記錄數

AL=00 讀成功   =01 檔案結束   =02 緩衝區太小,傳輸結束   =03 緩衝區不滿

28

隨機分塊寫

DS:DX=FCB首地址 CX=記錄數

AL=00 寫成功   =01 盤滿   =02 緩衝區溢位

29

分析檔名

ES:DI=FCB首地址 DS:SI=ASCIIZ串 AL=控制分析標誌

AL=00 標準檔案   =01 多義檔案   =02 非法碟符

2A

取日期

CX=年 DH:DL=月:日(二進位制)

2B

設定日期

CX:DH:DL=年:月:日

AL=00 成功   =FF 無效

2C

取時間

CH:CL=時:分 DH:DL=秒:1/100秒

2D

設定時間

CH:CL=時:分 DH:DL=秒:1/100秒

AL=00 成功   =FF 無效

2E

置磁碟自動讀寫標誌

AL=00 關閉標誌 AL=01 開啟標誌

2F

取磁碟緩衝區的首址

ES:BX=緩衝區首址

30

取DOS版本號

AH=發行號,AL=版本

31

結束並駐留

AL=返回碼 DX=駐留區大小

33  

Ctrl-Break檢測  

AL=00 取狀態   =01 置狀態(DL) DL=00 關閉檢測   =01 開啟檢測

DL=00 關閉Ctrl-Break檢測   =01 開啟Ctrl-Break檢測

35

取中斷向量

AL=中斷型別

ES:BX=中斷向量

36  

取空閒磁碟空間  

DL=驅動器號  0=預設,1=A,2=B,...  

成功:AX=每簇扇區數      BX=有效簇數      CX=每扇區位元組數      DX=總簇數 失敗:AX=FFFF

38

置/取國家資訊

DS:DX=資訊區首地址

BX=國家碼(國際電話字首碼) AX=錯誤碼

39

建立子目錄(MKDIR)

DS:DX=ASCIIZ串地址

AX=錯誤碼

3A

刪除子目錄(RMDIR)

DS:DX=ASCIIZ串地址

AX=錯誤碼

3B

改變當前目錄(CHDIR)

DS:DX=ASCIIZ串地址

AX=錯誤碼

3C

建立檔案

DS:DX=ASCIIZ串地址 CX=檔案屬性

成功:AX=檔案代號 錯誤:AX=錯誤碼

3D  

開啟檔案  

DS:DX=ASCIIZ串地址 AL=0 讀   =1 寫   =3 讀/寫

成功:AX=檔案代號 錯誤:AX=錯誤碼

3E

關閉檔案

BX=檔案代號

失敗:AX=錯誤碼

3F  

讀檔案或裝置  

DS:DX=資料緩衝區地址 BX=檔案代號 CX=讀取的位元組數

讀成功:   AX=實際讀入的位元組數   AX=0 已到檔案尾 讀出錯:AX=錯誤碼

40

寫檔案或裝置

DS:DX=資料緩衝區地址 BX=檔案代號 CX=寫入的位元組數

寫成功:   AX=實際寫入的位元組數 寫出錯:AX=錯誤碼

41

刪除檔案

DS:DX=ASCIIZ串地址

成功:AX=00 出錯:AX=錯誤碼(2,5)

42  

移動檔案指標  

BX=檔案代號 CX:DX=位移量 AL=移動方式(0:從檔案頭絕對位移,1:從當前位置相對移動,2:從檔案尾絕對位移)

成功:DX:AX=新檔案指標位置 出錯:AX=錯誤碼  

43  

置/取檔案屬性  

DS:DX=ASCIIZ串地址 AL=0 取檔案屬性 AL=1 置檔案屬性 CX=檔案屬性

成功:CX=檔案屬性 失敗:CX=錯誤碼

44  

裝置檔案I/O控制  

BX=檔案代號 AL=0 取狀態   =1 置狀態DX   =2 讀資料   =3 寫資料   =6 取輸入狀態   =7 取輸出狀態

DX=裝置資訊  

45

複製檔案代號

BX=檔案代號1

成功:AX=檔案代號2 失敗:AX=錯誤碼

46

人工複製檔案代號

BX=檔案代號1 CX=檔案代號2

失敗:AX=錯誤碼

47

取當前目錄路徑名

DL=驅動器號 DS:SI=ASCIIZ串地址

(DS:SI)=ASCIIZ串 失敗:AX=出錯碼

48

分配記憶體空間

BX=申請記憶體容量

成功:AX=分配記憶體首地 失敗:BX=最大可用記憶體

49

釋放內容空間

ES=記憶體起始段地址

失敗:AX=錯誤碼

4A

調整已分配的儲存塊

ES=原記憶體起始地址 BX=再申請的容量

失敗:BX=最大可用空間      AX=錯誤碼

4B  

裝配/執行程式  

DS:DX=ASCIIZ串地址 ES:BX=引數區首地址 AL=0 裝入執行 AL=3 裝入不執行

失敗:AX=錯誤碼  

4C

帶返回碼結束

AL=返回碼

4D

取返回程式碼

AX=返回程式碼

4E

查詢第一個匹配檔案

DS:DX=ASCIIZ串地址 CX=屬性

AX=出錯程式碼(02,18)

4F

查詢下一個匹配檔案

DS:DX=ASCIIZ串地址 (檔名中帶有?或*)

AX=出錯程式碼(18)

54

取盤自動讀寫標誌

AL=當前標誌值

56

檔案改名

DS:DX=ASCIIZ串(舊) ES:DI=ASCIIZ串(新)

AX=出錯碼(03,05,17)

57

置/取檔案日期和時間

BX=檔案代號 AL=0 讀取 AL=1 設定(DX:CX)

DX:CX=日期和時間 失敗:AX=錯誤碼

58

取/置分配策略碼

AL=0 取碼 AL=1 置碼(BX)

成功:AX=策略碼 失敗:AX=錯誤碼

59  

取擴充錯誤碼  

AX=擴充錯誤碼 BH=錯誤型別 BL=建議的操作 CH=錯誤場所

5A

建立臨時檔案

CX=檔案屬性 DS:DX=ASCIIZ串地址

成功:AX=檔案代號 失敗:AX=錯誤碼

5B

建立新檔案

CX=檔案屬性 DS:DX=ASCIIZ串地址

成功:AX=檔案代號 失敗:AX=錯誤碼

5C  

控制檔案存取  

AL=00封鎖   =01開啟 BX=檔案代號 CX:DX=檔案位移 SI:DI=檔案長度

失敗:AX=錯誤碼  

62

取程式段字首

BX=PSP地址

6. 輸出換行

  mov dl,0ah  //換行

   int 21h 

  mov dl,0dh  //回車符,作用是用來確認

  int 21h

7. 程式碼和註釋

code segment
	assume cs:code
	
start:
  mov dx,0010h  //數字0
  next:
  mov cx,10h  //計數16行
  
loop1:
  mov ah,02h
  int 21h  //系統呼叫,至於做什麼事,取決於你往al裡面放什麼
  inc dx  // +1
  push dx  //放入棧中
  mov dl,0  
  int 21h  
  pop dx  //將dx移除站內
  loop loop1  //利用cx的計數器來控制迴圈計數
  push dx  
  mov dl,0ah  //換行
  int 21h 
  mov dl,0dh  //回車符,作用是用來確認
  int 21h 
  pop dx 
  cmp dx,100h 
  jb next //低於100h則轉移,看cf ,cf=1,代表有進位或借位,說明小於,可以進行轉移。
  
  mov ah,4ch //帶返回碼結束
  int 21h
  
  code ends //結束定義的段
  end start  //結束程式