匯編語言課程設計--實現(xiàn)加減乘除四則運算的計算器_第1頁
已閱讀1頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

1、<p><b>  目 錄</b></p><p><b>  1 設計目的1</b></p><p><b>  2 概要設計1</b></p><p>  2.1 系統(tǒng)總體分析1</p><p>  2.2 主模塊框圖及說明2</p>

2、<p><b>  3 詳細設計3</b></p><p>  3.1 主模塊及子模塊說明3</p><p>  3.2 各模塊詳細設計3</p><p>  3.2.1 判定運算符模塊設計3</p><p>  3.2.2取運算數(shù)模塊3</p><p>  3.2.3計算模塊

3、4</p><p>  3.2.4結(jié)果處理模塊5</p><p>  3.2.5輸出模塊5</p><p>  3.2.6錯誤處理模塊6</p><p><b>  4 程序調(diào)試7</b></p><p>  4.1 運行界面分析7</p><p>  4.2

4、調(diào)試過程及分析7</p><p><b>  5 心得體會8</b></p><p>  5.1 設計體會8</p><p>  5.2 系統(tǒng)改進8</p><p><b>  參考文獻10</b></p><p>  附 錄11</p>&

5、lt;p>  實現(xiàn)加減乘除四則運算的計算器</p><p><b>  1 設計目的</b></p><p>  匯編語言是繼機器語言后出現(xiàn)的計算機程序設計語言,是計算機所能提供給用戶使用的最快而又最有效的語言,也是能夠利用計算機所有硬件特征并能夠直接控制硬件的惟一語言。因而了解之一語言的特性,并熟練掌握這一語言并應用于開發(fā)中便是計算機專業(yè)學生所必需掌握的技能之

6、一。</p><p>  本課程設計通過加減乘除四則運算計算器的設計,增強對于匯編語言寄存器、指令、偽指令、中斷等的理解??赏ㄟ^編寫的匯編程序完成基本的加減乘除四則運算。</p><p>  主要功能:能實現(xiàn)加減乘除的計算;該程序接受的是16進制數(shù);執(zhí)行時,需在文件名后直接跟上計算表達式,如在命令提示符下執(zhí)行結(jié)果如下:</p><p>  C:\tasm>js

7、 3+2</p><p><b>  5</b></p><p><b>  2 概要設計</b></p><p>  2.1 系統(tǒng)總體分析</p><p>  四則運算計算器應當實現(xiàn)對用戶輸入表達式的處理。根據(jù)用戶輸入的表達式,完成加減乘除四則運算。程序自動判定表達式輸入,并完成對于輸入的16進制

8、數(shù)的轉(zhuǎn)換,同時計算結(jié)果并以10進制數(shù)輸出。對于異常情況程序應當進行處理,保證程序的正確運行。</p><p>  設計一個計算器,在DOS界面下輸入<程序名> <表達式>可直接輸出運算結(jié)果。例如在DOS界面中輸入JS 3+6,可直接輸出9。程序接受16進制數(shù)輸入,以十進制數(shù)輸出運算結(jié)果。對于輸出錯誤情況,程序自動給出錯誤提示,若輸入的格式有誤,程序給出“JS <Expression&

9、gt; [10]”(即輸入樣例)提示,若輸入的表達式有誤,程序給出“Error in expression !”(即表達式錯誤)提示。程序需根據(jù)用戶輸入的表達式自動提取出運算符和操作數(shù),之后根據(jù)用戶輸入的操作符進行四則運算,后將寄存器中存儲的二進制數(shù)轉(zhuǎn)換為10進制數(shù)輸出。程序應自動判斷用戶輸入表達式的正確性,若輸入的表達式有誤,程序應輸出錯誤提示后退出,防止因輸入錯誤造成的程序崩潰。</p><p><b&

10、gt;  程序流程圖如下:</b></p><p>  2.2 主模塊框圖及說明</p><p><b>  3 詳細設計</b></p><p>  3.1 主模塊及子模塊說明</p><p>  模塊設計是程序編制中的重要環(huán)節(jié)。將復雜的程序模塊化有助于程序的調(diào)試和修改,同時極大的方便了編程人員對于程序的調(diào)

11、整。</p><p>  在本程序中,將四則運算計算器分為了判定運算符模塊,取運算數(shù)模塊,計算模塊,結(jié)果處理模塊,輸出模塊和錯誤處理模塊。以下對這幾個模塊分別進行詳細敘述。</p><p>  3.2 各模塊詳細設計</p><p>  3.2.1 判定運算符模塊設計</p><p>  判定運算符子程序主要通過調(diào)用判定加減運算符子程序和判定

12、乘除運算符子程序完成對于運算符的判定。在判定運算符子程序中,通過LODSB取輸入串,之后通過CALL指令調(diào)用判定加減運算符子程序ISJJ,若判定不是加減運算,則程序順序執(zhí)行判定是否為乘除運算。在加減、乘除判斷子程序中,采用CMP指令判定運算符情況。并根據(jù)運算符情況條轉(zhuǎn)至相應的計算子程序。</p><p>  注意,在此部分中考慮到用戶輸入的除法運算符可能有“\”或“/”兩種情況,故在乘除判定子程序中分別考慮了兩種

