2
3
4
5
6
7
8
9
10
三、試題解釋
1、2002年試題四
[程序說明]
本程序?qū)?80 個 ASCII 編碼的數(shù)字字符轉(zhuǎn)換成 BCD 碼(二十進制碼),并將每四個 BCD 碼壓縮在一個字中。見下面圖示。
數(shù)字字符數(shù)據(jù)
|
壓縮后的數(shù)據(jù)
|
程序中約定原始數(shù)字字符存放在 SJ 開始的連續(xù)存區(qū)中,轉(zhuǎn)換和壓縮結(jié)果存放在 YS 開始的連續(xù)存區(qū)中。
[程序]
Y | START | 1 | |
LEA | GR1,0 | 2 | |
__(1)__ | 3 | ||
S0 | LEA | GR3,4 | 4 |
S1 | LD | GR0,SJ,GR2 | 5 |
__(2)__ | 6 | ||
ST | GR0,WK | 7 | |
__(3)__ | 8 | ||
OR | GR4,WK | 9 | |
LEA | GR3,-1,GR3 | 10 | |
JNZ | S2 | 11 | |
ST | GR4,YS,GR1 | 12 | |
LEA | GR1,1,GR1 | 13 | |
__(4)__ | 14 | ||
S2 | LEA | GR2,1,GR2 | 15 |
CPL | GR2,C80 | 16 | |
__(5)__ | 17 | ||
WL | EXIT | 18 | |
SJ | DS | 80 | 19 |
WK | DS | 1 | 20 |
CF | DC | #000F | 21 |
C80 | DC | 80 | 22 |
YS | DS | 20 | 23 |
END |
從程序說明中可知要將 80 個 ASCII 編碼的數(shù)字字符轉(zhuǎn)換成 BCD 碼,并將每四個 BCD 碼壓縮在一個字中。必須有雙重循環(huán):內(nèi)循環(huán)將每四個 BCD 碼壓縮在一個字中,外循環(huán)完成 80 個 ASCII 碼轉(zhuǎn)換(20個內(nèi)循環(huán))。從第4行LEA GR3,4可看出,GR3是內(nèi)循環(huán)計數(shù)器,S1是內(nèi)循環(huán)開始標號。
從第2行、第5行及第15行可知,GR2是源地址指針(在第2行賦初值),GR1是目的地址指針,應(yīng)該在第3行賦初值。從而得到__(1)__空應(yīng)為LEA GR2,0。
從第7行及第9行可知,第7~9行是將轉(zhuǎn)換好的BCD碼拼裝到壓縮字中。GR4是壓縮字、WK是放轉(zhuǎn)換好的 BCD 碼的暫存單元。由此得__(2)__是將十進制數(shù)的ASCII碼轉(zhuǎn)換成BCD碼,即AND GR0,CF。而將BCD碼拼裝到壓縮字前,應(yīng)該將壓縮字中原來的BCD碼左移4位,所以__(3)__空應(yīng)為SLL GR4,4。
第10~17行應(yīng)該是內(nèi)外循環(huán)的控制語句,也是本程序的難點。
從第10、11行可看出,第15~17行應(yīng)該內(nèi)循環(huán)尚未結(jié)束的處理,但第16、17行卻是判斷外循環(huán)結(jié)束的語句。因此可知,此程序把內(nèi)外循環(huán)的控制語句合在一起了。__(5)__空應(yīng)是JNZ S1 或 JMI S1,注意,應(yīng)該是跳轉(zhuǎn)到內(nèi)循環(huán)的起點S1,而不應(yīng)該是S0。因為此處內(nèi)循環(huán)尚未結(jié)束,不能給內(nèi)循環(huán)計數(shù)器GR3重新賦值。
第12~14行應(yīng)該是內(nèi)循環(huán)結(jié)束的處理,即把拼裝好的壓縮字送回到目的地址(第12、13行)。但__(4)__空不應(yīng)該是JMP S0,因為這樣將會越過判斷外循環(huán)結(jié)束的語句第16、17行。所以__(4)__空應(yīng)該是非跳轉(zhuǎn)語句,而從__(5)__(JNZ S1)看,內(nèi)循環(huán)計數(shù)器GR3應(yīng)重新賦值,所以__(4)__空應(yīng)該是LEA GR3,4。
標號S0與WL是沒用的。另外壓縮字GR4也不需賦初值清0,因為4次移位,每次移4位,原來不管是什么數(shù)都移出到外面了。
2、2001年試題三
[程序說明]
子程序 DEHZ 用來對 HZ 編碼的字串做解碼處理。
HZ 編碼是海外華人創(chuàng)造的一種將含有高位為 1 的漢字雙字節(jié)字串轉(zhuǎn)換成易于在網(wǎng)絡(luò)中傳輸?shù)腁SCII 字符串的變換方式。編碼過程中,被轉(zhuǎn)換字符串中的原漢字子字符串各字節(jié)高位作清零處理,使之成為 ASCII 子字符串,并在其前后兩端分別添加 ~{ 和 ~} 作為標記;而對于原 ASCII 子字符串,則將其中的 ~ 改寫為 ~~,其余字符不變。
DEHZ 解碼子程序則是 HZ 編碼的復(fù)原過程。復(fù)原 ASCII 子字符串過程中遇有 ~~ 字符則改寫為一個 ~ ,遇有 ~{ 則將其后直至 ~} 標記前的各字節(jié)高位置 1,復(fù)原為漢字子字符串,同時刪除其前后標記。~的后續(xù)字符不屬于以上情況均作為錯誤處理。
調(diào)用該子程序時, GR1 存放原始字符串首地址, GR2 存放還原后的目標字符串首地址。工作寄存器 GR3 用作處理漢字子字符串的識別標志,進入子程序時應(yīng)初始化為處理 ASCII 子字符串。程序按照 CASL 語言的標準約定,字符串的每個字符只占用一個存儲字的低八位。原始字符串和目標字符串均以 0 作為結(jié)束標志。
[程序]
START | 1 | ||
DEHZ | PUSH | 0,GR3 | 2 |
PUSH | 0,GR2 | 3 | |
PUSH | 0,GR1 | 4 | |
LEA | GR3,0 | 5 | |
LOOP | __(1)__ | 6 | |
CPA | GR0,MARK0 | 7 | |
JNZ | GOON | 8 | |
LEA | GR1,1,GR1 | 9 | |
LD | GR0,0,GR1 | 10 | |
CPA | GR0,MARK0 | 11 | |
__(2)__ | 12 | ||
CPA | GR0,MARK1,GR3 | 13 | |
JNZ | ERROR | 14 | |
__(3)__ | 15 | ||
LEA | GR1,1,GR1 | 16 | |
JMP | LOOP | 17 | |
ERROR | OUT | ERS1R,ERLEN | 18 |
JMP | EXIT | 19 | |
GOON | __(4)__ | 20 | |
ST | GR0,0,GR2 | 21 | |
LEA | GR2,1,GR2 | 22 | |
LEA | GR1,1,GR1 | 23 | |
CPA | GR0,VO | 24 | |
__(5)__ | 25 | ||
EXIT | P0P | GR1 | 26 |
P0P | GR2 | 27 | |
P0P | GR3 | 28 | |
RET | 29 | ||
V1 | DC | 1 | 30 |
V0 | DC | O | 31 |
DC | #0080 | 32 | |
MARK0 | DC | '~ ' | 33 |
MARK1 | DC | '{ }' | 34 |
ERSTR | DC | 'ERROR!' | 35 |
ERLEN | DC | 6 | 36 |
END | 37 |
[解]
寄存器作用:
GR1:源字符串地址指針,調(diào)用該子程序時,存放源字符串首地址。
GR2:目標字符串地址指針,調(diào)用該子程序時,存放目標字符串首地址。
GR3:用作處理漢字子字符串的識別標志。0 表示 ASCII 碼(初始值),1 表示漢字。
GR0:工作寄存器,存放待處理的字符。(從第 7 行 "CPA GR0,MARK0" 看出)
分析:
1)從第 7 行 " CPA GR0,MARK0" 看出,GR0 中存放待處理的字符。所以第 6 行(__(1)__)必定是一條取數(shù)指令:"LD GR0,0,GR1" ,即把源字符串地址指針所指的字符取到 GR0 中。
2)從第 7 行及第 8 行可知,第 9 行到第 17 行是處理碰到“~”的情況,即判斷后一字符是否是“~”、“{ ”及“}”。若都不是,則出錯。
3)從第 11 行可知,要判斷是否連續(xù)兩個“~”情況,而后面是繼續(xù)比較,所以第 12 行(__(2)__)應(yīng)該是一條“JZE”指令,而且是轉(zhuǎn)移到 GOON ,即把“~”存放到目標字符串中。
4)第 13 行“CPA GR0,MARK1,GR3”應(yīng)該是比較“{ ”及“}”:在中文狀態(tài)比較“}”(結(jié)束),在西文狀態(tài)比較“{ ”(開始)。所以這里用的是變址尋址,即由 GR3 的值是 0 或 1,決定是比較“{ ”還是“}”。
5)第 12 行(__(3)__)應(yīng)該是改變漢字子字符串的識別標志 GR3 的指令,即原來是 0 的變成 1,原來是 1 的變成 0,異或指令可以達到此目的。將 GR3 與常數(shù) 1 相異或,因 Casl 沒有沒有立即數(shù)運算指令,只能和常數(shù) V1 異或:EOR GR3,V1。
6)第 20 行(__(4)__)是 GR0 中存放的字符送到目標字符串前的處理工作:若是西文狀態(tài)( GR3 的值是 0 ),保持原樣;若是中文狀態(tài)( GR3 的值是 1 ),字節(jié)最高位置 1,復(fù)原為漢字子字符串,將GR0 的內(nèi)容與十六進制數(shù) 0080 相或,即能達到目的。所以這條指令應(yīng)是:OR GR0,V0,GR3 。
7)第 24 行將 GR0 與 0 比較,是判斷字符串結(jié)束標志 0 。若非 0(未結(jié)束),繼續(xù)處理。故第 25 行(__(5)__)應(yīng)是一條條件轉(zhuǎn)移指令:JNZ LOOP 。
3、2000年試題四
[程序說明]
(1)本子程序根據(jù)每位職工的基本工資(非負值)和他完成產(chǎn)品的超額數(shù)或不足數(shù)計算該職工的應(yīng)發(fā)工資。
(2)主程序調(diào)用時,GR1中給出子程序所需參數(shù)的起始地址,參數(shù)的存放次序如下表:
GR1 |
a1 |
b1 | |
c1 | |
a2 | |
b2 | |
c2 | |
… | |
an | |
bn | |
cn | |
-1(結(jié)束標志) |
其中 ai 為職工 i 的基本工資;bi 為職工 i 的完成產(chǎn)品的超額數(shù)或不足數(shù);ci為職工 i 的應(yīng)發(fā)工資數(shù)(i = 1、2、…、n)。
bi以原碼形式存放(大于零為超額,小于零為不足),基本工資與計算所得的應(yīng)發(fā)工資以補碼形式存放。
(3)應(yīng)發(fā)工資的計算規(guī)則為:
●恰好完成定額數(shù)(此時bi = 0),應(yīng)發(fā)工資即為基本工資。
●每超額 4 件,在基本工資基礎(chǔ)上增加 10 元(不到 4 件,以 4 計算,例如超額數(shù)為 10 時,增加 30 元)。
●每不足 4 件,在基本工資基礎(chǔ)上減 5 元(不到 4 件,以 4 計算,例如不足數(shù)為 5 時,減 10元)。
[程序]
START | 1 | ||
BEG |
PUSH | 0,GR1 | 2 |
PUSH | 0,GR2 | 3 | |
PUSH | 0,GR3 | 4 | |
L1 | __(1)__ | 5 | |
LEA | GR0,0,GR2 | 6 | |
JMI | FINISH | 7 | |
LD | GR3,1,GR1 | 8 | |
LEA | GR2,0,GR3 | 9 | |
AND | GR2,C7FFF | 10 | |
JZE | L3 | 11 | |
SRL | GR3,15 | 12 | |
LEA | GR2,-1,GR2 | 13 | |
L2 | __(2)__ | 14 | |
LEA | GR2,-4,GR2 | 15 | |
JPZ | L2 | 16 | |
L3 | __(3)__ | 17 | |
__(4)__ | 18 | ||
__(5)__ | 19 | ||
FINISH | POP | GR3 | 20 |
POP | GR2 | 21 | |
POP | GR1 | 22 | |
RET | 23 | ||
C7FFF | DC | #7FFF | 24 |
BONUS | DC | 10 | 25 |
DC | -5 | 26 | |
END | 27 |
[解]
寄存器作用:
GR1:地址指針
GR2:臨時工作單元。先放 ai,后放 bi(絕對值)。
GR3:bi符號
GR0:ci---應(yīng)發(fā)工資
分析:
1)從第 6 行 "LEA GR0,0,GR2" 及第 7 行 "JMI FINISH" 可知 GR0 開始時應(yīng)是 ai,GR2 也應(yīng)是ai,(從 LEA 指令功能分析)。所以第 5 行(1)應(yīng)該是取數(shù)指令:
LD GR2,0,GR1
2)從第 8 行 "LD GR3,1,GR1" 及第 9 行 "LEA GR2,0,GR3" 可知 GR2 及 GR3 放的都是 bi(超額數(shù)或不足數(shù)),而從第 10 行 "AND GR2,C7FFF"(注意:C7FFF是 16 進制常量的標號(第 24 行)),可知 GR2 存放其絕對值。而且在該值為 0 時直接結(jié)束該職工處理(第 11 行 "JZE L3")。
3)從第 12 行 "SRL GR3,15" 可知 GR3 存放 bi 的符號(超額為 0,不足為 1)
4)從第 25、26 兩行可知 BONUS 是每個超額或不足單位(4 件)的增加或扣除金額。從而得出最關(guān)鍵的第 14 行 (2) 應(yīng)為 "ADD GR0,BONUS,GR3"。第 15、16 行指出這一加或減(GR3=1時,源操作數(shù)為負)是一循環(huán)過程,一直到 GR2<0。為防止 bi 為 4 的整數(shù)倍時多加減一次,在第 13 行中先將 GR 減 1。
5)第17、18、19行(L3)依次是該職工的應(yīng)發(fā)工資回送、修改地址指針(指向下一職工)和跳到處理程序開始(L1):
ST GR0,2,GR1
LEA GR1,3,GR1
JMP L1
4、1999年試題四〖程序4.1〗
[程序4.1說明]
本子程序是對 15 位二進位串,求它的奇校驗位,生成 16 位二進制位串,使 16 位二進制位串有奇數(shù)個 1。
進入此子程序時,15 位二進制位串在 GR1 的第 1 位至第 15 位,并假定 GR1 的第 0 位是 0,求得的奇校驗位裝配在 GR1 的第 0 位上。
[程序4.1]
START | 1 | ||
BEG | PUSH | 0,GR2 | 2 |
PUSH | 0,GR3 | 3 | |
LEA | GR3,1 | 4 | |
__ (1) __ | 5 | ||
L1 | SLL | GR2,1 | 6 |
__ (2) __ | 7 | ||
LEA | GR3,1,GR3 | 8 | |
L2 | JZE | L3 | 9 |
JMP | L1 | 10 | |
L3 | __ (3) __ | 11 | |
ST | GR3,WORK | 12 | |
ADD | GR1,WORK | 13 | |
POP | GR3 | 14 | |
POP | GR2 | 15 | |
RET | 16 | ||
WORK | DS | 1 | 17 |
END | 18 |
[分析]
1)從說明中已知,被轉(zhuǎn)換的二進位串(一個字)放在 GR1 中。
2)第 6 行 "SLL GR2,1" 這條指令是處理奇偶校驗用的,因此 GR2 也應(yīng)該是工作單元,初始值為被處理數(shù),故第 5 行( (1) )應(yīng)該是 "LEA GR2,0,GR1"。
3)從第 4、5 行看,GR3 是一個計數(shù)器(統(tǒng)計值為 1 的位的個數(shù)),初始值為 1,即當 GR2 一個 1也沒有時,其值為 1(奇校驗)。
4)第 6 行 "SLL GR2,1" 將被處理數(shù)左移一位,需要判斷最高位是否為 1,若是,計數(shù)器加 1,否則跳過這條指令。因最高位也是符號位,所以可用 "JPZ L2"( (2) )。
5)第 9 行(L2)"JZE L3"是移位結(jié)束條件,即移到結(jié)果為 0 時結(jié)束。
6)第 11、12、13 行,是在計數(shù)器值為奇數(shù)(即實際 1 的個數(shù)為偶數(shù))時把被處理字 GR1 最高位變成 1。而計數(shù)器 GR3 為奇數(shù)即其最低位為 1,因此需把 GR3 的最低位變成最高位,所以第 11 行( (3) )應(yīng)該是:SLL GR3,15
5、1999年試題四〖程序4.2〗
[程序4.2說明]
子程序 SUM 是將存貯字 A 起的 n(n>0) 個字求和,并將結(jié)果存于存貯字 B 中。 (GR1)+0 A +1 n +2 B
調(diào)用該子程序時,主程序在 GR1 中給出存放子程序所需參數(shù)的起始地址。參數(shù)的存放次序如下圖:
[程序4.2]
START | ||
SUM | LD | GR2,0,GR1 |
LD | GR3,1,GR1 | |
LEA | GR0,0 | |
L5 | ADD | GR0,0,GR2 |
LEA | GR2,1,GR2 | |
_ (4) _ | ||
JNZ | L5 | |
L3 | __(5) | |
ST | GR0,0,GR3 | |
RET | ||
END |
[分析]
1)GR1 為參數(shù)表起始地址
2)GR2 為數(shù)組地址指針,起始值為A
3)GR3 為計數(shù)器,初始值為數(shù)組長度 n。
4)GR0 為累加和工作單元
5)( (4) )應(yīng)該是計數(shù)器減 1:LEA GR3,-1,GR3
6)( (5) )應(yīng)把結(jié)果單元地址 B 賦給 GR3:LD GR3,2,GR1
5、1998年試題四
[程序說明]
本程序是統(tǒng)計字符串中數(shù)字字符"0"至"9"的出現(xiàn)次數(shù)。
字符串中的每個字符是用 ASCII 碼存貯。一個存貯單元存放兩個字符,每個字符占 8 位二進位。
程序中,被統(tǒng)計的字符串從左至右存放在 STR 開始的連續(xù)單元中,并假定其長度不超過 200,字符串以'·'符作為結(jié)束。NCH 開始的 10 個單元存放統(tǒng)計結(jié)果。
START | MIN | 1 | |
MIN | LEA | GR2,9 | 2 |
LEA | GR0,0 | 3 | |
L1 | _ (1) _ | 4 | |
LEA | GR2,-1,GR2 | 5 | |
JPZ | L1 | 6 | |
LEA | GR4,0 | 7 | |
LEA | GR1,0 | 8 | |
L2 | LD | GR2,STR,GR1 | 9 |
EOR | GR4,C1 | 10 | |
JNZ | RL | 11 | |
_ (2) _ | 12 | ||
RL | SRL | GR2,8 | 13 |
LEA | GR3,0,GR2 | 14 | |
SUB | GR3,C9 | 15 | |
JM1 | L3 | 16 | |
JNZ | L4 | 17 | |
L3 | LEA | GR3,0,GR2 | 18 |
SUB | GR3,CO | 19 | |
JM1 | L5 | 20 | |
LEA | GR2,1 | 21 | |
_(3)_ | 22 | ||
_(4)_ | 23 | ||
L4 | LEA | GR4,0,GR4 | 24 |
JNZ | L2 | 25 | |
_(5)_ | 26 | ||
JMP | L2 | 27 | |
L5 | SUB | GR2,C | 28 |
JNZ | L4 | 29 | |
EXIT | 30 | ||
C1 | DC | 1 | 31 |
C | DC | '·' | 32 |
C0 | DC | '0' | 33 |
C9 | DC | '9' | 34 |
STR | DS | 200 | 35 |
NCH | DS | 10 | 36 |
END | 37 |
[解]
1)第 2~8 行(L2以前)是初始化程序,其中第 2~6 行是把計數(shù)器存放單元 NCH 開始的十個單元清零。地址指針是 GR2(遞減),故(1)為:ST GR0,NCH,GR2
2)從第 8、9 行看出 GR1 是地址指針(相對于 STR)。GR2是工作單元(要處理的字符)
3)因一個字放兩個字符,故 GR4 用作高低字節(jié)標志。起始值為 0,先處理高字節(jié),第 10 行指令"EOR GR4,C1"一方面判斷是否第一次(結(jié)果非 0),并將 GR4 置 1。
第一次處理高字節(jié),用邏輯右移指令將高 8 位內(nèi)容移到低 8 位(高 8 位置 0)。
第二次處理低字節(jié),用先邏輯左移再邏輯右移指令將高 8 位內(nèi)容置 0,故(2)為:
SLL GR2,8
4)在處理過程又用 GR3 作臨時工作單元,即把 GR2 內(nèi)容送給GR3再處理。處理時先判是否>"9"(不計數(shù))。然后減以 "0" ,使 GR3 變成 0~9。
5)計數(shù)處理是在第 21、22、23 三行中完成。使 NCH 開始的 10 個單元中與 GR3 對應(yīng)的那個單元加1。因加法指令的目的操作數(shù)只能是寄存器,所以先給 GR2 送 1(第 21 行),再將 NCH 對應(yīng)單元內(nèi)容加到 GR2 中,再將 GR2 內(nèi)容送回 NCH 對應(yīng)單元(采用 GR3 變址尋址)。故 (3) 及 (4) 為:"ADD GR2,NCH,GR3"及"ST GR2,NCH,GR3"。
6)在一個字的第二次處理后(用第 24、25 行判斷),要修改字符串的地址指針 GR1(加1)。故 (5) 為:"LEA GR1,1,GR1"。
6、1997年試題四
[程序說明]本子程序?qū)⒁粋非負二進整數(shù)翻譯成五位十進整數(shù)字符。
進入子程序時,在 GR0 中給出被翻譯的非負二進整數(shù),在 GR2 中給出存放五位十進整數(shù)數(shù)字字符的起始地址。
十進制數(shù)字字符用 ASCII 碼表示。當結(jié)果小于五位時,左邊用空白符替換;當二進整數(shù)為零時,在(GR2)+4 中存放 0 的 ASCII 碼。
數(shù)字字符 0 至 9 的 ASCII 碼是 48 至 57,空白符的 ASCII 碼是 32。
[程序]
START
1
LEA
GR1,0
2
LEA
GR3,32
3
L1
____(1)____
4
JPZ
L2
5
ST
GR3,0,GR2
6
LEA
GR2,1,GR2
7
LEA
GR1,1,GR1
8
LEA
GR4,-4,GR1
9
JNZ
L1
10
L2
___(2)___
11
L3
___(3)___
12
JMI
L4
13
SUB
GR0,SNO,GR1
14
LEA
GR3,1,GR3
15
___(4)___
16
L4
ST
GR3,0,GR2
17
LEA
GR2,1,GR2
18
LEA
GR1,1,GR1
19
___(5)___
20
JNZ
L2
21
RET
22
SNO
DC
10000
23
DC
1000
24
DC
100
25
DC
10
26
DC
1
27
END
28
[解]
這是一個典型的二化十匯編語言題例,其算法是將被轉(zhuǎn)換的二進制數(shù)依次被 10i(i為 4、3、2、1、0)除,所得的商即為該十進制數(shù)位的值,其余數(shù)再被下一個 10i 除。一般用減法代替除法,即一邊減10i,一邊計數(shù)器加 1,直到不夠減再進行下一位 10i-1。
1)寄存器分配:GR0:被轉(zhuǎn)換數(shù);GR2:存放五位十進整數(shù)數(shù)字字符的起始地址。
GR1:數(shù)位計數(shù)器(兼作 SNO 內(nèi)存數(shù)組的下標)
GR3:在初始化時放空格的 ASCII 碼(48),在轉(zhuǎn)換時作某一位的數(shù)碼計數(shù)器(初始值為 0 的 ASCII 碼 48)
2)SNO 內(nèi)存變量依次存放 104、103、102、101、100 。
3)第 2~9 行為初始化程序,在 GR0<10i 時,對應(yīng)的十進整數(shù)數(shù)字字符單元放空格(當結(jié)果小于五位時,左邊用空白符替換),此過程一直進行到 GR0≥10i 或 GR1= 4(個位)。因此____(1)____應(yīng)為 "CPL GR0,SNO,GR1"。
4)L2 開始進行除法(減法)。GR3 作某一位的數(shù)碼計數(shù)器。從 L4 可看出,該計數(shù)值直接放到結(jié)果單元 [GR2],而按題意所放的是 ASCII 碼,所以其初始值應(yīng)為 0 的 ASCII 碼 48。因此___(2)___為:
LEA GR3,48
5)根據(jù)算法,GR0≥10i 才做減法,故____(3)____還是 "CPL GR0,SNO,GR1"。
6) ___(4)___是 "JMP L3",即繼續(xù)做這一位的減法,直至 GR0<10i。
7)L4 后 3 行是某一位結(jié)束處理:結(jié)果送到地址指針 GR2 所指的存放單元;地址指針 GR2 加 1;SNO 內(nèi)存數(shù)組的下標 GR1 加 1。
8)___(5)___應(yīng)該是判斷除法是否做到個位結(jié)束。即下標 GR1=5,因此這一句為:
LEA GR3,-5,GR1
7、1996年試題四
[程序說明]
子程序 OFFSET 用二分法,查找無符號整數(shù) M 在一個長度為 N 的有序(升序)無符號整數(shù)列表NTABLE 中的位置。程序中標號為 LOW 和 UP 的兩個存儲字分別用作存放查找空間的上下限。
進入子程序時,在 GR1 中中給出存放子程序所需參數(shù)的起始地址。參數(shù)的存放次序如下圖:
(GR1)+0 M 1 N 2 NTABLE的首址
從子程序返回時,GR0 中存放查找結(jié)果,即 M 在此有序表中的位置序數(shù),如表中找不到 M,則 GR0 中返回 0,其它寄存器的內(nèi)容保持不變。
[程序]
START
1
OFFSET
PUSH
0,GR2
2
PUSH
0,GR3
3
LD
GR0,0,GR1
4
LEA
GR2,0
5
ST
GR2,LOW
6
___(1)___
7
___(2)___
8
ST
GR2,UP
9
LOOP
ADD
GR2,LOW
10
SRL
GR2,1
11
LEA
GR3,0,GR2
12
___(3)___
13
___(4)___
14
JZE
FOUND
15
JPZ
INCLOW
16
LEA
GR2,-1,GR2
;M<NTABLE(K)
17
ST
GR2,UP
18
JMP
CMPLU
19
INCLOW
LEA
GR2,1,GR2
;M> NTABLE(K)
20
ST
GR2,LOW
;K+1→LOW
21
___(5)___
22
CMPLU
CPL
GR2,LOW
23
___(6)___
24
___(7)___
25
FOUND
LEA
GR0,1,GR2
26
POP
GR3
27
POP
GR2
28
RET
29
LOW
DS
1
30
UP
DS
1
31
END
32
[解]
二分法查找的基本思想是對任意一段查找空間 [LOW,UP](有序)中的的表元,試探位置 K=(LOW+UP)/2上的成分 NTABLE(K) 與 M 進行比較,其可能結(jié)果有三種:
1)NTABLE(K)= M,找到,結(jié)束查找。
2)NTABLE(K)< M,下一查找空間為[K+1,UP]。
3)NTABLE(K)> M,下一查找空間為[LOW,K-1]。
初始查找空間為 LOW=0,UP=N-1。
程序中空格___(1)___和___(2)___前面的兩條指令是將查找空間的上限 LOW 中 0,二在它之后的指令是將 GR2 中的值存于查找空間的下限 UP 中。因此這兩個空格是把下限初值 N-1 送給 GR2。由于進入子程序時,N 存放在(GR1)+1 中,所以這兩條指令為:
LD GR2,1,GR1
LEA GR2,-1,GR2
從標號 LOOP 開始的循環(huán)是求試探位置 K,根據(jù) NTABLE(K) 和 M 比較結(jié)果,分別處理三種不同的情況,直至查到或查找空間為 0 。
考察空格___(3)___和___(4)___前面的指令,可得 K 在 GR2 和 GR3 中,在執(zhí)行___(3)___和___(4)___兩條指令后,有三種轉(zhuǎn)向,因此這兩條指令是將 GR0 中的 M 與 NTABLE(K)比較。而從程序說明中以知,NTABLE(0) 地址在 GR1+2。故 NTABLE(K) 的地址應(yīng)為 GR2 或 GR3 與(GR1+2)相加(絕對地址)。但GR2 在后面要作相對地址 K用,所以只能是 GR3 與(GR1+2)相加。所以空格___(3)___和___(4)___為:
ADD GR3,2,GR1
CPL GR0,0,GR3
執(zhí)行上述兩條指令后,若不相等則要調(diào)整查找空間,在繼續(xù)查找前,先應(yīng)判斷查找空間是否為 0,在程序中是用標號為 CMPLU 的指令實現(xiàn),顯然 GR2 內(nèi)應(yīng)是查找空間的下限 UP。故___(5)___的答案為:
LD GR2,UP
當查找空間不為0時(UP>LOW),應(yīng)繼續(xù)查找,所以___(6)___的解答為:
JPZ LOOP
子程序返回時,GR0 中存放查找結(jié)果,在表中找到M時,GR0 中存放M在表中的位置序數(shù),在程序中用 "FOUND LEA GR0,1,GR2" 實現(xiàn)(這里 GR2 中是試探位置,與位置序數(shù)差 1 )。
若表中找不到 M,GR0 中要放 0,所以___(7)___處應(yīng)填 "LD GR2,-1"。
轉(zhuǎn)帖于:軟件水平考試_考試吧- 推薦給朋友
- 收藏此頁
·軟件工程習(xí)題200題之一 (2004-12-29 23:53:00)
·Casl匯編語言輔導(dǎo)(上) (2004-12-27 13:32:00)
如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系,我們將會及時處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。