第2套上機試題及答案詳解
請編制程序,其功能是:內(nèi)存中連續(xù)存放著16個二進制字節(jié)數(shù),在原16個數(shù)的第4和第5個數(shù)之間插入00H,在原16個數(shù)的第8和第9個數(shù)之問插入55H,在原16個數(shù)的第12和第13個數(shù)之間插入AAH,在原16個數(shù)的最后加入FFH。將按上述方法插入4個字節(jié)數(shù)后得到的20個字節(jié)數(shù)存入內(nèi)存中。
例如:內(nèi)存中有:10H,20H,30H,40H,50H,…,8FH(共16個字節(jié))
結(jié)果為: 10H,20H,30H,40H,00H,50H,…,8FH,F(xiàn)FH(共20個字節(jié))
部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,由過程SAVE保存到文件OUTPUT1.DAT中。
請?zhí)羁誃EGIN和END之間已經(jīng)給出的源程序使其完整,需填空處已經(jīng)用橫線標(biāo)出,每個空白一般只需一條指令,也可以填入功能相當(dāng)?shù)亩鄺l指令,或刪去BEGIN和END之間原有的代碼并自行編程來完成所要求的功能。
對程序必須進行匯編,并與IO.OBJ鏈接產(chǎn)生可執(zhí)行文件,最終運行程序產(chǎn)生結(jié)果。調(diào)試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
【試題程序】

【參考答案】
(1)MOV SI,0
(2)MOVAH,SOURCE [SI]
(3)INC SI
(4)AH
(5)EXIT
(6)POP SI
(7)CHAN
【解析】
此程序所要實現(xiàn)的過程是在連續(xù)存放的16個數(shù)的四個不同位置當(dāng)中插入四個不同的數(shù)。程序開始,將要插入的四個數(shù)即:0FFH,0AAH,55H,00H,先定義成字節(jié)型變量INDATA。程序中寄存器BX和CX的作用主要是用于計數(shù)控制。CX用于控制一次存儲4個數(shù)到結(jié)果數(shù)據(jù)區(qū)中,一共要存儲四組。這四組分別是第1~4個、第5~8個、第9~12個、第13~16個。存完一組數(shù)據(jù)后,在各組后面分別插入00H、55H、0AAH、0FFH。BX用于控制所要插入數(shù)的個數(shù),插入完一個數(shù)后,BX減1。
程序的堆棧段定義了一個128字節(jié)的堆棧區(qū),堆棧段下面是數(shù)據(jù)段。數(shù)據(jù)段中定義了五個字節(jié)型變量:原始數(shù)據(jù)區(qū)SOURCE、變量INDATA(包括四個將要插入的數(shù))、結(jié)果數(shù)據(jù)區(qū)RESULT、原始數(shù)據(jù)文件名NAME0、結(jié)果數(shù)據(jù)文件名NAME1。數(shù)據(jù)段下面是代碼段,在代碼段的開始告訴匯編程序,代碼段、數(shù)據(jù)段和堆棧段分別屬于段寄存器CS、DS、SS。
接下來是對返回地址的保存和數(shù)據(jù)段寄存器的初始化,這是每一個匯編程序所必須具有的操作步驟。然后調(diào)用外部過程LOAD,從‘'INPUT1.DAT”中讀取數(shù)據(jù)。準(zhǔn)備工作完成以后,程序進入主體部分。需說明的是,程序中所有分號“;”后邊的部分均為注釋說明性內(nèi)容。
將原始數(shù)據(jù)的偏移地址SI賦初值為0,所以第(1)空填寫“MOV SI,0”。將結(jié)果數(shù)據(jù)韻偏移地址DI也賦初值為0,CX和BX的初值都為4。由于需先將SOURCE[SI]中的內(nèi)容傳送給AH,所以第(2)空填寫“MOV AH,SOURCE[SI]”,再將AH存儲到RESULT[DI]中。CX減1,若CX為0,表示已經(jīng)搜索到了第四個字符,則轉(zhuǎn)向INSERl段,開始插入第一個數(shù):否則CX不為0,繼續(xù)搜索下一個字符,即無條件轉(zhuǎn)向CHAN段。第(3)空SI地址加1,繼續(xù)取下一個數(shù)據(jù)。
INSER1段是將INDATA中的數(shù)據(jù)插入到RESULT[DI]中。先給AH賦值為INDATA[S1-1],再將AH存入到RESULT[DI]中,所以第(4)空填寫“AH”。INDATA[SI-1]表示每次取完INDATA中的一個數(shù)后,偏移地址SI減1,取下一個數(shù)(INDATA中一共四個數(shù))。插入一個數(shù)后,BX減I,若BX減為0,表示四個數(shù)全部都已經(jīng)插入到數(shù)組的四個位置中,則轉(zhuǎn)向EXIT段,所以第(5)空填寫“EXIT”。
另外,在INSER1程序段中,先執(zhí)行指令“PUSH SI”,然后給Sl賦值,有壓入就必有彈出,所以第(6)空填寫“POP SI”,與前面的“PUSH SI”指令相對應(yīng)。當(dāng)插入操作未完時,繼續(xù)搜索下一組四個數(shù),然后再插入新的數(shù),無條件轉(zhuǎn)向CHAN段,所以第(7)空填寫“CHAN”。
請編制程序,其功能是:內(nèi)存中連續(xù)存放著16個二進制字節(jié)數(shù),在原16個數(shù)的第4和第5個數(shù)之間插入00H,在原16個數(shù)的第8和第9個數(shù)之問插入55H,在原16個數(shù)的第12和第13個數(shù)之間插入AAH,在原16個數(shù)的最后加入FFH。將按上述方法插入4個字節(jié)數(shù)后得到的20個字節(jié)數(shù)存入內(nèi)存中。
例如:內(nèi)存中有:10H,20H,30H,40H,50H,…,8FH(共16個字節(jié))
結(jié)果為: 10H,20H,30H,40H,00H,50H,…,8FH,F(xiàn)FH(共20個字節(jié))
部分程序已給出,其中原始數(shù)據(jù)由過程LOAD從文件INPUT1.DAT中讀入SOURCE開始的內(nèi)存單元中。運算結(jié)果要求從RESULT開始存放,由過程SAVE保存到文件OUTPUT1.DAT中。
請?zhí)羁誃EGIN和END之間已經(jīng)給出的源程序使其完整,需填空處已經(jīng)用橫線標(biāo)出,每個空白一般只需一條指令,也可以填入功能相當(dāng)?shù)亩鄺l指令,或刪去BEGIN和END之間原有的代碼并自行編程來完成所要求的功能。
對程序必須進行匯編,并與IO.OBJ鏈接產(chǎn)生可執(zhí)行文件,最終運行程序產(chǎn)生結(jié)果。調(diào)試中若發(fā)現(xiàn)整個程序中存在錯誤之處,請加以修改。
【試題程序】