13、情況的判定,保證程序的健壯性,使程序不會因輸入錯誤產(chǎn)生錯誤提示。</p><p><b>  故有如下指令:</b></p><p>  CMP AL,'*'</p><p>  JZ ISYSF1 ;*判定,若為/則轉(zhuǎn)制*/\運算</p><p>  CMP AL,'/'<

14、/p><p>  JZ ISYSF1 ;/判定,若為/則轉(zhuǎn)制*/\運算</p><p>  CMP AL,'\'</p><p>  3.2.2取運算數(shù)模塊</p><p>  取運算數(shù)模塊主要用來將參與計算的運算數(shù)取出。通過LODSB載入串后,程序判定輸入的是“1”-“9”間的數(shù)還是“A”-“F”間的數(shù)(輸入數(shù)以十六進制

15、表示)并進行相應的處理,通過CMP指令判定輸入的運算數(shù)類型,將其對應的ASCII碼轉(zhuǎn)換為數(shù)值,通過寄存器尋址方式將其數(shù)值(二進制)保存在DX:AX寄存器中。</p><p>  具體實現(xiàn)如下(部分代碼省略,見附錄1):</p><p>  AND AX,0FH</p><p><b>  SHL DI,1</b></p><

16、p><b>  RCL DX,1</b></p><p><b>  MOV BX,DI</b></p><p><b>  MOV BP,DX</b></p><p><b>  SHL DI,1</b></p><p><b>  RC

17、L DX,1</b></p><p><b>  SHL DI,1</b></p><p><b>  RCL DX,1</b></p><p>  JCXZ DATE3</p><p><b>  SHL DI,1</b></p><p>

18、<b>  RCL DX,1</b></p><p>  Jmp short DATE4</p><p><b>  ……</b></p><p>  針對用戶可能存在的在輸入“A”-“F”時的大小寫問題,程序中采用了兩條CMP語句判定輸入情況并根據(jù)輸入的情況跳轉(zhuǎn)至DATA5地址進行數(shù)據(jù)的處理。即為如下指令:</p&

19、gt;<p>  JCXZ DATE7</p><p>  CMP AL,'A'</p><p><b>  JB DATE7</b></p><p>  CMP AL,'F'</p><p><b>  JBE DATE5</b></p>

20、<p>  CMP AL,'a'</p><p><b>  JB DATE7</b></p><p>  CMP AL,'f'</p><p><b>  JBE DATE5</b></p><p><b>  3.2.3計算模塊</b&

21、gt;</p><p>  根據(jù)前兩個模塊的處理結(jié)果,將運算符和運算數(shù)取出后便可進行計算。通過調(diào)用加減子程序和乘除子程序完成計算。由于允許用戶輸入的數(shù)據(jù)為32位整數(shù),超出了AX/DX單寄存器所能保存的范圍,故通過DX:AX寄存器存儲運算后的數(shù)。故在加減運算中,需使用ADD NUM1,AX;ADC NUM1+2,DX或SUB NUM1,AX;SBB NUM1+2,DX語句序列完成運算以確保進位不會丟失。在乘法運算中

22、,將乘數(shù)保存在CX寄存器中,在除法運算中,將除數(shù)保存在CX寄存器中以完成運算。</p><p><b>  具體實現(xiàn)如下:</b></p><p>  CMP YSF1,'+'</p><p>  SUB NUM1,AX</p><p>  SBB NUM1+2,DX ;減法運算</p>

23、<p>  ADD NUM1,AX</p><p>  ADC NUM1+2,DX ;加法運算</p><p><b>  ……</b></p><p>  CMP YSF2,'*'</p><p>  JNZ JSII2_2</p><p><b>  

24、DB 66H</b></p><p>  IMUL CX ;乘法運算</p><p><b>  ……</b></p><p><b>  DB 66H</b></p><p>  IDIV CX ;除法運算</p><p>  CMP YSF2,'

25、;/'</p><p>  JZ JSII2_3</p><p>  3.2.4結(jié)果處理模塊</p><p>  結(jié)果處理模塊主要包括運算結(jié)果由二進制向十進制的轉(zhuǎn)化和保存運算結(jié)果兩個子程序。由于運算后,在DX:AX寄存器中保存的操作數(shù)為二進制數(shù),在輸出前需將其轉(zhuǎn)換成十進制數(shù)并將其對應的ASCII碼保存在寄存器中。二進制轉(zhuǎn)化為十進制即從最高位開始,每次除以最高

26、位整數(shù)。保存商在AX中,余數(shù)在DX中。之后除以次高位循環(huán),一直除到最后一位為止。在保存結(jié)果模塊中,將通過數(shù)制轉(zhuǎn)換模塊形成的十進制數(shù)的ASCII碼保存在寄存器中,使用寄存器尋址方式和基址變址尋址方式。</p><p>  MOV AH,52H</p><p><b>  INT 21H</b></p><p>  MOV AX,ES:[BX-2]

