汇编语言上机的4个步骤
匯編語言上機的4個步驟
1.點擊命令提示符圖標 進入DOS
C:\Documents and Settings\Administrator>CD… (兩個點)按Enter鍵
C:\Documents and Settings> CD…(兩個點) 按Enter鍵
C:\ cd MASM按Enter鍵
C:\ MASM> EDIT XXX.ASM”并按Enter鍵,
進入全屏幕編輯狀態,輸入程序,然后將編輯好的源程序保存(File下拉菜單選SAVE),或用后綴為.ASM的文件名存入U盤。重新啟動計算機時文件丟失。
注意:源文件擴展名必須為.ASM。
2.利用匯編程序MASM將XXX .ASM文件轉換成 XXX.OBJ文件
匯編程序MASM的作用:將源文件轉換成二進制代碼表示的目標文件(稱為.OBJ文件),匯編結束后,匯編程序將指出源程序中的語法錯誤。
匯編命令格式如下。
C:\MASM>MASM XXX;(分號)
0 Warning Errors
0 severe Errors后執行下一步
3.利用連接程序LINK把XXX.OBJ程序轉換成可執行程序XXX.EXE程序
.
連接命令為如下
C:\MASM>LINK XXX;(分號)
4.程序的運行
常用調試方法(1)利用DEBUG調試程序(參考附錄有關DEBUG的命令)。
C:\MASM>DEBUG XXX .EXE
帶顯示功能的程序(2)直接輸入文件名就可以執行該程序。
C:\MASM>XXX .EXE
注意:要根據程序的特點選擇程序的運行方式。
出現提示符“-”,表示已進入DEBUG狀態,可以使用DEBUG命令。
①用U命令查看程序是否進入內存。
-U回車
代碼段 偏移量 機器碼 源程序
18F4: 2000 1E PUSH DS
18F4: 2001 2BC0 SUB AX,AX
18F4: 2003 50 PUSH AX
18F4: 2004 B8F618 MOV AX,18F6H
18F4: 2007 8ED8 MOV DS,AX
……
……
18F4: xxxx xxxx RET
上面從左到右依次給出了程序所在的段地址、偏移地址、機器語言指令和匯編語言指令。系統自動給程序分配了數據段(址為18F6H,說明程序的數據都在這個18F6H段的相關內存單元內存單元。
②利用T命令執行程序,
T為單步執行命令,既每一個T執行一條指令,觀察寄存器存儲單元的值及各標志的變化。
③檢查程序的運行結果。
利用D命令檢查該內存單元是否為這個結果。
-D數據段段基址 : 偏移地址(要查看的存儲單元的偏移地址)
本例中D 18F6:1000
④運行命令G(GO)
運行命令G的格式如下。
—G
其中,ADDRESS1指定了運行的起始地址,如不指定則從當前的CS:IP開始運行。后面的地址均為斷點地址,當指令執行到斷點時,就停止執行并顯示所有寄存器和標志位的內容,以及下一條將要執行的指令。
(5)退出DEBUG命令Q(QUIT)
退出DEBUG命令Q的格式如下
-Q
該命令將退出DEBUG,并返回DOS。
最終顯示“C:> MASM>”。
除上述命令外,DEBUG的常用命令R可以顯示和修改寄存器的內容,命令E可以顯示和修改內存單元的內容,命令G可以連續執行指令。
2、使用DOSBOX軟件搭建匯編環境,調用masm和link程序,將源代碼編譯鏈接成可執行程序(maxmin.exe)。如圖
3、運行maxmin.exe,查看程序運行情況及結果檢驗
在DOS環境中運行debug maxmin.exe,運用debug的u,g,d,r,t調用功能,即可查看檢驗程序運行狀況。
首先調用反匯編指令u查看每條代碼的代碼段偏移地址
找到已初始化完成語句MOV AX,SEG AREA,該語句對應的偏移地址為0005,
再調用運行命令g,執行g5 ,并調用顯示內存單元內容的命令D (d0)查看內存單元內容
綠框中為待處理10個無符號數100,3,654,54,898,3,125,6666,545,781對應的16進制存儲單元,每4位16進制對應一個0~65535無符號數,共20個存儲單元。兩紅框中為表示最大值和最小值的變量MAX和MIN的存儲單元,預設值分別為65535和0,即16進制數FFFF和0000。
再次調用反匯編指令u查看后續代碼的代碼段偏移地址,找到主程序已運行完畢的語句MOV AH,4CH,該語句對應的偏移地址為0046
再調用運行命令g,執行g0046,并調用顯示內存單元內容的命令D (d46)查看內存單元內容
變量MAX中為十六進制數1A0A,剛好對應十個數中最大數6666,
變量MIN中為十六進制數0003,剛好對應十個數中最小數3,運行結果正確。
實驗過程原始記錄及計算結果(數據、表格、計算、曲線等)
在完成求取最小值程序編寫后,我尚未繼續編寫求取最大值程序,以便于檢驗最小值程序和整體框架的正確性,經運行調試后,得到正確的求取最小值程序,但之后我本打算將最小值程序稍作修改得到最大值程序,編寫后進行調試發現如下錯誤結果
經檢查發現,是我在求取最小值程序后尚未將變址寄存器SI賦值回數組AREA的首地址,使得求取最大值程序發生錯誤。改正方法:求取最大值程序前應重新初始化,將SI賦回數組AREA的首地址,修改程序,加上 MOV SI,OFFSET AREA命令,之后運行調試正確。
附錄2 常用DOS功能調用一覽表
功能號在AH中,并設好其他入口參數,向DOS發出INT 21H命令,最后獲得出口參數,如表7所示。
表7
調 用 號 功 能 入口參數 出口參數
00H 程序終止 CS=PSP段地址 —
01H 鍵盤輸入字符 — AL=輸入的字符
02H 顯示輸出 DL=顯示的字符 —
03H 串行設備輸入 — AL=輸入的字符
04H 串行設備輸出 DL=輸出的字符 —
05H 打印輸出 DL=輸出的字符 —
06H 直接控制臺I/O DL=0FFH(輸入請求);
DL=字符(輸出請求) AL=輸入的字符
07H 直接控制臺I/O
(不顯示輸入) — AL=輸入的字符
08H 鍵盤輸入字符(無回顯) — AL=輸入的字符
09H 顯示字符串 DS:DX=緩沖區首址 —
0AH 輸入字符串 DS:DX=緩沖區首址 —
0BH 檢查標準輸入狀態
—
AL=00無按鍵;
AL=0FFH有按鍵
0CH 清除輸入緩沖區并執行指定的標準輸入功能 AL=功能號(01/06/07/08/0AH);
DS:DX=緩沖區(0AH功能) AL=輸入的數據(功能01/06/07/08)
0DH 初始化磁盤狀態 — —
0EH 選擇默認的驅動器 DL=驅動器號(0=A,1=B…) AL=邏輯驅動器數
0FH 打開文件 DS:DX=未打開的FCB首址 AL=00成功;
AL=0FFH失敗
10H 關閉文件 DS:DX=打開的FCB首址 AL=00成功;
AL=0FFH失敗
11H 查找第一匹配目錄 DS:DX=未打開的FCB首址 AL=00成功;
AL=0FFH失敗
12H 查找下一匹配目錄 DS:DX=未打開的FCB首址 AL=00成功;
AL=0FFH失敗
13H 刪除文件 DS:DX=未打開的FCB首址 AL=00成功;
AL=0FFH失敗
14H 順序讀 DS:DX=打開的FCB首址 AL=00成功;
AL=01文件結束;
AL=02緩沖區太小;
AL=03緩沖區不滿
15H 順序寫 DS:DX=打開的FCB首址 AL=00成功;
AL=01盤滿;
AL=02緩沖區太小
16H 創建文件 DS:DX=未打開的FCB首址 AL=00成功,AL=0FFH目錄區滿
17H 文件換名 DS:DX=被修改的FCB首址 AL=00成功,AL=0FFH未找到目錄項或文件重名
*18H 保留未用 — —
19H 獲取默認驅動器號 — AL=驅動器號(0=A,1=B…)
1AH 設置磁盤緩沖區DTA DS:DX=磁盤緩沖區首址 —
*1BH 獲取默認驅動器的磁盤格式信息 — AL=每簇的扇區數;
CX=每扇區的字節數;
DX=數據區總簇數-1;
DS:BX=介質描述字節
*1CH 獲取指定驅動器的磁盤格式信息 DL=驅動器號(0=默認,1=A…) AL=每簇的扇區數;
CX=每扇區的字節數;
DX=數據區總簇數-1;
DS:BX=介質描述字節
*1DH 保留未用 — —
*1EH 保留未用 — —
*1FH 獲取默認驅動器的DPB — DS:BX=DPB首址
*20H 保留未用 — —
21H 隨機讀一個記錄 DS:DX=打開的FCB首址 AL=00成功;
AL=01文件結束;
AL=02緩沖區太小;
AL=03緩沖區不滿
22H 隨機寫一個記錄 DS:DX=打開的FCB首址 AL=00成功;
AL=01盤滿;
AL=02緩沖區太小
23H 獲取文件大小 DS:DX=未打開的FCB首址 AL=00成功;
AL=0FFH失敗
24H 設置隨機記錄號 DS:DX=打開的FCB首址 —
25H 設置中斷向量 AL=中斷號
DS:DX=中斷程序入口 —
*26H 創建新的PSP DS:DX=新的PSP段地址 —
27H 隨機讀若干記錄 DS:DX=打開的FCB首址
CX=要讀入的記錄數 AL=00成功, AL=01文件結束,AL=02緩沖區太小,AL=03緩沖區不滿;
CX=讀入的塊數
28H 隨機寫若干記錄 DS:DX=打開的FCB首址
CX=要寫入的記錄數 AL=00成功, AL=01盤滿,AL=02緩沖區太小,AL=03緩沖區不滿;
CX=已寫的塊數
29H 分析文件名 AL=分析控制標記
DS:SI=要分析的字符串
ES:DI=未打開的FCB首址 AL=00未通配符,AL=01有通配符,AL=0FFH驅動器字母無效;
ES:DI=未打開的FCB
2AH 獲取系統日期
— CX=年(1980~2099),DH=月,DL=日,AL=星期(0=星期日)
2BH 設置系統日期 CX=年,DH=月,DL=日 AL=00成功, AL=0FFH失敗
2CH 獲取系統時間 — CH=時(0~23),CL=分,DH=秒,DL=百分之幾秒
2DH 設置系統時間 CX=時,分DX=秒,百分秒 AL=00成功,AL=0FFH失敗
2EH 設置/復位校驗開關 AL=0關閉,1打開 —
2FH 獲取磁盤傳輸地址DTA — ES:BX=DTA首地址
30H 獲取DOS版本 — AL,AH=DOS的主、次版本
31H 結束并駐留 AL=返回碼,DX=內存大小 —
*32H 獲取指定驅動器的DPB — DS:BX=DPB首址
33H 獲取或設置Ctrl+Break標志 AL=0:取,1:置,DL=標志 DL=標志(取功能)
0:關
1:開
*34H 獲取DOS中斷標志 — ES:BX=DOS中斷標志
35H 獲取中斷向量地址 AL=中斷號 ES:BX=中斷程序入口
36H 獲取磁盤的自由空間 DL=驅動器號(0=缺省,1=A AX=FF驅動器無效,其他每簇扇區數
BX=自由簇數;
CX=每扇區字節數;
BX=文件區所占簇數
*37H 獲取/設置參數分隔符;
獲取/設置設備名許可標記 AL=0:取分隔符,
1:置分隔符,DL=分隔符
2:取許可標記
3:置許可標記,DL=許可標記 DL=分隔符(功能0);
DL=許可標記(功能2)
38H 獲取國家信息 AL=0,DS:DX=緩沖區首址 —
39H 創建子目錄 DS:DX=路徑字符串 CF=0成功, CF=1失敗;AX=錯誤碼
3AH 刪除子目錄 DS:DX=路徑字符串 CF=0成功, CF=1失敗;AX=錯誤碼
3BH 設置子目錄 DS:DX=路徑字符串 CF=0成功, CF=1失敗;AX=錯誤碼
3CH 創建文件 DS:DX=帶路徑的文件名
CX=屬性1(只讀),CX=屬性2(隱蔽),CX=屬性4(系統) CF=0成功,AX=文件號;
CF=1失敗,AX=錯誤碼
3DH 打開文件 DS:DX=帶路徑的文件名;
AL=方式0(讀);
AL=方式1(寫);
AL=方式2(讀寫) CF=0成功,AX=文件號;
CF=1失敗,AX=錯誤碼
3EH 關閉文件 BX=文件號 CF=0成功;
CF=1失敗,AX=錯誤碼
3FH 讀文件或設備 BX=文件號;
CX=字節數 CF=0成功;
DX:AX=新的指針位置
40H 寫文件或設備 DS:DX=緩沖區首址 CF=1失敗,AX=錯誤碼
41H 刪除文件 DS:DX=帶路徑的文件名 CF=0成功, CF=1失敗,
AX=錯誤碼
42H 移動文件指針 AL=方式0(正向);
AL=方式1(相對);
AL=方式2(反向);
BX=文件號;
CX:DX=移動的位移量 CF=0成功,DX:AX=新的文件指針;
CF=1失敗,AX=錯誤碼
43H 獲取/設置文件屬性 AL=0(獲取);
AL=1(設置);
CX=新屬性;
DS:DX=帶路徑的文件名 CX=屬性(功能0)
1-只讀
2-隱蔽4-系統20H-歸檔
44H 設備輸入/輸出控制:獲取/設置與打開設備的句柄相關聯的信息,或
發送/接收控制字符串至設備句柄 AL=0/1(獲取/設置設備信息);
AL=2/3(讀/寫設備控制通道);
AL=4/5(同功能2/3);
AL=6/7(取輸入/輸出狀態);
BX=句柄(功能03,67);
BL=驅動器號(功能4~5);
CX=字節數(功能2~5);
DS:DX=緩沖區(功能2~5) CF=0成功;
DX=設備信息(功能0);
AL=狀態(功能6/7),0表示未準備,1表示準備;
AX=傳送的字節數(功能2-5)
45H 復制文件號(對于打開的文件返回一個文件號) BX=文件號 CF=0成功,AX=新文件號;
CF=1失敗,AX=錯誤碼
46H 強行復制文件號 BX=現存的文件號;
CX=第2文件號 CF=0成功,CF=1失敗;
AX=錯誤碼
47H 獲取當前目錄 DL=驅動器號;
DS:SI=緩沖區首址 CF=0成功, CF=1失敗;
AX=錯誤碼
48H 分配內存 BX=所需的內存節數 CF=0成功,AX=分配的段數;
CF=1失敗,AX=錯誤碼;
BX=最大可用塊大小
49H 釋放內存 ES=釋放塊的段值 CF=1失敗,AX=錯誤碼
4AH 修改分配內存 ES=修改塊的段值;
BX=新長度(以節為單位) CF=1失敗;AX=錯誤碼;
BX=最大可用塊大小
4BH 裝載程序;運行程序 AL=0裝載并運行;
AL=1獲得執行信息;
AL=3裝載但不運行;
DS:DX=帶路徑的文件名;
ES:BX=裝載用的參數塊 CF=1失敗;AX=錯誤碼
4CH 帶返回碼的結束 AL=進程返回碼 —
4DH 獲取由31H/4CH返回的返回碼
— AL=進程返回碼;
AH= 0表示正常結束,AH= 1表示由Ctrl+Break結束,AH= 2表示由嚴重設備錯誤而結束,AH= 3表示由調用31H而結束
4EH 查找第一個匹配項 DS:DX=帶路徑的文件名;
CX=屬性 CF=1失敗;AX=錯誤碼
4FH 查找下一個匹配項 CF=1失敗,AX=錯誤碼
*50H 建立當前的PSP段地址 BX=PSP段地址 —
*51H 讀當前的PSP段地址 — BX=PSP段地址
*52H 獲取DOS系統數據區首址 — ES:BX=DOS數據區首址
*53H 為塊設備建立DPB DS:SI=BPB,ES:DI=DPB —
54H 獲取校驗開關設定值 — AL=標志值(0:關,1:開)
*55H 由當前PSP建立新PSP DX=PSP段地址 —
56H 文件換名 DS:DX=帶路徑的舊文件名
ES:DI=帶路徑的新文件名 CF=1失敗,AX=錯誤碼
57H 獲取/置文件時間及日期
AL=0/1取/置,BX=文件號
CX=時間,DX=日期 CF=0成功,CX=時間,DX=
日期
總結
以上是生活随笔為你收集整理的汇编语言上机的4个步骤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Keil C51 V6.12
- 下一篇: 腾讯云神笔低代码平台的申请没通过,只能等