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

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

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

