Casl匯編語言輔導(下)

字號:

三、試題解釋
    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ù)都移出到外面了。