27、</p><p><b>  MOV DS,AX</b></p><p>  MOV AX,CS:JGV4</p><p>  MOV DS:[0CH],AX</p><p>  MOV AX,CS:JGV4+2</p><p>  MOV DS:[0EH],AX</p><p

28、><b>  3.2.5輸出模塊</b></p><p>  輸出模塊包括換行符,制表符和運算結(jié)果的輸出。程序在完成計算后將寄存器中的數(shù)取出,通過INT 21H中斷的2號功能將結(jié)果輸出到屏幕上。同時為了保證輸出結(jié)果的美觀,在用戶按下Enter鍵后,首先輸入一個回車符和一個制表符,這樣可以保證輸出的結(jié)果與用戶輸入的表達式對齊,使程序人機界面更加美觀。</p><p&g

29、t;  輸出模塊具體實現(xiàn)如下:</p><p><b>  MOV AL,9</b></p><p>  JMP SHORT DISP</p><p>  9即代表制表符的ASCII碼。程序?qū)?送入AL中,通過調(diào)用DISP子程序輸出一個制表符。</p><p><b>  MOV AL,13</b>

30、</p><p><b>  CALL DISP</b></p><p><b>  MOV AL,10</b></p><p>  13即代表回車符的ASCII碼。程序?qū)?3送入AL寄存器中,通過調(diào)用DISP子程序輸出一個回車符。</p><p><b>  PUSH AX</b&

31、gt;</p><p><b>  PUSH DX</b></p><p><b>  MOV AH,2</b></p><p><b>  MOV DL,AL</b></p><p><b>  INT 21H</b></p><p&

32、gt;  程序通過調(diào)用21號中斷的2號功能實現(xiàn)對于單個字符的輸出。單個字符可以表示運算結(jié)果,也可以表示回車符或換行符。在需要輸出單個字符時,程序均通過調(diào)用DISP子程序?qū)崿F(xiàn)。</p><p>  3.2.6錯誤處理模塊</p><p>  雖然在程序編制過程中已經(jīng)考慮到了一些潛在錯誤的處理,如除號輸入方式的不同,和16位A-F數(shù)輸入大小寫的問題,但是仍不能保證程序的健壯性。在針對用戶輸入的

33、錯誤表達式時,仍然需要程序做出相應的反應避免因輸入錯誤造成的可能的程序崩潰。因此仍然需要進行錯誤處理。</p><p>  針對于用戶可能出現(xiàn)的表達式形式錯誤,如輸入諸如“+ 3 2”等錯誤表達式,程序?qū)⑻D(zhuǎn)至MESS1符號地址處同時輸出錯誤,針對用戶可能出現(xiàn)的表達式錯誤,如輸入“3+g”等,程序?qū)⑻D(zhuǎn)至MESS2符號地址處同時輸出錯誤,之后程序?qū)⒆詣油顺觯员苊獗罎ⅰ?lt;/p><p>&

34、lt;b>  此部分實現(xiàn)如下:</b></p><p>  MESS1 DB 13,10,' Syntax:',13,10</p><p>  DB ' JS <Expression> [10]',13,10,'$'</p><p>  MESS2 DB 'E

35、rror in expression !$'</p><p>  MESS3 DB 13,10,'$'</p><p><b>  4 程序調(diào)試</b></p><p>  4.1 運行界面分析</p><p>  本程序直接在DOS提示符下出入JS+表達式,回車后即自動輸出運算結(jié)果,故無傳統(tǒng)

36、意義上的運行界面。</p><p>  4.2 調(diào)試過程及分析</p><p>  分別輸入加、減、乘、除四個運算表達式,查看程序的運行結(jié)果,以測試程序的正確性和功能的完整性。</p><p>  輸入錯誤的表達式格式,查看程序運行結(jié)果。輸入錯誤的表達式,查看程序運行結(jié)果以測試程序的健壯性。</p><p>  輸入JS 3+2,程序運行結(jié)果

37、如下:</p><p>  輸入JS 5-4,程序運行結(jié)果如下:</p><p>  輸入JS 5*1,程序運行結(jié)果如下:</p><p>  輸入JS a/2,程序運行結(jié)果如下:</p><p>  輸入JS A\2,程序運行結(jié)果如下:</p><p>  輸入JS +11,程序運行結(jié)果如下:</p>

38、<p>  輸入JS 1+G,程序運行結(jié)果如下:</p><p>  測試表明,程序可以自動判定輸入的運算符和運算數(shù),并根據(jù)用戶輸入的表達式自動將2進制轉(zhuǎn)換為10進制并輸出計算結(jié)果,在輸入的表達式錯誤時,程序可以輸出不同類型的錯誤提示。</p><p>  綜上,根據(jù)測試,程序功能符合要求。</p><p><b>  5 心得體會</b&