(1)MOV SI,0
(2)MOVAH,SOURCE [SI]
(3)INC SI
(4)AH
(5)EXIT
(6)POP SI
(7)CHAN
【解析】
此程序所要實現(xiàn)的過程是在連續(xù)存放的16個數(shù)的四個不同位置當(dāng)中插入四個不同的數(shù)。程序開始,將要插入的四個數(shù)即:0FFH,0AAH,55H,00H,先定義成字節(jié)型變量INDATA。程序中寄存器BX和CX的作用主要是用于計數(shù)控制。CX用于控制一次存儲4個數(shù)到結(jié)果數(shù)據(jù)區(qū)中,一共要存儲四組。這四組分別是第1~4個、第5~8個、第9~12個、第13~16個。存完一組數(shù)據(jù)后,在各組后面分別插入00H、55H、0AAH、0FFH。BX用于控制所要插入數(shù)的個數(shù),插入完一個數(shù)后,BX減1。
程序的堆棧段定義了一個128字節(jié)的堆棧區(qū),堆棧段下面是數(shù)據(jù)段。數(shù)據(jù)段中定義了五個字節(jié)型變量:原始數(shù)據(jù)區(qū)SOURCE、變量INDATA(包括四個將要插入的數(shù))、結(jié)果數(shù)據(jù)區(qū)RESULT、原始數(shù)據(jù)文件名NAME0、結(jié)果數(shù)據(jù)文件名NAME1。數(shù)據(jù)段下面是代碼段,在代碼段的開始告訴匯編程序,代碼段、數(shù)據(jù)段和堆棧段分別屬于段寄存器CS、DS、SS。
接下來是對返回地址的保存和數(shù)據(jù)段寄存器的初始化,這是每一個匯編程序所必須具有的操作步驟。然后調(diào)用外部過程LOAD,從‘'INPUT1.DAT”中讀取數(shù)據(jù)。準(zhǔn)備工作完成以后,程序進入主體部分。需說明的是,程序中所有分號“;”后邊的部分均為注釋說明性內(nèi)容。
將原始數(shù)據(jù)的偏移地址SI賦初值為0,所以第(1)空填寫“MOV SI,0”。將結(jié)果數(shù)據(jù)韻偏移地址DI也賦初值為0,CX和BX的初值都為4。由于需先將SOURCE[SI]中的內(nèi)容傳送給AH,所以第(2)空填寫“MOV AH,SOURCE[SI]”,再將AH存儲到RESULT[DI]中。CX減1,若CX為0,表示已經(jīng)搜索到了第四個字符,則轉(zhuǎn)向INSERl段,開始插入第一個數(shù):否則CX不為0,繼續(xù)搜索下一個字符,即無條件轉(zhuǎn)向CHAN段。第(3)空SI地址加1,繼續(xù)取下一個數(shù)據(jù)。
INSER1段是將INDATA中的數(shù)據(jù)插入到RESULT[DI]中。先給AH賦值為INDATA[S1-1],再將AH存入到RESULT[DI]中,所以第(4)空填寫“AH”。INDATA[SI-1]表示每次取完INDATA中的一個數(shù)后,偏移地址SI減1,取下一個數(shù)(INDATA中一共四個數(shù))。插入一個數(shù)后,BX減I,若BX減為0,表示四個數(shù)全部都已經(jīng)插入到數(shù)組的四個位置中,則轉(zhuǎn)向EXIT段,所以第(5)空填寫“EXIT”。
另外,在INSER1程序段中,先執(zhí)行指令“PUSH SI”,然后給Sl賦值,有壓入就必有彈出,所以第(6)空填寫“POP SI”,與前面的“PUSH SI”指令相對應(yīng)。當(dāng)插入操作未完時,繼續(xù)搜索下一組四個數(shù),然后再插入新的數(shù),無條件轉(zhuǎn)向CHAN段,所以第(7)空填寫“CHAN”。