正文 第四章 彙編語言程序設計(二)(1 / 3)

4.多重循環程序

循環程序在執行過程中,每循環一次,循環體僅執行一遍,這種循環程序,我們稱之為單重循環程序,也叫簡單循環程序。然而在實踐中,有時問題比較複雜,用單重循環還不夠,還必須用多重循環才能解決問題。所謂多重循環程序,其循環程序的循環體本身就是一種循環程序,也就是循環中還套著循環程序。

例如,數的分選排列程序便是一種多重循環程序。設有0個數,它們分別存放於1137為起始地址的存儲區內。要求我們.編製一個程序,將個數進行大小比較之後,使它們按由小到大(或由大到小)的次序排列再存入這個單元中。

這個問題可以這樣處理,依次將相鄰兩單元的內容進行比較,即第一個與第二個、第二個與第三個……進行比較,如果符合從小到大的順序則不動,否則將它們交換位置。如此反複比較和交換,直到數列排好為止。由於分選過程中較小者(或較大者)將往上冒,故也稱為“冒泡法”。

從實例可以看出,每次冒上去的不一定是本次最小的數,但每次沉底的必是本次最大的數。為了加快程序的速度,要考慮這個特點,即要比較交換的數每次少一個。而且隻要不發生交換就表示已按大小順序排列了,就可以結束比較。

四、子程序

我們在編製程序過程中,往往遇到在一個程序中有許多相同的運算(例如:乘、除、求平方根等),或有相同的操作(例如:代碼變換、字符處理等),或是這些運算或操作在不同程序中都會遇到。如果我們每次都從頭編起,這不僅浪費寶貴的存儲器,也會增加程序編製的工作量。解決的辦法是將這些相同的運算或相同的操作,編製成子程序,存在存儲器的特定區域,當編製程序時遇到這些運算或操作,可以去調用這些子程序。

由於子程序執行次數較多,因此,對編製子程序應該有較高的要求。例如,程序應盡量短,所占內存單元也盡量少(包括工作單元)執行速度盡量快,盡可能編製成浮動的程序,以便裝配等等。

為便於大家共享這些子程序,子程序清單要有很清晰的說明,這些說明一般包括為子程序起一個能反映功能的名字;最好有子程序功能的簡單說明;進入子程序(入口)時,它所要處理的數據如何給予子程序結束時,其處理的結果存在何處多執行子程序後,將會改變哪些內的寄存器等。

下麵我們給出一些常用子程序實例:

1.字符處理子程序

【例1】確定一串為5011字符串的個數,設字符串的起始地址在寄存器中。字符的結束用一個回車符(即08,十六進製00)標記,把求出的字符串長度(不包括回車符5置於累加器)內。

【例2】給入字符串加偶校驗(即給一串7位的為501碼字符加一位偶校驗位)。字符串的長度放在入累加器中,字符串的起始地址放在寄存器對中。校驗位置於每個字符的最高位,即如果字符中“1”的個數為奇數時,則最高位置1,使之變為偶數。

代碼轉換是微型機和外部設備交換數據時常遇到的問題。一般外部設備以為5011,或各種專用代碼形式提供數據給微型機,微型機要把這些代碼轉換成可供處理的某種標準形式代碼,例如轉換成二進製。微型機處理的結果以二進製代碼給出,而輸出設備要打印結果或者顯示結果,要用口碼或七段碼。所以,微型機處理結束之後也要把結果轉換成適合打印、顯示的代碼。

代碼轉換是很常用的程序,所以我們編成子程序的形式。

【例3】十六進製轉換成七段碼,十六進製換成七段碼,這是用七段發光二極管顯示器的單板機監控程序中,一般都要用到的子程序。

七段碼和數字之間的關係是無一定規律的,所以隻能采用查表法來轉換。先將七段碼按次序存入存儲器。這樣,隻要將數字和七段碼表的首地址相加,就得出所對應代碼的存儲單元地址。由變址尋址或間接尋址方法,可以取到相應的七段碼編碼。

子程序功能:將十六進製數字轉換成一個七段碼,結果放在入口:十六進製數字在入中,七段碼首地址在中出口八中為轉換好的七段碼家設要轉換的數字在入累加器中,七段碼表的首地址在寄存器對中,轉換的結果在八累加器中。

【例4】十進製整數轉換成二進製的子程序十進製整數轉換成二進製的方法有多種,其中之一是除2取餘數。

要讓計算機實現除2取餘,可以采用移位加校正的方法。要轉換的十進製數是用碼表示的(即用四位權為8421的二進製來表示一位十進製數),並且用多字節來表示一個數據。轉換後的二進製也要用多個字節來表示。假設十進製整數和轉換後的二進數在存儲器內順序存放。它們連在一起橫向排列時,要符合這樣的規定:高位在左,低位在右;待轉換的十進製數在左,轉換完的二進製數在右。轉換步驟如下,轉換過程是連續除2取餘數。所以,可用循環程序的結構。循環體是實現除2取餘。即采用兩種數據連接起來向右移一位,將餘數移入二進製的存儲單元。循環次數取決於除2的次數,即轉換完後二進製的位數。

由於每個數據是用多個字節表示的,但每執行一次移位指令隻能移一個字節,所以,實現移一位也要用循環的辦法,循環次數決定於字節數。

每執行一次移位指令後(即移一字節),要檢查碼中的一個數位的最高位是否為1。若為1要將該數位減3(即撿查移位後的數據每字節的7位以及0位。若07位為1,減30;0位為1減3)。