天天看點

人工智能程式和傳統的計算機,傳統計算機模拟學習程式

該樓層疑似違規已被系統折疊 隐藏此樓檢視此樓

⑶程式說明。

本試驗在記憶體的第一個區域儲存一個字元串,在第二個區域儲存若幹字元串,其中有一個與前一區域的一樣。運作時,把第一區域的字元串與第二區域的字元串相比較,當找到後等待鍵盤訓示,按任意鍵後結束程式。如果在第二區域沒有寫入與第一區域相同的字元串,程式在找不到後不等待鍵盤訓示,直接結束。

PUSH與POP分别是入棧和出棧指令,它們往往要成對使用才不會造成堆棧中資料的混亂,它們經常寫在程式的不同部分,要遵循先入的後出原則,出棧的位置往往要根據需要,已經用不着的入棧資料可以作把它無用出棧。多個資料入棧時,誰先入誰後入必須認真考慮,錯了資料就張冠李戴了。它們的用途有兩種:一種是暫時在堆棧中儲存一下資料以防丢失;另一種是用堆棧傳遞資料,特别是向不能直接使用MOV指令但能使用POP指令接收資料的寄存器。在這裡DI的入、出棧是第一種功能,由于比較時DI的數值要變,重新比較時要出棧使它恢複原來的數值,以便于移動指針。這裡還使用了PUSH與POP指令的第二個功能,即傳遞數字功能。由于“反複比較”指令要使用資料段(DS)和附加段(ES),要在段寄存器中寫入這些段的實際位址。而這些段寄存器又不能直接用MOV指令傳遞資料,要先把資料傳入AX中,再由AX傳入它們中(第一節就用這種方法把CS的值傳到DS中)。而入、出棧指令可以直接對這些段段寄存器操作,并且是單位元組指令,可以減少程式長度。在這裡的入、出棧操作實際是把CS的段位址傳遞給DS和ES,作為DS和ES的段位址。

字元串比較的核心指令是CMPS,它又有兩種形式:CMPSB是每次比較字元串的一個位元組,CMPSW是每次比較字元串的一個字(兩位元組)。指令前面又可以加字首REPZ,它表示反複比較,反複的次數由CX中的數值确定,這樣CX的值就是字元串的長度。沒有字首就隻比較一位元組或一字。CLD是與STD對應的,STD是設定比較由後往前進行,而CLD是清除STD的設定的。如果能夠确定前面确實沒有STD指令,不使用CLD也不會産生從後往前找的效果,使用了也不會産生别的效果。在使用CMPS指令時還有一些規定:比較的源串由DI指出位址,目的串由SI指出位址。它們隻能指出段内位址,規定DI的段位址由ES給出,SI的段位址由DS給出。這樣,在執行CMPS指令前要作很多準備工作:設定資料段和附加段的位址,設定源串和目的串的指針,設定比較次數等。比較工作是這樣進行的:先按SI和DI的指出位址各取出一個字或位元組進行比較,并把CX減一,DI、SI分别減二或減一,再按新SI和DI的指出位址各取出一個字或位元組進行比較,如果比較中有一個位元組不同就停止比較(顯然整個字元串已不可能相同),或直到CX為零停止比較。這樣就比較了一個字元串。找到要找的字元串時,SI和DI分别是在字元串後面的存儲單元位址,如果把與要找字元串相關的内容寫在後面,就可以依據它找到那些内容。

實際比較是用一個字元串與一些字元串比較,是以要設定循環進行反複比較。這裡用JMP這個絕對轉移指令實作循環。編制程式時對循環内外要格外留心。這裡,CX、SI在比較一個字元串後就要變化,反複比較時要再設回原值,是以放在循環以内。DI的變化表示被比較的一些字元串的變動,但在每個字或位元組比較時它也變動,是以要在字元串比較前儲存DI的原值,在每次比較停止後再恢複原值。DI原值加字元串位元組數就是下一個字元串的首址。由于采用絕對轉移指令,必須設定循環出口,才能避免無限循環。這裡設定了兩個循環出口,以反映能找到和不能找到兩種情況。緊接在CMPSW後面的JZ指令是找到後的出口,它轉移到循環外的鍵盤輸入中斷調用功能塊,用該功能塊實作等待。“CMP DI,XX”是檢查資料區是否結束的,XX是資料區的尾址。當到了資料區尾仍舊找不到要找的字元串,顯然不可能找到了。就由緊接在其後的JZ指令轉移到傳回DOS中斷調用功能塊,不等待而直接結束程式。如果沒有這個設定,程式會一直循環下去,造成當機。這裡還要注意:用JZ指令的意義太狹窄,有時已經超過資料區的尾址,但是沒有相等過,是以還是無限循環下去。用大于等于指令比較保險。本程式中DI是等量增長,是以一定能出現相等的情況。

由于要在一些字元串中尋找一個字元串,就要有儲存這些字元串的資料區。而且字元串越多,資料區越大。這裡由于資料較少,我們把源串和目的串都儲存在代碼段。并設定ES、DS與CS同一段。130處儲存着要查找的字元串“你在幹什麼?”。140處儲存着被查找的“你想幹什麼?”、“你在想什麼?”、“你是什麼人?”、“你在幹什麼?”等一些字元串。往程式的資料區中寫這些字元的方法很簡單:在中文作業系統下進入DEBUG,用E或F指令都可以,但是E比F友善,E隻要給出首址就可以了,F卻要給出首、末位址。

⑷程式的制作和使用。這個程式編成名為BIJIAO.COM檔案,可以在DOS下運作。但是由于找到的字元串不顯示。在DEBUG中執行效果更好。由A指令把彙編語言翻譯為代碼語言後,可以在T=100的指令下一條條地執行。由于是在DEBUG中執行,資料區可以修改,觀察到能夠找到和不能找到兩種情況。執行時還可以觀察到反複執行CMPSW的情況:CX不斷減少、DI和SI斷減少。也可以觀察到找到後的轉移、找不到後的轉移等