39、gt;</p><p><b>  5.1 設計體會</b></p><p>  本程序通過對四則運算計算器的編寫,用匯編語言時間了加、減、乘、除四則運算功能,根據(jù)用戶輸入的表達式可以自動計算出結(jié)果并輸出在屏幕上。經(jīng)測試表明程序運行結(jié)果與預期結(jié)果一致,較好地實現(xiàn)了課程設計所預設的各項功能。通過在程序編寫過程中,考慮到了一定的錯誤情況,并針對可能的錯誤進行了一定的處理,

40、保證了程序的健壯性。</p><p>  通過課程設計過程,綜合運用到了匯編語言寄存器、操作數(shù)、指令與偽指令、分支、循環(huán)程序設計、子程序和中斷調(diào)用等方面的知識,通過模塊的合理劃分降低了程序編寫的難度,在程序?qū)懽鬟^程中及時添加注釋以方便程序錯誤的查找和對程序的修改。使我對于匯編語言的理解更加深入,對于程序設計的過程也有了一定的了解,同時培養(yǎng)了良好的編程風格,為今后對于其他計算機語言的學習打下了堅實的基礎。</

41、p><p><b>  5.2 系統(tǒng)改進</b></p><p>  同時應當看到,這個程序還存在著很大的不足。例如只能完成對于兩個操作數(shù)表達式的運算,在一次運算結(jié)束后無法根據(jù)用于意愿進行下次輸入或是退出的選擇,每次只能執(zhí)行一個表達式的運算,無法處理括號等復雜的運算符,程序健壯性仍然有待改進等等。</p><p>  在今后的改進中,應當重點改進用

42、戶界面上?,F(xiàn)有的用戶界面的用戶交互性不足,直接輸入表達式雖然簡便,但是容易造成用戶表達式的輸入錯誤,從而造成程序發(fā)生錯誤。雖然在設計過程中已經(jīng)針對于此考慮到了一些情況,但是在測試過程中仍會發(fā)現(xiàn)CPU運行錯誤等未預料到的問題。因此在改進中,應當增加用戶界面。在輸入JS后,可以提示用戶輸入運算數(shù)和運算符,從而避免輸入錯誤造成的程序錯誤。</p><p><b>  參考文獻</b></p&

43、gt;<p>  [1]姚燕南,薛鈞義主編.微型計算機原理與接口技術(shù).高等教育出版社,2004.11</p><p>  [2]溫冬蟬,沈美明.IBM PC匯編語言程序設計.第2版.北京:清華大學出版社,2002.3</p><p>  [3]齊志儒,高福祥主編.匯編語言程序設計.第2版.東北大學出版社,2001.1</p><p>  [4

44、]張彌左,王兆月,邢立軍編著.微型計算機接口技術(shù). 機械工業(yè)出版社</p><p>  [5]吳秀清.微型計算機原理與接口技術(shù).合肥:中國科技大學出版社,2003</p><p>  [6]易先清.微型計算機原理與應用.北京:電子工業(yè)出版社,2001</p><p>  [7]李敬兆.8086/8088和基于ARM核匯編語言程序設計.第二版.合肥:中國科學技術(shù)大學出

45、版社,2008.9</p><p>  [8]王爽.匯編語言.北京:清華大學出版</p><p><b>  附 錄</b></p><p><b>  附錄1 源程序清單</b></p><p>  B_P EQU BYTE PTR</p><p>  W_P

46、 EQU WORD PTR</p><p>  D_P EQU DWORD PTR</p><p>  CODE SEGMENT</p><p>  ASSUME CS:CODE,DS:CODE</p><p><b>  ORG 100H</b></p><p>  ST

47、ART:;主程序開始</p><p><b>  JMP STAR</b></p><p><b>  EVEN</b></p><p>  NUM1 DW 0,0</p><p>  NUM2 DW 0,0</p><p>  NUM3 DW

48、 0,0</p><p>  JGV4 DW 0,0</p><p>  YSF LABEL WORD</p><p>  YSF1 DB 0</p><p>  YSF2 DB 0</p><p>  JUV DB 0</p><p>  UV DB

49、 0</p><p>  OVERS LABEL NEAR ;使DS:SI指向第一有效字符</p><p><b>  CLD</b></p><p><b>  PUSH AX</b></p><p><b>  OVERS1:</b></p><p

50、><b>  LODSB</b></p><p>  CMP AL,' ';判定是空格否</p><p><b>  JZ OVERS1</b></p><p>  CMP AL,9;判定是水平制表符否</p><p>  JZ OVERS1</p

51、><p><b>  DEC SI</b></p><p>  CMP AL,13;判定是垂直制表符否</p><p><b>  POP AX</b></p><p><b>  RET</b></p><p>  TABLABEL NEAR

52、 ;輸出一個制表符</p><p><b>  MOV AL,9</b></p><p>  JMP SHORT DISP</p><p>  CRLF LABEL NEAR ;輸出一個回車換行符</p><p><b>  MOV AL,13</b></p><p&g

