查看全部128種考試
軟件水平考試
 考試動態(tài) 報考指南 歷年真題 模擬試題 復(fù)習(xí)資料 心得技巧 專業(yè)英語 技術(shù)文章 軟考論壇 考試用書
 程序員 軟件設(shè)計師 網(wǎng)絡(luò)管理員 網(wǎng)絡(luò)工程師 系統(tǒng)分析師 數(shù)據(jù)庫系統(tǒng)工程師
1
2
3
4
5
6
7
8
9
10
Exam8.com  
【字體: Casl匯編語言輔導(dǎo)(下)
Casl匯編語言輔導(dǎo)(下)
spks.exam8.com 來源:考試吧(Exam8.com) 更新:2004-12-29 23:52:00 軟件水平考試 考試論壇

、試題解釋

1、2002年試題四
[程序說明]

本程序?qū)?80 個 ASCII 編碼的數(shù)字字符轉(zhuǎn)換成 BCD 碼(二十進(jìn)制碼),并將每四個 BCD 碼壓縮在一個字中。見下面圖示。

數(shù)字字符數(shù)據(jù)

地址

ASCII

 

+0

0033H

'3'

+1

0036H

'6'

+2

0038H

'8'

+3

0032H

'2'

...

...

 

壓縮后的數(shù)據(jù)

地址 BCD碼
YS 3682H
... ...

程序中約定原始數(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)開始標(biāo)號。

從第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)__是將十進(jìn)制數(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。

標(biāo)號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 子字符串,并在其前后兩端分別添加 ~{ 和 ~} 作為標(biāo)記;而對于原 ASCII 子字符串,則將其中的 ~ 改寫為 ~~,其余字符不變。

DEHZ 解碼子程序則是 HZ 編碼的復(fù)原過程。復(fù)原 ASCII 子字符串過程中遇有 ~~ 字符則改寫為一個 ~ ,遇有 ~{ 則將其后直至 ~} 標(biāo)記前的各字節(jié)高位置 1,復(fù)原為漢字子字符串,同時刪除其前后標(biāo)記。~的后續(xù)字符不屬于以上情況均作為錯誤處理。

調(diào)用該子程序時, GR1 存放原始字符串首地址, GR2 存放還原后的目標(biāo)字符串首地址。工作寄存器  GR3 用作處理漢字子字符串的識別標(biāo)志,進(jìn)入子程序時應(yīng)初始化為處理 ASCII 子字符串。程序按照   CASL 語言的標(biāo)準(zhǔn)約定,字符串的每個字符只占用一個存儲字的低八位。原始字符串和目標(biāo)字符串均以 0 作為結(jié)束標(biāo)志。

[程序]

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:目標(biāo)字符串地址指針,調(diào)用該子程序時,存放目標(biāo)字符串首地址。

GR3:用作處理漢字子字符串的識別標(biāo)志。0 表示 ASCII 碼(初始值),1 表示漢字。

GR0:工作寄存器,存放待處理的字符。(從第 7 行 "CPA  GR0,MARK0" 看出)

分析:

1)從第 7 行 " CPA  GR0,MARK0" 看出,GR0 中存放待處理的字符。所以第 6 行(__(1)__)必定是一條取數(shù)指令:"LD  GR0,0,GR1" ,即把源字符串地址指針?biāo)傅淖址〉?GR0 中。

2)從第 7 行及第 8 行可知,第 9 行到第 17 行是處理碰到“~”的情況,即判斷后一字符是否是“~”、“{ ”及“}”。若都不是,則出錯。

3)從第 11 行可知,要判斷是否連續(xù)兩個“~”情況,而后面是繼續(xù)比較,所以第 12 行(__(2)__)應(yīng)該是一條“JZE”指令,而且是轉(zhuǎn)移到 GOON ,即把“~”存放到目標(biāo)字符串中。

4)第 13 行“CPA GR0,MARK1,GR3”應(yīng)該是比較“{ ”及“}”:在中文狀態(tài)比較“}”(結(jié)束),在西文狀態(tài)比較“{ ”(開始)。所以這里用的是變址尋址,即由 GR3 的值是 0 或 1,決定是比較“{ ”還是“}”。

5)第 12 行(__(3)__)應(yīng)該是改變漢字子字符串的識別標(biāo)志 GR3 的指令,即原來是 0 的變成 1,原來是 1 的變成 0,異或指令可以達(dá)到此目的。將 GR3 與常數(shù) 1 相異或,因 Casl 沒有沒有立即數(shù)運算指令,只能和常數(shù) V1 異或:EOR GR3,V1。

6)第 20 行(__(4)__)是 GR0 中存放的字符送到目標(biāo)字符串前的處理工作:若是西文狀態(tài)( GR3 的值是 0 ),保持原樣;若是中文狀態(tài)( GR3 的值是 1 ),字節(jié)最高位置 1,復(fù)原為漢字子字符串,將GR0 的內(nèi)容與十六進(jìn)制數(shù) 0080 相或,即能達(dá)到目的。所以這條指令應(yīng)是:OR GR0,V0,GR3 。

7)第 24 行將 GR0 與 0 比較,是判斷字符串結(jié)束標(biāo)志 0 。若非 0(未結(jié)束),繼續(xù)處理。故第 25 行(__(5)__)應(yīng)是一條條件轉(zhuǎn)移指令:JNZ LOOP 。

