![硬件學(xué)習(xí)文檔_第1頁](http://file4.renrendoc.com/view/50f032e33898d1bbce3c592014b5f702/50f032e33898d1bbce3c592014b5f7021.gif)
![硬件學(xué)習(xí)文檔_第2頁](http://file4.renrendoc.com/view/50f032e33898d1bbce3c592014b5f702/50f032e33898d1bbce3c592014b5f7022.gif)
![硬件學(xué)習(xí)文檔_第3頁](http://file4.renrendoc.com/view/50f032e33898d1bbce3c592014b5f702/50f032e33898d1bbce3c592014b5f7023.gif)
![硬件學(xué)習(xí)文檔_第4頁](http://file4.renrendoc.com/view/50f032e33898d1bbce3c592014b5f702/50f032e33898d1bbce3c592014b5f7024.gif)
![硬件學(xué)習(xí)文檔_第5頁](http://file4.renrendoc.com/view/50f032e33898d1bbce3c592014b5f702/50f032e33898d1bbce3c592014b5f7025.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
第1章匯編語言程序設(shè)計基礎(chǔ)PAGE17第1章匯編語言程序設(shè)計基礎(chǔ)1.1.2數(shù)據(jù)定義通過數(shù)據(jù)定義語句可為數(shù)據(jù)項分配存儲單元,并根據(jù)需要設(shè)置其初值。還可用符號代表數(shù)據(jù)項,此時符號就與分配的存儲單元相聯(lián)系。代表數(shù)據(jù)項的符號本身稱為變量名,與之相對應(yīng)的存儲單元用于存放變量,所以常常就把這樣的存儲單元稱為變量。[例1.1]定義字節(jié)數(shù)據(jù)COUNT DB 100 ;定義一個字節(jié)的存儲空間,存放100BUFF DB 3+4,5*6 ;定義兩個字節(jié)的存儲空間,存放7,30[例1.2]定義字數(shù)據(jù)FLAG1 DW 65530 ;定義一個字存儲空間,存放65530FLAG2 DW 0F020H ;定義一個字存儲空間,存放0F020H[例1.3]定義沒有初值的數(shù)據(jù)項BUF 1 DW ?,? ;定義兩個字存儲空間,沒有定義初值[例1.4]定義字符串MESS1 DB “HELLO!” ;定義一個字符串,內(nèi)容是HELLO!MESS2 DB ‘H’,’E’,’L’,’L’,’O’,’!’ ;定義一個字符串,內(nèi)容是HELLO![例1.5]重復(fù)操作符DUPBUF2 DB 5DUP(0) ;定義5個字節(jié)的存儲空間,初值均為0[例1.6]使用EQU定義等值表達式COUNT EQU 234 ;[例1.7]使用等號定義COUNT=234 ;[例1.8]使用$定義$是一個特殊的地址表達式,表示當(dāng)前地址。X DW 0,1,2,4,8,4,2,1,0 ;LEN DB $-X ;變量LEN的值等于181.2匯編語言程序的結(jié)構(gòu)匯編語言源程序建立在段結(jié)構(gòu)的基礎(chǔ)上,一個段就是一些指令和數(shù)據(jù)的集合。所以一個匯編語言源程序,根據(jù)程序用途被劃分成幾段,如數(shù)據(jù)段、堆棧段、附加段和程序段(代碼段),用CS、DS、SS、ES段寄存器存放段值。這樣就構(gòu)造了源程序的基本格式:DATA SEGMENT┊DATA ENDSEXTRA SEGMENT┊EXTRA ENDSSTACK1 SEGMENT┊STACK1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA ASSUME SS:STACK1,ES:EXTRASTART: MOV AX,DATA MOV DS,AX┊CODE ENDS END START結(jié)合上面的源程序結(jié)構(gòu)格式,需要說明如下:互相配對的SEGMENT和ENDS前的標(biāo)號必須一樣;ASSUME語言使匯編程序得知哪一段是數(shù)據(jù)段(DS),哪一段是堆棧段(SS),哪一段是附加段(ES),哪一段是代碼段(CS)。除CS段以外,各個段寄存器的實際值還要用MOV指令來賦予;ENDSTART表示源程序結(jié)束。下面,我們通過一個簡單的匯編語言程序來說明匯編語言的結(jié)構(gòu)DSEG SEGMENT ;數(shù)據(jù)段開始DATA1 DB 13H,26HDATA2 DW 0DSEG ENDS ;數(shù)據(jù)段結(jié)束SSEG SEGMENT STACK ;堆棧段開始SKTOP DB 20DUP(0)SSEG ENDS ;堆棧段結(jié)束CSEG SEGMENT ;代碼段開始 ASSUME CS:CSEG,DS:DSEG ASSUME SS:SSEGSTART: MOV AX,DSEG ;初始化數(shù)據(jù)段基址 MOV DS,AX MOV AX,SSEG ;初始化代碼段基址 MOV SS,AX MOV SP,LENGTHSKTOP ;設(shè)置堆棧指針 MOV AL,DATA1 ADD AL,DATA1+1 MOV BYTEPTRDATA2,AL MOV AH,4CH INT 21H ;返回DOSCSEG ENDS ;代碼段結(jié)束 END START ;源程序結(jié)束說明如下:(1)DSEG是用戶自定義的數(shù)據(jù)段的段名,SEGMENT和ENDS分別為表示段開始和結(jié)束的偽指令。(2)SSEG是堆棧段的段名,STACK表示此段是程序運行時使用的堆棧段,連接程序要求定義一個堆棧段,若無此段,連接程序指出“無堆棧段”錯誤。(3)CSEG是代碼段的段名,一般要先用ASSUME語句指定哪一段是數(shù)據(jù)段,哪一段是堆棧段和代碼段,但是段寄存器的實際地址仍需MOV指令賦予。(4)ENDSTART說明,START為程序的啟動地址,即程序從這里開始執(zhí)行,而END告訴匯編程序源程序到此結(jié)束,對END后面的任何語句都不再進行匯編。 第3章匯編語言程序設(shè)計實驗命令格式功能說明A[地址]輸入?yún)R編指令C[范圍]起始地址對由“范圍”指定的區(qū)域與“起始地址”指定的同大小區(qū)域進行比較,顯示不相同的單元D[范圍]顯示指定范圍內(nèi)的內(nèi)存單元內(nèi)容E地址字節(jié)值表用值表中的值替換從“地址”開始的內(nèi)存單元內(nèi)容F范圍字節(jié)值表用指定的字節(jié)值表來填充內(nèi)存區(qū)域G[=起始地址][斷點地址]從起點(或當(dāng)前地點)開始執(zhí)行,到終點結(jié)束H數(shù)值1數(shù)值2顯示二個十六進制數(shù)值之和、差I(lǐng)端口地址從端口輸入L[地址[驅(qū)動器號扇區(qū)扇區(qū)數(shù)]]從磁盤讀M范圍地址把“范圍”內(nèi)的字節(jié)值傳送到從“地址”開始的單元N文件標(biāo)識符[文件標(biāo)識符…]指定文件名,為讀/寫文件做準(zhǔn)備O端口地址字節(jié)值向端口輸出P[=地址][指令數(shù)]按執(zhí)行過程,但不進入子程序調(diào)用或軟中斷Q退出DEBUG,不保存正在調(diào)試的文件R[寄存器名]顯示和修改寄存器內(nèi)容S范圍字節(jié)值表在內(nèi)存區(qū)域內(nèi)搜索指定的字節(jié)值表。如果找到,顯示起始地址,否則,什么也不顯示T[=地址][指令數(shù)]跟蹤執(zhí)行,從起點(或當(dāng)前地點)執(zhí)行若干條指令U[范圍]反匯編,顯示機器碼所對應(yīng)的匯編指令W[地址[驅(qū)動器號扇區(qū)扇區(qū)數(shù)]]向磁盤寫內(nèi)容,(BX、CX)為寫入字節(jié)數(shù)下面對DEBUG命令作具體介紹:內(nèi)存顯示命令D(DumpCommand)D命令用來顯示內(nèi)存單元的值,包括下列兩種格式:D[<地址>]顯示由指定地址開始的若干內(nèi)存單元的值。對于80列顯示模式,顯示128個字節(jié)。如果未指定參數(shù),則一個D命令的結(jié)束地址開始顯示。若前面未用過D命令,則缺省從CS:IP開始顯示。D<地址范圍>該命令顯示由<地址范圍>指定的所有內(nèi)存單元的值。執(zhí)行D命令后,屏幕左邊顯示的是內(nèi)存地址,中間是從該地址開始的若干字節(jié)值(十六進制),右邊是每個字節(jié)對應(yīng)得ASCII字符,其中,“.”表示不可打印字符。若只給出偏移地址,則使用DS當(dāng)前值作為段地址。例如:D2000:100 ;顯示從2000:0100H開始的內(nèi)存單元的值D100 ;顯示從DS:100H開始的內(nèi)存單元的值DCS:100 ;顯示從CS:100H開始的內(nèi)存單元的值D ;顯示從CS:IP開始的內(nèi)存單元的值寄存器命令R(RegisterCommand)R命令用來顯示和修改寄存器的值,包括下列兩種格式。R顯示所有寄存器和8個標(biāo)志位的值,并反匯編CS:IP所指的命令。R<寄存器名>顯示指定寄存器的值,并等待用戶鍵入新的值,按回車鍵結(jié)束R的命令。其中,<寄存器名>只能是8086的16位寄存器AX、BX、CX、DX、SP、BP、SI、DI、DS、ES、SS、CS、IP、與F(標(biāo)志寄存器)。其中,顯示的8個標(biāo)志位的符號對應(yīng)符號如下表所示。標(biāo)志名稱溢出OF方向DF中斷IF負號SF零ZF輔助進位AF奇偶PF進位CF置位狀態(tài)OVDNEINGZRACPECY復(fù)位狀態(tài)NVUPDIPLNZNAPONC如果想修改標(biāo)志寄存器的內(nèi)容,可以輸入如下命令。-RF屏幕將顯示8個標(biāo)志位的值,然后等待用戶修改。只要輸入這些符號就可以設(shè)置對應(yīng)標(biāo)志位的值,鍵入符號的個數(shù)與順序可以任意。反匯編命令U(UnassembleCommand)U命令用來將二進制代碼反匯編為匯編語言的符號指令,包括下列兩種格式。U[<地址>]從指令地址開始,反匯編若干字節(jié)。對于80列顯示模式,反匯編32個字節(jié)(為了保證最后一條指令的完整性,可能會多于32個字節(jié))。若未指定地址,則從上一個U命令的最后一個單元開始;若前面未用過U命令,則缺省為CS:IP。(2)U<地址范圍>對指定范圍的內(nèi)存區(qū)進行反匯編。若只給出偏移地址,則使用CS當(dāng)前值作為段地址。執(zhí)行U命令后,屏幕左邊顯示的內(nèi)存地址,中間是機器代碼,右邊是對應(yīng)的匯編語言指令。運行命令G(GOCommand)G命令的格式為:G[=<地址>][<段點地址1><段點地址2>…<段點地址10>]其中,等號“=”后的<地址>指出程序執(zhí)行的起始地址,如未指定,則缺省為CS:IP。指定的段點最多為10個,也可以沒有。若只給出偏移地址,則使用CS當(dāng)前值作為段地址。G命令從指定地址開始執(zhí)行內(nèi)存中的程序,直到內(nèi)存結(jié)束或遇到指定的任意斷點時停止執(zhí)行。若遇到斷點,則顯示所有內(nèi)存器和標(biāo)志位的當(dāng)前值以及要執(zhí)行的下一條命令;若程序正常結(jié)束,則顯示“Programterminatednormally”。說明:斷點地址的次序是任意的。設(shè)置多個斷點的好處在于當(dāng)被調(diào)試程序有多條可能的執(zhí)行路徑時,使其不管沿哪個路徑執(zhí)行,都有可能在斷點處停下來,以便檢查程序的執(zhí)行情況。斷點一經(jīng)設(shè)定,DEBUG用一條INT3指令取代斷點處指令的操作碼。當(dāng)程序執(zhí)行到一個斷點地址時,立即停止,然后恢復(fù)所有斷點處的指令,并取消全部斷點,返回DEBUG。如果設(shè)置的斷點在G命令的執(zhí)行過程中均未遇到,則程序執(zhí)行完畢,不會恢復(fù)斷點處的指令。一旦程序執(zhí)行完畢,若想再次執(zhí)行,必須重新裝入。對于G以及下面要介紹的T與P命令,等號“=”后的<地址>所有單元,必須是有效的8086指令代碼,否則,會產(chǎn)生預(yù)想不到的結(jié)果。跟蹤命令T(TraceCommand)T命令的格式為:T[=<地址>][<指令條數(shù)>]其中,等號“=”后的<地址>指出程序執(zhí)行的開始地址,如未指定,則缺省為CS:IP。若只給出偏移地址,則使用CS當(dāng)前值作為段地址。T命令從指定地址開始單步執(zhí)行,執(zhí)行的指令數(shù)由<指令條數(shù)>決定。每條指令執(zhí)行后,都要顯示所有寄存器和標(biāo)志位的值以及下一條指令。若未給出<指令條數(shù)>,則缺省為1。T命令執(zhí)行時,若遇到CALL或INT指令,會跟蹤進入相應(yīng)過程或中斷服務(wù)程序內(nèi)部。對于帶重復(fù)前綴(如REP)的指令,每次重復(fù)執(zhí)行算一步。退出命令Q(QuitCommand)Q命令的格式為:Q使用此命令可退出DEBUG。第3章匯編語言程序設(shè)計實驗3.1順序程序設(shè)計[程序1]設(shè)X和Y均為16位無符號數(shù),寫一個求表達式X+Y值的程序。程序清單如下:DSEGSEGMENT ;數(shù)據(jù)段XDW1234HYDW5678HZDW?DSEGENDSCSEGSEGMENT ;代碼段ASSUMECS:CSEG,DS:DSEGSTART:MOVAX,DSEG ;段寄存器初值MOVDS,AXMOVAX,XADDAX,Y ;求x+y和MOVZ,AX ;保存MOVAH,4CHINT21H ;程序結(jié)束退出CSEGENDSENDSTART思考題:本程序沒有考慮進位的情況。如果考慮可能產(chǎn)生的進位,應(yīng)如何修改程序?擴展題:設(shè)X和Y均為三字節(jié)無符號數(shù),編制程序求其和,并將結(jié)果放置在Z開始的存儲單元。[程序2]設(shè)X、Y、Z為無符號字變量,編寫程序計算表達式R=((X*Y+5)+4*X)/Z。在編寫程序前,首先要確定該表達式的算法。第一步,計算X*Y;第二步,計算X*Y+5;第三步,計算4*X;第四步,計算(X*Y+5)+4*X;第五步,計算((X*Y+5)+4*X)/Z。程序清單如下所示。DATA SEGMENTX DW ?Y DW ?Z DW ?R DW 2DUP(0)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,X MUL Y ;計算X*Y ADD AX,5 ;計算X*Y+5 ADC DX,0 MOV CX,DX MOV BX,AX MOV AX,X ;計算4*XMOV SI,4MUL SIADD AX,BX ;計算(X*Y+5)+4*XADC DX,CXDIV Z ;計算((X*Y+5)+4*X)/ZMOV R,AXMOV R+2,DXMOV AH,4CHINT 21HCODE ENDS END START思考題:程序中求4*X用乘法指令MUL實現(xiàn),而用移位指令也可以實現(xiàn),請問該如何修改程序?擴展題:編制程序計算Y=5X+7,設(shè)X值在DAX單元,結(jié)果存入RLT單元。X為無符號字節(jié)數(shù)據(jù)。[程序3]首先將FIRST字變量與SECOND字變量相加,結(jié)果存至THIRD1存儲字中,然后將FIRST與SECOND兩個字變量相乘,結(jié)果存至THIRD2開始的兩個字中。FIRST和SECOND都是字變量,因此存放“和”的THIRD1單元也必須是字變量。而存放“積”的單元THIRD2必須是雙字。程序清單如下:DATA SEGMENTFIRST DW 0D56CHSECOND DW 1F08HTHIRD1 DW ?THIRD2 DW 2DUP(?)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV AX,FIRST ADD AX,SECOND ;求和 MOV THIRD1,AX ;保存 MOV AX,FIRST MUL SECOND ;求積 MOV THIRD2,AX ;保存 MOV THIRD2+2,DX MOV AH,4CH INT 21HCODE ENDS END START思考題:假如FIRST的偏移地址是0000,那么THIRD2的偏移地址是多少?擴展題:設(shè)HEX,HEX+1單元的低4位分別存放一位十六進制數(shù),編制程序?qū)⑵溲b配在一個字節(jié)中并存入DATA單元,其中,HEX單元的數(shù)作為高位部分。附錄3.2分支程序設(shè)計[程序1]設(shè)有3個單字節(jié)無符號數(shù)存放在BUF開始的緩沖區(qū)中,編寫一個能將它們從大到小重新排序的程序。由于BUF緩沖區(qū)中只有3個數(shù)據(jù),有多種方法可實現(xiàn)3個數(shù)據(jù)的排序。在此采用交換法,先找到3個數(shù)中的最大數(shù),然后再找到剩下兩個數(shù)的大數(shù),最后將3個數(shù)據(jù)按大小依次存放。為了方便,先把要排序的3個數(shù)取到3個寄存器中,然后再對3個數(shù)進行比較排序。編寫的源程序如下所示:DATA SEGMENTBUF DB 87,234,123DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXMOV SI,OFFSETBUFMOV AL,[SI] ;把3個數(shù)取到寄存器中MOV BL,[SI+1]MOV CL,[SI+2]CMP AL,BL ;排序,將最大數(shù)送AL寄存器JAE NEXT1XCHG AL,BLNEXT1: CMP AL,CLJAE NEXT2XCHG AL,CLNEXT2: CMP BL,CL ;將最小數(shù)送CL寄存器JAE NEXT3XCHG BL,CLNEXT3: MOV [SI],AL ;從大到小依次存回緩沖區(qū)MOV [SI+1],BLMOV [SI+2],CLMOV AH,4CHINT 21HCODE ENDS END START思考題:分支結(jié)構(gòu)程序設(shè)計的關(guān)鍵在于準(zhǔn)確地知道操作結(jié)果影響的標(biāo)志位狀態(tài)和正確地使用條件轉(zhuǎn)移指令。本程序中,由于是無符號數(shù)的比較,所以也可以根據(jù)一個標(biāo)志位來判定數(shù)的大小,你能說出是哪個標(biāo)志位嗎,且程序中的JAE指令該用什么指令替換呢?擴展題:在BUF開始的單元里有3個單字節(jié)無符號數(shù),編寫程序找出它們中的最小值并存入MIN單元。[程序2]編寫計算下面函數(shù)值的程序(x、y的值均在-128~+127之間)。輸入數(shù)據(jù)為x、y,結(jié)果數(shù)據(jù)為Z。若x、y都大于0,z賦值1;若x、y都小于0,z賦值-1;若x、y異號,z賦值0。程序清單如下:DATA SEGMENTX DB 23Y DB -10Z DB 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXCMP X,0 ;x與0進行比較JS L1 ;x〈0轉(zhuǎn)L1CMP Y,0JL L2 ;y〈0轉(zhuǎn)L2MOV Z,1 ;x〉=0,y〉=0則1—〉Z,無條件轉(zhuǎn)EXITJMP EXITL1: CMP Y,0 ;y〉=0轉(zhuǎn)L2JGE L2MOV Z,-1 ;x〈0,y〈0則-1—〉Z,無條件轉(zhuǎn)EXITJMP EXITL2: MOV Z,0 ;x、y異號時則0—〉ZEXIT: MOV AH,4CHINT 21HCODE ENDS END START思考題:本程序中判定符號用的是CMP指令,而用邏輯操作指令也可以。比如,可以用AND指令,使其進行自身與操作,反應(yīng)到SF標(biāo)志位。還可以用TEST指令直接測試最高位,并將結(jié)果反應(yīng)到ZF標(biāo)志位,然后根據(jù)ZF標(biāo)志判斷。試用TEST指令編之。擴展題:如果不采用上述方法判斷兩數(shù)的符號,而采用兩數(shù)異或的方法判斷兩數(shù)的符號,當(dāng)兩數(shù)的符號不相同時,其結(jié)果的最高位必定為1;當(dāng)兩數(shù)的符號相同時,其結(jié)果的最高位必定為0;在根據(jù)其中一數(shù)的符號是正還是負決定兩數(shù)是正數(shù)還是負數(shù)。請作程序完成。3.3循環(huán)程序設(shè)計[程序1]已知以BUF為首地址的字存儲區(qū)中存放著8個有符號二進制數(shù),試編寫程序?qū)⑵渲写笥诘扔?的數(shù)依次送BUF1為首地址的字存儲區(qū)中,小于0的數(shù)依次送以BUF2為首地址的字存儲區(qū)中。同時將大于等于0的數(shù)的個數(shù)送A字變量,將小于0數(shù)的個數(shù)送B字變量。編寫的程序清單如下:DATA SEGMENTBUF DW 23,123,-12,-210,45,0,90,-453BUF1 DW 8 DUP(0)BUF2 DW 8 DUP(0)A DW 0B DW 0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AXLEA BX,BUF LEA SI,BUF1LEA DI,BUF2MOV A,0MOV B,0MOV CX,8 ;置循環(huán)初值L0: MOV AX,[BX] ;判斷元素是否非負,非負則轉(zhuǎn)L1CMP AX,0JGE L1MOV [DI],AX ;為負則將元素送BUF2,執(zhí)行B+1ADD DI,2INC BJMP NEXTL1: MOV [SI],AX ;非負則將元素送BUF1,執(zhí)行A+1ADD SI,2INC ANEXT: ADD BX,2 ;修改BUF的地址LOOP L0 ;修改循環(huán)次數(shù),未完則轉(zhuǎn)L0MOV AH,4CHINT 21HCODE ENDS END START思考題:本程序?qū)儆谘h(huán)次數(shù)已知的程序,使用CX寄存器存放計數(shù)值,使用LOOP指令完成循環(huán)。但是在有些情況下,是不可以用LOOP指令的,比如循環(huán)中要用到移位指令時需要占用CL寄存器。我們?nèi)钥梢詢蓷l指令完成完全相同的功能,請問是哪兩條指令?擴展題:統(tǒng)計以BUF為首地址開始的字節(jié)數(shù)據(jù)塊中的正數(shù)的個數(shù),將統(tǒng)計結(jié)果放至RLT單元。[程序2]設(shè)STR字符串是以0結(jié)尾。試編寫一個把字符串中的所有大寫字母改為小寫字母的程序,并將轉(zhuǎn)換后的字符串顯示輸出。編寫的程序清單如下:DATA SEGMENTSTR DB ‘HOWarEYoU!’,0DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,OFFSETSTR ;取字符串開始地址AGAIN: MOV DL,[SI] ;取一字符OR DL,DL ;是否到字符串尾?JZ OK ;到字符串尾,轉(zhuǎn)OKCMP DL,’A’ ;否則,判斷是否為大寫字母JB NEXT ;否,轉(zhuǎn)NEXTCMP DL,’Z’JA NEXT ;否,轉(zhuǎn)NEXTADD DL,20H ;是大寫字母,改為小寫字母MOV [SI],DL ;送回到字符串中NEXT: MOV AH,2INT 21HINC SI ;調(diào)整指針JMP AGAIN ;繼續(xù)循環(huán)OK: MOV AH,4CHINT 21HCODE ENDS END START思考題:如果程序要求把小寫字母都改為大寫字母,程序段該如何修改?擴展題:有一系列以$為結(jié)束符的字符串,對其中的非數(shù)字字符計數(shù),保存計數(shù)結(jié)果。[程序3]試編程從自然數(shù)1開始累加,直到累加和大于5050為止,統(tǒng)計被累加的自然數(shù)的個數(shù),并把統(tǒng)計的個數(shù)送入COUNT單元,累加和送入TOTAL單元。顯然,被累加的個數(shù)事先不知道,所以不能用計數(shù)法控制循環(huán)。應(yīng)當(dāng)利用累加和大于5050就停止累加這個條件來控制循環(huán)。程序清單如下:DATA SEGMENTCOUNT DW ?TOTAL DW ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV CX,0 ;計數(shù)器清零 MOV AX,0 ;累加器清零 MOV BX,0LOOP1: INC BX ADD AX,BX ;累加 INC CX ;計數(shù)值加1 CMP AX,5050 ;比較 JLE LOOP1 ;小于等于則繼續(xù)循環(huán) MOV COUNT,CX ;保存結(jié)果 MOV TOTAL,AXCODE ENDS END START思考題:本程序的循環(huán)較為簡單,請畫出本程序的流程圖。擴展題:從STRN地址開始有一字符串,以‘$’作為結(jié)束標(biāo)志,要求統(tǒng)計該字符串長度并存于LENG單元。3.4綜合程序設(shè)計[程序1]自內(nèi)存DATA單元開始存放若干個無符號字節(jié)數(shù),數(shù)據(jù)個數(shù)在COUNT單元存放。編制程序分別計算其中奇數(shù)、偶數(shù)的和,并分別存入ODDSUM,EVENSM單元。設(shè)各類和不超過16位二進制數(shù),可用一個字表示或存放。本例對每一個數(shù)據(jù)進行判斷、累加都是進行重復(fù)的操作,因此可編制循環(huán)結(jié)構(gòu)程序,以COUNT控制循環(huán)的次數(shù)。主程序清單如下:DSEG SEGMENTDATA DB 15H,26H,03H,64H,8AH,0AAH,24H,48HCOUNT DW 08ODDSUM DW 0EVENSUM DW 0DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGMAIN: MOV AX,DSEG MOV DS,AX LEA SI,DATA ;設(shè)置地址指針 MOV CX,COUNT ;計數(shù)值送CX XOR AX,AX ;AX清零 XOR BX,BX ;清存和寄存器 XOR DX,DXAGAIN: MOV AL,[SI] ;取數(shù)據(jù) TEST AL,01 ;測試最低位 JZ EVENS ;偶數(shù),轉(zhuǎn) ADD BX,AX ;奇數(shù),累計和 JMP CHCNTEVENS: ADD DX,AX ;偶數(shù),累計和CHCNT: INC SI ;指向下個數(shù)據(jù) LOOP AGAIN ;計算完?未完繼續(xù) MOV ODDSUM,BX ;保存結(jié)果 MOV EVENSUM,DX MOV AH,4CH INT 21HCSEG ENDS END MAIN思考題:測試最低位狀態(tài)也可以用右移指令,然后判斷CF的狀態(tài)。請問如何修改程序語句?擴展題:有一個班級,學(xué)生人數(shù)存儲于內(nèi)存NUB單元,該班同學(xué)某門課程的成績存放于內(nèi)存S開始的單元,編制程序,統(tǒng)計該班該課程的平均成績,存放于E單元。[程序2]試編制一程序。從鍵盤輸入一個字符,若為“1”,則顯示“THEFIRSTSUBROUTINE!”;否則顯示“INPUTTHERIGHTCHARACTER”,返回DOS。本例用了三個非常常用的DOS系統(tǒng)功能調(diào)用。其中第一個調(diào)用實現(xiàn)一個字符串的輸出顯示,調(diào)用前,應(yīng)將DX指向存放要顯示字符串的緩沖區(qū)的首地址,被顯示的字符串應(yīng)以‘$’結(jié)尾。第二個調(diào)用,實現(xiàn)從鍵盤輸入一個字符,調(diào)用后,字符的ASCII碼在AL寄存器中。第三個調(diào)用為在屏幕上顯示一個字符,調(diào)用前,被顯示字符的ASCII碼應(yīng)送入DL寄存器中。有關(guān)DOS系統(tǒng)調(diào)用的詳細資料參見附錄。整個程序的清單如下:DATA SEGMENTSTR0 DB ‘INPUTTHERIGHTCHARACTER’,’$’STR1 DB ‘INPUTCHARACTER:$’STR2 DB ‘THEFIRSTSUBROUTINE!$’DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOV DS,AX MOV DX,OFFSETSTR1 ;提示輸入字符 MOV AH,09H INT 21H MOV AH,01H ;接收鍵入字符 INT 21H CMP AL,’1’ JZ SUBF ;是1,轉(zhuǎn)入SUBF MOV DL,0DH MOV AH,02H INT 21H MOV DL,0AH MOV AH,02H INT 21H LEA DX,STR0 ;非1,提示字符輸入形式 MOV AH,09H INT 21H JMP EXITSUBF: LEA DX,STR2 MOV AH,09H INT 21H JMP EXITEXIT: MOV AH,4CH ;程序結(jié)束退出 INT 21HCODE ENDS END START思考題:請仔細閱讀程序說明AH功能號分別為01H,02H,09H時所代表的功能。擴展題:編寫程序在屏幕上顯示A~Z26個大寫字母,要求用DOS系統(tǒng)功能調(diào)用INT21H的02H號功能實現(xiàn)。[程序3]計算一組字數(shù)據(jù)中正數(shù)、負數(shù)和零的個數(shù),并分別存放在PCOUNT,MCOUNT和ZCOUNT單元。設(shè)該組數(shù)據(jù)首地址為ARRY,數(shù)據(jù)個數(shù)在CNT單元存放。主程序清單如下:DSEG SEGMENTARRY DW 15,-5,1,5,0,123,964,-327,0CNT DW 9PCOUNT DW 0MCOUNT DW 0ZCOUNT DW 0DSEG ENDSCSEG SEGMENT ASSUME CS:CSEG,DS:DSEGSTART: MOV AX,DSEG MOV DS,AX LEA SI,ARRY ;取數(shù)據(jù)首址到SI MOV CX,CNT ;取數(shù)組數(shù)據(jù)個數(shù)到CX XOR AX,AX ;清計數(shù)器 XOR BX,BX XOR DX,DXPMZN0: TEST WORDPTR[SI],0FFFFH ;測試數(shù)據(jù) JS MINUS ;負轉(zhuǎn) JNZ PLUS ;非0轉(zhuǎn) INC DX ;為0,0計數(shù)器加1 JMP PMZN1PLUS: INC AX ;正數(shù)計數(shù)器加1 JMP PMZN1MINUS: INC BX ;負數(shù)計數(shù)器加1PMZN1: INC SI ;指向下一個數(shù)據(jù) LOOP PMZN0 MOV PCOUNT,AX ;保存結(jié)果 MOV MCOUNT,BX MOV ZCOUNT,DX MOV AH,4CH INT 21HCSEG ENDS END START思考題:本程序利用TEST指令影響標(biāo)志位來判別程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 五年級數(shù)學(xué)下冊蘇教版第一單元第10課《列方程解決實際問題練習(xí)(練習(xí)三)》聽評課記錄
- 中考道德與法治一輪復(fù)習(xí)八年級上第2單元遵守社會規(guī)則 聽課評課記錄 人教版
- 湘教版數(shù)學(xué)八年級上冊《小結(jié)練習(xí)》聽評課記錄6
- 公派出國留學(xué)協(xié)議書范本
- 電商平臺加盟合作協(xié)議書范本
- 軟件合作開發(fā)合同范本
- 二零二五年度資質(zhì)借用與金融服務(wù)合作協(xié)議:金融機構(gòu)資質(zhì)借用合同
- 天津市建設(shè)工程施工專業(yè)分包合同范本
- 2025年度餐廚廢棄物收購與冷鏈物流配送服務(wù)合同
- 洗車場場地租賃合同范本
- 污泥處置合作合同模板
- 腦梗死的護理查房
- 2025高考數(shù)學(xué)專項復(fù)習(xí):概率與統(tǒng)計的綜合應(yīng)用(十八大題型)含答案
- 2024-2030年中國紫蘇市場深度局勢分析及未來5發(fā)展趨勢報告
- 銷售人員課件教學(xué)課件
- LED大屏技術(shù)方案(適用于簡單的項目)
- Lesson 6 What colour is it(教學(xué)設(shè)計)-2023-2024學(xué)年接力版英語三年級下冊
- GB/T 4706.10-2024家用和類似用途電器的安全第10部分:按摩器具的特殊要求
- NB/T 11446-2023煤礦連采連充技術(shù)要求
- 2024年江蘇省蘇州市中考英語試題卷(含標(biāo)準(zhǔn)答案及解析)
- 第五單元任務(wù)二《準(zhǔn)備與排練》教學(xué)設(shè)計 統(tǒng)編版語文九年級下冊
評論
0/150
提交評論