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