3、2000年試題四

[程序說明]

(1)本子程序根據(jù)每位職工的基本工資(非負(fù)值)和他完成產(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é)束標(biāo)志)

 其中 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 進(jìn)制常量的標(biāo)號(第 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ù)為負(fù))是一循環(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 位二進(jìn)位串,求它的奇校驗位,生成 16 位二進(jìn)制位串,使 16 位二進(jìn)制位串有奇數(shù)個 1。

進(jìn)入此子程序時,15 位二進(jìn)制位串在 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)換的二進(jì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,即當(dāng) 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 中。
調(diào)用該子程序時,主程序在 GR1 中給出存放子程序所需參數(shù)的起始地址。參數(shù)的存放次序如下圖:

(GR1)+0

A

+1

n

+2

B

[程序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 位二進(jìn)位。

程序中,被統(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 L316
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é)標(biāo)志。起始值為 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 變址尋址)。故34為:"ADD GR2,NCH,GR3"及"ST GR2,NCH,GR3"。

6)在一個字的第二次處理后(用第 24、25 行判斷),要修改字符串的地址指針 GR1(加1)。故    (5為:"LEA GR1,1,GR1"。

6、1997年試題四

[程序說明]

本子程序?qū)⒁粋非負(fù)二進(jìn)整數(shù)翻譯成五位十進(jìn)整數(shù)字符。

進(jìn)入子程序時,在 GR0 中給出被翻譯的非負(fù)二進(jìn)整數(shù),在 GR2 中給出存放五位十進(jìn)整數(shù)數(shù)字字符的起始地址。

十進(jìn)制數(shù)字字符用 ASCII 碼表示。當(dāng)結(jié)果小于五位時,左邊用空白符替換;當(dāng)二進(jìn)整數(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)換的二進(jìn)制數(shù)依次被 10i(i為 4、3、2、1、0)除,所得的商即為該十進(jìn)制數(shù)位的值,其余數(shù)再被下一個 10i 除。一般用減法代替除法,即一邊減10i,一邊計數(shù)器加 1,直到不夠減再進(jìn)行下一位 10i-1。

1)寄存器分配:GR0:被轉(zhuǎn)換數(shù);GR2:存放五位十進(jìn)整數(shù)數(shù)字字符的起始地址。

GR1:數(shù)位計數(shù)器(兼作 SNO 內(nèi)存數(shù)組的下標(biāo))

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)的十進(jìn)整數(shù)數(shù)字字符單元放空格(當(dāng)結(jié)果小于五位時,左邊用空白符替換),此過程一直進(jìn)行到 GR0≥10i 或 GR1= 4(個位)。因此____(1)____應(yīng)為 "CPL GR0,SNO,GR1"。

4)L2 開始進(jìn)行除法(減法)。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ù)組的下標(biāo) GR1 加 1。

8)___(5)___應(yīng)該是判斷除法是否做到個位結(jié)束。即下標(biāo) GR1=5,因此這一句為:

LEA GR3,-5,GR1

7、1996年試題四

[程序說明]

子程序 OFFSET 用二分法,查找無符號整數(shù) M 在一個長度為 N 的有序(升序)無符號整數(shù)列表NTABLE 中的位置。程序中標(biāo)號為 LOW 和 UP 的兩個存儲字分別用作存放查找空間的上下限。

進(jìn)入子程序時,在 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 進(jìn)行比較,其可能結(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。由于進(jìn)入子程序時,N 存放在(GR1)+1 中,所以這兩條指令為:

LD GR2,1,GR1

LEA GR2,-1,GR2

從標(biāo)號 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,在程序中是用標(biāo)號為 CMPLU 的指令實現(xiàn),顯然 GR2 內(nèi)應(yīng)是查找空間的下限 UP。故___(5)___的答案為:

LD GR2,UP

當(dāng)查找空間不為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)帖于:軟件水平考試_考試吧
文章搜索  
看了本文的網(wǎng)友還看了:
·軟件工程習(xí)題200題之二  (2004-12-29 23:54:00)
·軟件工程習(xí)題200題之一  (2004-12-29 23:53:00)
·Casl匯編語言輔導(dǎo)(上)  (2004-12-27 13:32:00)
網(wǎng)友評論
昵 稱: *  評 分: 1分 2分 3分 4分 5分
標(biāo)題:   匿名發(fā)表    (共有條評論)查看全部評論>>
版權(quán)聲明 -------------------------------------------------------------------------------------
  如果軟件水平考試網(wǎng)所轉(zhuǎn)載內(nèi)容不慎侵犯了您的權(quán)益,請與我們聯(lián)系,我們將會及時處理。如轉(zhuǎn)載本軟件水平考試網(wǎng)內(nèi)容,請注明出處。
關(guān)于本站  網(wǎng)站聲明  廣告服務(wù)  聯(lián)系方式  付款方式  站內(nèi)導(dǎo)航  客服中心  友情鏈接  考試論壇  網(wǎng)站地圖
Copyright © 2004-2008 考試吧軟件水平考試網(wǎng) All Rights Reserved    
中國科學(xué)院研究生院權(quán)威支持(北京) 電 話:010-62168566 傳 真:010-62192699
百度大聯(lián)盟黃金認(rèn)證  十佳網(wǎng)絡(luò)教育機(jī)構(gòu)  經(jīng)營許可證號:京ICP060677