53、t;<b>  CALL DISP</b></p><p><b>  MOV AL,10</b></p><p>  DISP LABEL NEAR ;顯示一個字符</p><p><b>  PUSH AX</b></p><p><b>  PUSH D

54、X</b></p><p><b>  MOV AH,2</b></p><p><b>  MOV DL,AL</b></p><p><b>  INT 21H</b></p><p><b>  POP DX</b></p>

55、<p><b>  POP AX</b></p><p><b>  RET</b></p><p>  ISYSF LABEL NEAR ;檢查是否為運算符</p><p><b>  CLD</b></p><p><b>  LODSB<

56、/b></p><p>  CALL ISJJ;調(diào)用+/-運算符判定</p><p>  JZ ISYSF1 ;-判定,若為-則轉(zhuǎn)至+/-運算</p><p>  CALL ISII ;調(diào)用*/\運算符判定</p><p>  JZ ISYSF1 ;/判定,若為/則轉(zhuǎn)制*/\運算</p>

57、<p><b>  DEC SI</b></p><p><b>  ISYSF1:</b></p><p><b>  RET</b></p><p>  ISJJ LABEL NEAR ;檢查是否是加減運算</p><p>  CMP AL,'

58、+'</p><p>  JZ ISYSF1 ;+判定,若為+則轉(zhuǎn)至+/-運算</p><p>  CMP AL,'-'</p><p><b>  RET</b></p><p>  ISII LABEL NEAR ;檢查是否為乘除運算</p><p>

59、;  CMP AL,'*'</p><p>  JZ ISYSF1 ;*判定,若為/則轉(zhuǎn)制*/\運算</p><p>  CMP AL,'/'</p><p>  JZ ISYSF1 ;/判定,若為/則轉(zhuǎn)制*/\運算</p><p>  CMP AL,'\'</p>

60、<p><b>  RET</b></p><p>  DOUT LABEL NEAR;數(shù)據(jù)輸出CX=10十進制,CX=16十六進制</p><p><b>  PUSH AX</b></p><p><b>  PUSH BX</b></p><p>

61、<b>  PUSH DX</b></p><p><b>  PUSH BP</b></p><p><b>  XOR BP,BP</b></p><p><b>  DOUT1:</b></p><p><b>  INC BP</b

62、></p><p><b>  PUSH AX</b></p><p><b>  MOV AX,DX</b></p><p><b>  XOR DX,DX</b></p><p><b>  DIV CX</b></p><p

63、><b>  MOV BX,AX</b></p><p><b>  POP AX</b></p><p><b>  DIV CX</b></p><p><b>  PUSH DX</b></p><p><b>  MOV DX,BX

64、</b></p><p><b>  OR BX,AX</b></p><p><b>  JNZ DOUT1</b></p><p><b>  DOUT2:</b></p><p><b>  POP AX</b></p>&

65、lt;p>  ADD AL,'0'</p><p>  CMP AL,'9'</p><p><b>  JBE DOUT3</b></p><p>  ADD AL,'A'-'9'-1</p><p><b>  DOUT3:</b&

66、gt;</p><p><b>  CALL DISP</b></p><p><b>  DEC BP</b></p><p><b>  JNZ DOUT2</b></p><p><b>  POP BP</b></p><p&g

67、t;<b>  POP DX</b></p><p><b>  POP BX</b></p><p><b>  POP AX</b></p><p><b>  RET</b></p><p>  ;輸入數(shù)據(jù)在DX:AX中返回</p>&

68、lt;p>  ;CX=0 數(shù)據(jù)為10進制</p><p>  ;CX#0 數(shù)據(jù)為16進制</p><p>  DATE LABEL NEAR</p><p><b>  PUSH BX</b></p><p><b>  PUSH BP</b></p><p>&

69、lt;b>  PUSH DI</b></p><p><b>  XOR AX,AX</b></p><p><b>  XOR DX,DX</b></p><p><b>  DATE1:</b></p><p><b>  MOV DI,AX&l

70、t;/b></p><p><b>  LODSB</b></p><p>  CMP AL,'0'</p><p><b>  JB DATE7</b></p><p>  CMP AL,'9'</p><p><b>  J

71、A DATE6</b></p><p><b>  DATE2:</b></p><p>  AND AX,0FH</p><p><b>  SHL DI,1</b></p><p><b>  RCL DX,1</b></p><p>&

72、lt;b>  MOV BX,DI</b></p><p><b>  MOV BP,DX</b></p><p><b>  SHL DI,1</b></p><p><b>  RCL DX,1</b></p><p><b>  SHL DI,1

73、</b></p><p><b>  RCL DX,1</b></p><p>  JCXZ DATE3</p><p><b>  SHL DI,1</b></p><p><b>  RCL DX,1</b></p><p>  Jmp

74、short DATE4</p><p><b>  DATE3:</b></p><p><b>  ADD DI,BX</b></p><p><b>  ADC DX,BP</b></p><p><b>  DATE4:</b></p>

75、<p><b>  ADD AX,DI</b></p><p><b>  ADC DX,0</b></p><p><b>  JMP DATE1</b></p><p><b>  DATE5:</b></p><p><b> 

