三、試題解釋
1、2002年試題四 [程序說明]
本程序將 80 個 ASCII 編碼的數(shù)字字符轉換成 BCD 碼(二十進制碼),并將每四個 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ū)中,轉換和壓縮結果存放在 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ù)字字符轉換成 BCD 碼,并將每四個 BCD 碼壓縮在一個字中。必須有雙重循環(huán):內(nèi)循環(huán)將每四個 BCD 碼壓縮在一個字中,外循環(huán)完成 80 個 ASCII 碼轉換(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是目的地址指針,應該在第3行賦初值。從而得到__(1)__空應為LEA GR2,0。
從第7行及第9行可知,第7~9行是將轉換好的BCD碼拼裝到壓縮字中。GR4是壓縮字、WK是放轉換好的 BCD 碼的暫存單元。由此得__(2)__是將十進制數(shù)的ASCII碼轉換成BCD碼,即AND GR0,CF。而將BCD碼拼裝到壓縮字前,應該將壓縮字中原來的BCD碼左移4位,所以__(3)__空應為SLL GR4,4。
第10~17行應該是內(nèi)外循環(huán)的控制語句,也是本程序的難點。
從第10、11行可看出,第15~17行應該內(nèi)循環(huán)尚未結束的處理,但第16、17行卻是判斷外循環(huán)結束的語句。因此可知,此程序把內(nèi)外循環(huán)的控制語句合在一起了。__(5)__空應是JNZ S1 或 JMI S1,注意,應該是跳轉到內(nèi)循環(huán)的起點S1,而不應該是S0。因為此處內(nèi)循環(huán)尚未結束,不能給內(nèi)循環(huán)計數(shù)器GR3重新賦值。
第12~14行應該是內(nèi)循環(huán)結束的處理,即把拼裝好的壓縮字送回到目的地址(第12、13行)。但__(4)__空不應該是JMP S0,因為這樣將會越過判斷外循環(huán)結束的語句第16、17行。所以__(4)__空應該是非跳轉語句,而從__(5)__(JNZ S1)看,內(nèi)循環(huán)計數(shù)器GR3應重新賦值,所以__(4)__空應該是LEA GR3,4。
標號S0與WL是沒用的。另外壓縮字GR4也不需賦初值清0,因為4次移位,每次移4位,原來不管是什么數(shù)都移出到外面了。
1、2002年試題四 [程序說明]
本程序將 80 個 ASCII 編碼的數(shù)字字符轉換成 BCD 碼(二十進制碼),并將每四個 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ū)中,轉換和壓縮結果存放在 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ù)字字符轉換成 BCD 碼,并將每四個 BCD 碼壓縮在一個字中。必須有雙重循環(huán):內(nèi)循環(huán)將每四個 BCD 碼壓縮在一個字中,外循環(huán)完成 80 個 ASCII 碼轉換(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是目的地址指針,應該在第3行賦初值。從而得到__(1)__空應為LEA GR2,0。
從第7行及第9行可知,第7~9行是將轉換好的BCD碼拼裝到壓縮字中。GR4是壓縮字、WK是放轉換好的 BCD 碼的暫存單元。由此得__(2)__是將十進制數(shù)的ASCII碼轉換成BCD碼,即AND GR0,CF。而將BCD碼拼裝到壓縮字前,應該將壓縮字中原來的BCD碼左移4位,所以__(3)__空應為SLL GR4,4。
第10~17行應該是內(nèi)外循環(huán)的控制語句,也是本程序的難點。
從第10、11行可看出,第15~17行應該內(nèi)循環(huán)尚未結束的處理,但第16、17行卻是判斷外循環(huán)結束的語句。因此可知,此程序把內(nèi)外循環(huán)的控制語句合在一起了。__(5)__空應是JNZ S1 或 JMI S1,注意,應該是跳轉到內(nèi)循環(huán)的起點S1,而不應該是S0。因為此處內(nèi)循環(huán)尚未結束,不能給內(nèi)循環(huán)計數(shù)器GR3重新賦值。
第12~14行應該是內(nèi)循環(huán)結束的處理,即把拼裝好的壓縮字送回到目的地址(第12、13行)。但__(4)__空不應該是JMP S0,因為這樣將會越過判斷外循環(huán)結束的語句第16、17行。所以__(4)__空應該是非跳轉語句,而從__(5)__(JNZ S1)看,內(nèi)循環(huán)計數(shù)器GR3應重新賦值,所以__(4)__空應該是LEA GR3,4。
標號S0與WL是沒用的。另外壓縮字GR4也不需賦初值清0,因為4次移位,每次移4位,原來不管是什么數(shù)都移出到外面了。