76、 ADD AL,9</b></p><p><b>  JMP DATE2</b></p><p><b>  DATE6:</b></p><p>  JCXZ DATE7</p><p>  CMP AL,'A'</p><p><b&g

77、t;  JB DATE7</b></p><p>  CMP AL,'F'</p><p><b>  JBE DATE5</b></p><p>  CMP AL,'a'</p><p><b>  JB DATE7</b></p><

78、;p>  CMP AL,'f'</p><p><b>  JBE DATE5</b></p><p><b>  DATE7:</b></p><p><b>  MOV AX,DI</b></p><p><b>  DEC SI</b

79、></p><p><b>  OR DI,DX</b></p><p><b>  POP DI</b></p><p><b>  POP BP</b></p><p><b>  POP BX</b></p><p>&

80、lt;b>  RET</b></p><p>  ;數(shù)據(jù)1與數(shù)據(jù)2根據(jù)YSF1進行加減運算</p><p>  JSJJ LABEL NEAR</p><p>  MOV AX,NUM2</p><p>  MOV DX,NUM2+2</p><p>  CMP YSF1,'+'

81、</p><p><b>  JZ JSJJ1</b></p><p>  SUB NUM1,AX</p><p>  SBB NUM1+2,DX</p><p>  JMP SHORT JSJJ2</p><p><b>  JSJJ1:</b></p>&l

82、t;p>  ADD NUM1,AX</p><p>  ADC NUM1+2,DX</p><p><b>  JSJJ2:</b></p><p><b>  RET</b></p><p>  ;數(shù)據(jù)1與數(shù)據(jù)2根據(jù)YSF1進行乘除運算</p><p>  JSII1

83、 LABEL NEAR</p><p>  MOV BX,OFFSET NUM1</p><p>  JMP SHORT JSII2_1</p><p>  ;數(shù)據(jù)2與數(shù)據(jù)3根據(jù)YSF2進行乘除運算</p><p>  JSII2 LABEL NEAR</p><p>  MOV BX,OFFSET NUM2&

84、lt;/p><p><b>  JSII2_1:</b></p><p><b>  DB 66H</b></p><p>  MOV AX,[BX]</p><p><b>  DB 66H</b></p><p>  MOV CX,[BX+4]</

85、p><p>  CMP YSF2,'*'</p><p>  JNZ JSII2_2</p><p><b>  DB 66H</b></p><p><b>  IMUL CX</b></p><p>  JMP SHORT JSII2_3</p>

86、<p><b>  JSII2_2:</b></p><p><b>  DB 66H</b></p><p><b>  CWD</b></p><p><b>  DB 66H</b></p><p><b>  IDIV CX&

87、lt;/b></p><p>  CMP YSF2,'/'</p><p>  JZ JSII2_3</p><p><b>  DB 66H</b></p><p>  XCHG DX,AX</p><p><b>  JSII2_3:</b><

88、/p><p><b>  DB 66H</b></p><p>  MOV [BX],AX</p><p><b>  RET</b></p><p><b>  ;顯示結(jié)果</b></p><p>  XUJG LABEL NEAR</p>

89、;<p>  MOV AX,JGV4</p><p>  MOV DX,JGV4+2</p><p><b>  MOV CX,10</b></p><p><b>  CMP UV,10</b></p><p><b>  JZ XUJG0</b></p&

90、gt;<p><b>  MOV CX,16</b></p><p><b>  XUJG0:</b></p><p>  TEST DX,8000H</p><p><b>  JZ XUJG1</b></p><p><b>  CMP UV,10&

91、lt;/b></p><p><b>  JZ XUJG2</b></p><p><b>  CALL DOUT</b></p><p><b>  XUJG2:</b></p><p><b>  NOT AX</b></p>&l

92、t;p><b>  NOT DX</b></p><p><b>  ADD AX,1</b></p><p><b>  ADC DX,0</b></p><p><b>  PUSH AX</b></p><p><b>  CMP U

93、V,10</b></p><p><b>  JZ XUJG3</b></p><p>  MOV AL,' '</p><p><b>  CALL DISP</b></p><p>  MOV AL,'('</p><p>&l

94、t;b>  CALL DISP</b></p><p><b>  XUJG3:</b></p><p>  MOV AL,'-'</p><p><b>  CALL DISP</b></p><p><b>  POP AX</b><

95、/p><p><b>  CMP UV,10</b></p><p><b>  JZ XUJG1</b></p><p><b>  CALL DOUT</b></p><p>  MOV AL,')'</p><p><b> 

96、 CALL DISP</b></p><p><b>  RET</b></p><p><b>  XUJG1:</b></p><p><b>  CALL DOUT</b></p><p><b>  RET</b></p>

97、<p>  ;計算結(jié)果放入DX:AX中</p><p>  JSJG LABEL NEAR</p><p><b>  CALL JSJJ</b></p><p>  MOV AX,NUM1</p><p>  MOV DX,NUM1+2</p><p><b>  R

98、ET</b></p><p>  ;從DS:SI處取一個數(shù)據(jù)</p><p>  LOADATE LABEL NEAR</p><p><b>  LODSB</b></p><p>  CMP AL,'('</p><p>  JZ LOADATE1</p>

99、;<p><b>  DEC SI</b></p><p><b>  PUSH CX</b></p><p><b>  XOR CX,CX</b></p><p><b>  CMP UV,10</b></p><p>  JZ LOAD

100、ATE0</p><p>  INC CX ;取16進制數(shù)</p><p><b>  LOADATE0:</b></p><p>  CALL DATE ;取數(shù)據(jù)放入DX:AX中</p><p><b>  POP CX</b></p><p>

101、;<b>  RET</b></p><p><b>  LOADATE1:</b></p><p>  PUSH NUM1 ;保存數(shù)據(jù)1數(shù)據(jù)2及運算符</p><p>  PUSH NUM1+2</p><p><b>  PUSH NUM2</b></p&

102、gt;<p>  PUSH NUM2+2</p><p><b>  PUSH YSF</b></p><p><b>  INC JUV</b></p><p>  MOV JGV4,0 ;結(jié)果值清零</p><p>  MOV JGV4+2,0</p>&l

103、t;p><b>  ;進行四則運算</b></p><p>  SZYS LABEL NEAR</p><p>  CALL ISYSF ;首字符是運算符?</p><p><b>  JZ SZYS2</b></p><p>  CALL LOADATE ;不是,取數(shù)并

104、保存</p><p>  MOV NUM1,AX</p><p>  MOV NUM1+2,DX</p><p><b>  SZYS1:</b></p><p>  XOR AX,AX ;數(shù)據(jù)2清零</p><p>  MOV NUM2,AX</p><p>

105、  MOV NUM2+2,AX</p><p>  CALL ISYSF ;下個是運算符?</p><p><b>  JZ SZYS3</b></p><p><b>  JNZ SZYS6</b></p><p><b>  SZYS2:</b></p>

106、;<p><b>  PUSH AX</b></p><p>  MOV AX,JGV4 ;將結(jié)果作為數(shù)據(jù)1</p><p>  MOV NUM1,AX</p><p>  MOV AX,JGV4+2</p><p>  MOV NUM1+2,AX</p><p><b

107、>  POP AX</b></p><p><b>  SZYS3:</b></p><p>  MOV YSF1,AL</p><p>  MOV YSF2,AL</p><p>  CALL ISJJ ;是加減運算轉(zhuǎn)</p><p><b>  JZ S

108、ZYS4</b></p><p>  CALL LOADATE ;取數(shù)據(jù)2</p><p>  MOV NUM2,AX</p><p>  MOV NUM2+2,DX</p><p>  CALL JSII1 ;數(shù)據(jù)1與數(shù)據(jù)2根據(jù)YSF1進行乘除運算</p><p>  JMP SZYS1

109、 ; 結(jié)果保存在數(shù)據(jù)1中</p><p><b>  SZYS4:</b></p><p>  CALL LOADATE ;取數(shù)據(jù)2并保存</p><p>  MOV NUM2,AX</p><p>  MOV NUM2+2,DX</p><p><b>  SZY

110、S4_1:</b></p><p>  CALL ISYSF</p><p><b>  JNZ SZYS6</b></p><p>  CALL ISJJ ;運算符2是加減運算?</p><p>  JNZ SZYS5 ;不是轉(zhuǎn)</p><p><b&g

111、t;  PUSH AX</b></p><p>  CALL JSJJ ;數(shù)據(jù)1與數(shù)據(jù)2根據(jù)YSF1進行加減運算</p><p>  POP AX ; 結(jié)果保存在數(shù)據(jù)1中</p><p>  MOV YSF1,AL ;保存新的運算符</p><p><b>  JMP SZYS

112、4</b></p><p><b>  SZYS5:</b></p><p>  MOV YSF2,AL ;保存運算符2</p><p>  CALL LOADATE ;取數(shù)據(jù)3</p><p>  MOV NUM3,AX</p><p>  MOV NUM3+2,DX&

113、lt;/p><p>  CALL JSII2 ;數(shù)據(jù)2與數(shù)據(jù)3根據(jù)YSF2進行乘除運算</p><p>  JMP SZYS4_1 ; 結(jié)果保存在數(shù)據(jù)2中</p><p><b>  SZYS6:</b></p><p><b>  MOV CL,AL</b></p>

114、<p><b>  CMP AL,13</b></p><p><b>  JNZ SZYS9</b></p><p><b>  SZYS7:</b></p><p><b>  CALL JSJG</b></p><p><b>

115、;  CMP JUV,0</b></p><p><b>  JZ SZYS8</b></p><p><b>  DEC JUV</b></p><p><b>  POP YSF</b></p><p>  POP NUM2+2</p><p

116、><b>  POP NUM2</b></p><p>  POP NUM1+2</p><p><b>  POP NUM1</b></p><p><b>  RET</b></p><p><b>  SZYS8:</b></p>

117、<p>  CMP CL,')'</p><p><b>  JZ SZYS10</b></p><p>  MOV JGV4,AX</p><p>  MOV JGV4+2,DX</p><p>  JNZ SZYS12</p><p><b>  SZYS

118、9:</b></p><p>  CMP AL,')'</p><p>  JNZ SZYS11</p><p><b>  INC SI</b></p><p><b>  JMP SZYS7</b></p><p><b>  SZY

119、S10:</b></p><p>  MOV NUM1,AX</p><p>  MOV NUM1+2,DX</p><p><b>  JMP SZYS1</b></p><p><b>  SZYS11:</b></p><p><b>  STC&

120、lt;/b></p><p><b>  RET</b></p><p><b>  SZYS12:</b></p><p><b>  CLC</b></p><p><b>  RET</b></p><p><b&

121、gt;  ;數(shù)制處理</b></p><p>  UVIL LABEL NEAR</p><p><b>  PUSH SI</b></p><p><b>  UVIL1:</b></p><p><b>  LODSB</b></p><

122、;p>  CMP AL,' '</p><p><b>  JZ UVIL2</b></p><p><b>  CMP AL,9</b></p><p><b>  JZ UVIL2</b></p><p><b>  CMP AL,13<

123、;/b></p><p><b>  JZ UVIL4</b></p><p><b>  JNZ UVIL1</b></p><p><b>  UVIL2:</b></p><p><b>  MOV BX,SI</b></p>&

124、lt;p>  CALL OVERS</p><p><b>  JZ UVIL3</b></p><p><b>  LODSW</b></p><p>  CALL OVERS</p><p><b>  POP SI</b></p><p> 

125、 JNZ SZYS11</p><p>  CMP AX,'01'</p><p>  JNZ SZYS11</p><p><b>  PUSH SI</b></p><p><b>  MOV UV,10</b></p><p><b>  UV

126、IL3:</b></p><p><b>  MOV AL,13</b></p><p>  MOV [BX-1],AL</p><p><b>  UVIL4:</b></p><p><b>  POP SI</b></p><p>&l

127、t;b>  CLC</b></p><p><b>  RET</b></p><p><b>  ;預置結(jié)果</b></p><p>  YVJG LABEL NEAR</p><p>  MOV AH,52H</p><p><b>  

128、INT 21H</b></p><p>  MOV AX,ES:[BX-2]</p><p><b>  MOV DS,AX</b></p><p>  MOV AX,DS:[0CH]</p><p>  MOV CS:JGV4,AX</p><p>  MOV AX,DS:[0EH]

129、</p><p>  MOV CS:JGV4+2,AX</p><p><b>  PUSH CS</b></p><p><b>  POP DS</b></p><p><b>  PUSH CS</b></p><p><b>  POP

130、 ES</b></p><p><b>  RET</b></p><p><b>  ;保存結(jié)果</b></p><p>  BCJG LABEL NEAR</p><p>  MOV AH,52H</p><p><b>  INT 21H&l

131、t;/b></p><p>  MOV AX,ES:[BX-2]</p><p><b>  MOV DS,AX</b></p><p>  MOV AX,CS:JGV4</p><p>  MOV DS:[0CH],AX</p><p>  MOV AX,CS:JGV4+2</p&g

132、t;<p>  MOV DS:[0EH],AX</p><p><b>  PUSH CS</b></p><p><b>  POP DS</b></p><p><b>  PUSH CS</b></p><p><b>  POP ES</b

133、></p><p><b>  RET</b></p><p><b>  STAR:</b></p><p>  MOV SI,81H</p><p><b>  CLD</b></p><p>  CALL OVERS</p>&

134、lt;p><b>  JNZ STAR1</b></p><p><b>  STAR0:</b></p><p>  MOV DX,OFFSET MESS1</p><p><b>  JMP STAR4</b></p><p><b>  STAR1:<

135、;/b></p><p><b>  CALL YVJG</b></p><p><b>  CALL UVIL</b></p><p><b>  JB STAR0</b></p><p>  MOV SAVESP,SP</p><p><

136、b>  CALL SZYS</b></p><p>  MOV SP,SAVESP</p><p>  MOV DX,OFFSET MESS2</p><p><b>  JB STAR4</b></p><p><b>  CALL CRLF</b></p><

137、;p><b>  CALL XUJG</b></p><p><b>  CALL BCJG</b></p><p>  MOV DX,OFFSET MESS3</p><p><b>  STAR4:</b></p><p><b>  MOV AH,9<

138、;/b></p><p><b>  INT 21H</b></p><p><b>  INT 20H</b></p><p>  SAVESP DW 0</p><p>  MESS1 DB 13,10,' Syntax:',13,10</p><

139、;p>  DB ' JS <Expression> [10]',13,10,'$'</p><p>  MESS2 DB 'Error in expression !$'</p><p>  MESS3 DB 13,10,'$'</p><p>  CODE

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論