![匯編語言程序匯總_第1頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/d18fa4c3-9a75-4f28-bb12-71035a0b20ce/d18fa4c3-9a75-4f28-bb12-71035a0b20ce1.gif)
![匯編語言程序匯總_第2頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/d18fa4c3-9a75-4f28-bb12-71035a0b20ce/d18fa4c3-9a75-4f28-bb12-71035a0b20ce2.gif)
![匯編語言程序匯總_第3頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/d18fa4c3-9a75-4f28-bb12-71035a0b20ce/d18fa4c3-9a75-4f28-bb12-71035a0b20ce3.gif)
![匯編語言程序匯總_第4頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/d18fa4c3-9a75-4f28-bb12-71035a0b20ce/d18fa4c3-9a75-4f28-bb12-71035a0b20ce4.gif)
![匯編語言程序匯總_第5頁](http://file2.renrendoc.com/fileroot_temp3/2021-11/11/d18fa4c3-9a75-4f28-bb12-71035a0b20ce/d18fa4c3-9a75-4f28-bb12-71035a0b20ce5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、第四節(jié) 匯編語言程序設計及舉例z 概述z 順序結構 z 分支程序z 循環(huán)程序z 字符串處理程序z 碼轉換程序z DOS系統(tǒng)功能調用z 宏匯編與條件匯編一、概述一、概述z1.編寫步驟編寫步驟z (1)分析問題,抽象出數(shù)學模型z (2)確定算法z (3)畫程序流程圖z (4)分配內存工作單元和寄存器。z (5)按程序流程圖編制程序。z (6)上機調試,排錯。起始框終止框工作框判斷調子程序z2.程序質量判斷程序質量判斷z (1)執(zhí)行時間z (2)占用內存空間z (3)語句行數(shù)z3.程序結構程序結構z 順序z 分支z 循環(huán)z 子程序二、二、 順序結構順序結構z例4-1: 8086沒有32位無符號數(shù)乘法
2、指令,需借助于16位無符號數(shù)乘法指令做4次乘法,然后把部分積相加, 。 z 16位z 16位z 部分積1z 部分積2z 部分積3z + 部分積4z 32位A BC DBDADBCAC設地址指針被乘數(shù)低16位BAX乘數(shù)低16位DSI存入緩沖區(qū)乘數(shù)高16位CDIB*D=部分積1被乘數(shù)高16位AAXA*D=部分積2部分積2低16位加部分積1高16位存入緩沖區(qū)B*C=部分積3進位加至部分積2高16位與前面對應16位相加保存進位部分積4與前面的和相加保存在緩沖區(qū)A*C=部分積4恢復進位返回說明:z(1)數(shù)據(jù)段:mulnum dw 0000,0ffffh,0000,0ffffh,4dup(?) 被乘數(shù) 乘
3、數(shù) 乘積z(2)堆棧段:z stack segment para stack stack db 100dup(?) stack ends NAME MULTIPLY_32BITDATA SEGMENTMULNUM DW 8000H,0001H,0FFFH,0001H ;定義被乘數(shù)B、A與乘數(shù)D、CPRODUCT DW 4 DUP(?) ;定義乘積,低字在前DATA ENDSSTACK SEGMENT PARA STACK STACKDB 100 DUP(?) ;初始化堆棧大小為100byteSTACK ENDS CODE SEGMENTASSUME CS: CODE,DS:DATA,SS:ST
4、ACKSTART PROC FARBEGIN: PUSH DS ; DS中包含的是程序段前綴的起始地址MOV AX,0PUSH AX ; 設置返回至DOS的段值和偏移量MOV AX, DATAMOV DS, AX ; 置段寄存器初值MOV BX, 0MULU32: MOV AX, MULNUMBX ; BAXMOV SI, MULNUMBX+4 ; DSIMOV DI, MULNUMBX+6 ; CDIMUL SI ; BDMOV PRODUCTBX, AX ; 保存部分積1MOV PRODUCTBX+2, DXMOV AX, MULNUMBX+2 ; AAXMUL SI ; ADADD AX
5、, PRODUCTBX+2ADC DX, 0 ; 部分積2的一部分與部分積1的相應部分相加MOV PRODUCTBX+2, AXMOV PRODUCTBX+4, DX ; 保存MOV AX, MULNUMBX ; BAXMUL DI ; BCADD AX, PRODUCTBX+2 ; 與部分積3的相應部分相加 ADC DX, PRODUCTBX+4MOV PRODUCTBX+2, AXMOV PRODUCTBX+4, DXPUSHF ; 保存后一次相加的進位標志MOV AX, MULNUMBX+2 ; AAXMUL DI ; ACPOPF;標志出棧ADC DX,0ADC AX, PRODUCT
6、BX+4 ; 與部分積4的相應部分相加ADC DX, 0MOV PRODUCTBX+4, AXMOV PRODUCTBX+6, DXRETSTART ENDPCODE ENDSEND BEGIN 分支程序的基本思想是根據(jù)邏輯判斷的結果來形成程序的分支。分支有兩分支和多分支。對于兩分支,若條件P成立則執(zhí)行A;否則執(zhí)行B,如圖4.2所示三、分支程序三、分支程序三、分支程序三、分支程序z z例: SIGEF:MOV AX,BUFFER OR AX, AX ;建立條件 JE ZERO ;為0轉ZERO JNS PLUS ;為正轉PLUS MOV BX,0FFH ;為負 JMP CONTI ZERO:M
7、OV BX,0 JMP CONTI PLUS:MOV BX,1 CONTI: y-1判斷y0y1X0X=0四、循環(huán)程序四、循環(huán)程序z結構形式:z z 先執(zhí)行,后判斷 先判斷,后執(zhí)行z組成: (1) 初始化z (2) 循環(huán)體z (3) 修改參數(shù)z (4) 循環(huán)控制初始化循環(huán)控制循環(huán)體修改參數(shù)入口出口初始化循環(huán)控制循環(huán)體修改參數(shù)入口出口z1.用計數(shù)器控制循環(huán)用計數(shù)器控制循環(huán)z (1)減1計數(shù)器z (2)加1計數(shù)器例4-2:P.141在一串給定個數(shù)的數(shù)中尋找最大值,放至指定的存儲單元,每個數(shù)為16位。 NAME SEARCH_MAX ;源程序名 DATA SEGMENT ;(1)數(shù)據(jù)段 BUFFER
8、 DW X1,X2,XN ;n個數(shù)據(jù)字 COUNT EQU $-BUFFER ;COUNT=2n MAX DW ? ;放結果(最大值) DATA ENDS STACK SEGMENT STACK STACK ;(2)堆棧段 DB 64 DUP(?) ;64個字節(jié) TOP EQU $-STACK ;TOP為棧頂偏移 STACK ENDS CODE SEGMENT ;(3) 代碼段 START PROC FAR ; 定義子程序 ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: PUSH DS ;(4)置子程序返回地址 MOV AX,0 PUSH AX MOV AX,DA
9、TA ;置DS MOV DS,AX MOV AX,STACK ;置SS MOV SS,AX MOV AX,TOP ;置SP MOV SP,AX MOV CX,COUNT ;(5) 循環(huán)初始化,CX=2n LEA BX,BUFFER ; BX為數(shù)據(jù)指針 MOV AX,BX ; 取第一個字 INC BX ; 指針指向下一個字 INC BX SHR CX ; CX=個數(shù) DEC CX ; 個數(shù)減1 AGAIN: CMP AX,BX ;(6) 循環(huán)體,比較 JGE NEXT ; AX大,轉NEXT MOV AX,BX ; 最大值AX NEXT: INC BX ;(7) 修改參數(shù),指針加1 INC BX
10、 LOOP AGAIN ;(8)循環(huán)控制,CX-1CX,為0結束 MOV BX,AX ;存最大值 RET START ENDP CODE ENDS END START 2.2.用開關變量控制循環(huán)用開關變量控制循環(huán)z 一個循環(huán)體中有兩個循環(huán)支路,設一個開關變量,控制進入哪個循環(huán)支路。z例:數(shù)據(jù)采集系統(tǒng)。z 采到的前5個數(shù)用一種函數(shù)(FUN1)處理,開關=0。z 采到的后7個數(shù)用另一種函數(shù)(FUN2)處理,開關=1。說明:z(1)數(shù)據(jù):buffer dw 05,05,. ;12個數(shù)據(jù) block dw 12 dup(?) ;存結果 count1 equ 5 ;個數(shù) count2 equ 7 ;個數(shù)
11、z(2)初始化:源數(shù)據(jù)指針 bufferbxz 處理后數(shù)據(jù)指針 blocksiz count1+1,count2+1cxz 開關0dxz(3)循環(huán)主體: 判開關量dx=0? dx=0 call fun1z 5個數(shù)據(jù)處理完后dx=1,cx=count2+1 dx=1 call fun2z 每處理完一個數(shù),修改指針bx,si mov dx,0 ;(1)循環(huán)初始化 開關dx=0mov cx,count1+1 ; cx為計數(shù)器 lea bx,buffer ; bx源指針leasi,block ; si目的指針again:mov ax,bx ;(2)循環(huán)主體 cmpdx,0jneanoth; 開關不為0
12、轉anothcallfun1; 為0,函數(shù)1處理loopnextmovdx,1; 開關量轉為1movcx,count2+1jmpagainnext:movsi,ax; 處理后保存incbx ; (3)修改參數(shù)incbxincsiincsijmpagainanoth:callfun2; 函數(shù)2處理loopnext ;(4)循環(huán)控制ret 2222223.3.多重循環(huán)多重循環(huán)z 一個循環(huán)中包含另一個循環(huán),稱多重循環(huán)。z 如:二維數(shù)組處理,二重循環(huán)。z注意:z (1)各重循環(huán)的初始控制條件及實現(xiàn)。z (2)內循環(huán)可嵌套在外循環(huán)中,也可幾個內循環(huán)并列在外循環(huán)中,可從內循環(huán)跳到外循環(huán),不可從外循環(huán)中直接
13、跳進內循環(huán)。z (3)要防止出現(xiàn)死循環(huán)。 z例:延時程序,多重循環(huán)實現(xiàn)軟件延時。z DELAY:MOV DX,3FFH TIME:MOV AX,0FFFFH TIME1:DEC AX NOP JNE TIME1 DEC DX JNE TIME RETz 內循環(huán)控制變量AX,初值=FFFFHz 外循環(huán)控制變量DX,初值=3FFH五、字符串處理程序五、字符串處理程序z字符:ASCII碼z說明:z (1)ASCII碼數(shù)字,字母形成一個有序序列:z 09:30H39Hz AZ:41H5AHz az:61H 7AHz (2)一些I/O裝置(鍵盤,顯示器,打印機)采 用ASCII碼傳送。z (3)常用的控
14、制字符:0AH 換行(LF)z 0DH 回車(CR)z 08H 退格1.1.確定字符串長度確定字符串長度z 字符串長度不定,以某個特定字符為結束符。z例4-3:從頭搜索字符串的結束符,統(tǒng)計長度。z 字符串地址指針:DIz 字符串長度: DLz 串結束字符: ALz (1)數(shù)據(jù)段:串放string開始單元z 串長度放LL單元z 結束符放CR單元z (2) 堆棧段:100個字節(jié) 長度=0CF=0?取串元素設置字符串指針返回長度+1存串元素YNz (3) 程序 lea di,string ;串地址偏移DI mov dl,0 ;串長度初始DL=0 mov al,cr ;結束符AL again:scas
15、b ;搜索串 je done;找到轉DONE,停止搜索 inc dl ;未找到,長度加1 jmp again ;繼續(xù)搜索 done:lea bx,ll mov bx,dl ;存長度 RETSTART ENDPCODE ENDSEND BEGIN2.2.加偶校驗到加偶校驗到ASCIIASCII字符字符zASCII碼:7位二進制數(shù),最高z 位可作為校驗位。z偶校驗:1的個數(shù)為偶數(shù),最高z 位置“0”,否則置“1”。z例4-4:有一個ASCII字符串放z在STRING開始的單元,從串z中取出每一個字符,檢查“1”z的個數(shù),為偶數(shù),則最高位z置“0”;為奇數(shù),最高位置“1”。 取元素“1”為偶數(shù)?自行
16、與初始化返回最高位置1送回串中長度修改=0?NNYY說明:說明: lea si,string ;串指針:si mov cx,count ;串長度:cx again:lodsb ;取數(shù),si+1si/LODSB塊裝入指令 把SI指向的存儲單元讀入累加器,LODSB就讀入 AL,LODSW就讀入AX中,然后SI自動增加或減小1或2. and al,al ;自行與,影響PF jpe next ;偶,轉至next or al,80h ;奇,最高位置1 mov si-1,al ;送回 next:dec cx ;修改長度 jnz again ;0,轉again六、碼轉換程序六、碼轉換程序z 十六進制,二進
17、制,BCD碼,ASCII碼z轉換方法:z(1) 算術和邏輯運算指令,軟件實現(xiàn);z(2) 查表指令;z(3) 硬件譯碼。z1.十六進制十六進制ASCIIz說明:說明: z(1) 十六進制: 09 AF ASCII碼:30H39H 41H46Hz 對 0 9,加上30H 對 A F,加上A-10 30H+0AH+07H=41H z(2) 地址指針:源(十六進制) bx 目的(ASCII) siz(3) cx=L1=2,每次循環(huán)轉換一個字節(jié)兩位十六進制數(shù):低位與高位 拆開:1) ANDAL,0FH ;留下低四位 2) MOVCL,4 SHRAL,CL ;原高四位 低四位z1.十六進制十六進制ASCI
18、Iagain:mov al,bx ;取十六進制數(shù) mov dl,al ;保存 and al,0fh ;留下低四位 call change ;低四位ASCII mov al,dl ;取數(shù) push cx mov cl,4 ;移位次數(shù) shr al,cl ;原高四位 低四位 pop cx call change ;高四位ASCII inc bx loop again一位十六進制數(shù) ASCII碼子程序: change:proc cmp al,10 jl add_0 ;09轉add_0 add al,A-0-10 ;AF add_0:add al,0 mov si,al inc si ret chan
19、ge endp2.ASCII壓縮壓縮BCDz 長度L2 長度L1 buffer string 壓縮BCD ASCII碼 非壓縮BCDz說明:說明:z (1)對非壓縮BCD碼,只要將ASCII的高4位屏蔽(AND)即可z (2)對壓縮BCD碼,要處理兩個ASCII碼,先為低位BCD碼,后為高位BCD碼,組合組合起來。 434H33H38H39H234H98H404030809data segment l2 dw 4buffer db 34h,33h,38h,39h ;ASCIIl1 dw ? string db 4dup(?) ;存BCD碼data endsstack segment stack
20、 stack db 100dup(?)stack ends code segment assume cs:code,ds:data,es:data,ss:stack start proc far begin: push ds mov ax,0 push ax mov ax,data mov ds,ax mov es,ax mov cx,l2 shr cx,1 mov l1,cx ;BCD碼區(qū)長度 lea bx,buffer lea si,string again:mov al,bx ;取ASCII碼 and al,0fh ;化為BCD碼 mov dl,al ;保存 inc bx ;指向下一個
21、mov al,bx ;取ASCII碼 and al,0fh ;化為BCD碼 push cx mov cl,4 shl al,cl ;左移四位 pop cx or al,dl ;組合兩位BCD碼 mov si,al ;保存 inc bx ;修改指針 inc si loop again retstart endpcode ends end begin3.3.二進制到二進制到ASCII串串z例4-6:P.179,把在內z存變量NUMBER中的16位z二進制數(shù),每一位轉換z為相應的ASCII碼,存入z串變量STRING中。z分析:分析: z(1) 數(shù)據(jù) zbuffer dw 4f78h ;16位二進制
22、數(shù) zstring dw 16dup(?) ;存ASCII碼 取要轉換數(shù)C=“1”?左移1位0填滿串返回存入1修改地址指針完成否?YNYN初始化z(2) 代碼段startproc farbegin:push dsmov ax ,0push axmov ax ,datamov ds ,axmov es ,axlea di,string ;串指針dimov cx,length string ;串長度push dipush cxmov al,30h;0的ASCII碼repstosb;建立串為全0popcxpopdimov al,31h;1的ASCII碼mov bx,num;取數(shù) again:rclb
23、x,1 ;左移一位,相應位進CFjncnext ;為0轉nextmov di,al ;為1,1的ASCII碼送串 next:incdiloop againretstartendp codeends 2424244.BCD二進制二進制z 壓縮BCD碼4位二進制z方法: z(1)(千位10)+百位)10+十位)10+個位z(2)千位控制加1000的次數(shù),百位控制加100 的次數(shù),十位控制加10的次數(shù),再加上個位。 z注意:注意:所有運算都用二進制z例:采用第一種方法。 (千位10)+百位)10+十位)10+個位z說明:z(1)數(shù)據(jù) dnum dw 9999h ;BCD碼 bnum dw ? ;二進
24、制數(shù) z(2)分離 mov ax,dnum mov di,ax mov dx,ax mov bx,ax and bx,000fh ;個位bx and dx,00f0h mov cl,4 shr dx,cl ;十位di and di,0f00h mov cl,8 shr di,cl ;百位di and ax,0f000h mov cl,12 shr ax,cl ;千位axz(3)乘以10,x10=x2+x8 add ax,ax mov cx,ax add ax,ax add ax,ax add ax,cx ;千位乘10 add ax,di ;加上百位 z 也可采用循環(huán)結構進行。z方法: 十進制數(shù)
25、 z Y=anXn+ +a1X1+a0 X=10 = (anX+an-1)X+ +a1)X+a0z 初值 Y=an,i=n-1 Y=YX+ai i=i-1 結束條件:i0 5.二進制二進制 BCDz 十六位二進制數(shù)轉換成BCD碼。z方法1: 找出二進制數(shù)中所包含的10000, 1000,100,10的個數(shù),即BCD碼。z方法2: 二進制數(shù)Bz B=bm 2m+ +b1 21+b0 = (bm 2+bn-1) 2+ +b1) 2+a0z 初值 B=0,i=m-1 B=B2+bi i=i-1 結束條件:i0z 乘法和加法用十進制運算十進制運算,結果為BCD碼。 z 例例:采用方法1,16位二進制5
26、位非壓縮BCD碼z說明:(1)數(shù)據(jù)段 bnum dw 270fh ;16位二進制數(shù) a_strg db 5dup(?) ;5個單元存BCD碼 (2) mov ax,bnum lea bx,a_strg mov dl,0 ;計數(shù)清0 again1:sub ax,2710h ;減10000 js next1 ;9999,DX不變z btobcd proc far cmp dx,9999 jbe tran ;dx9999,置CF=1,退出 jmp exit tran: tran:mov ax,0 ;結果(BCD)清0 mov cx,16 ;16位 again:clc rcl dx,1 ;循環(huán)左移bi
27、CF adc ax,ax ;B2+bi daa ;十進制調整,ax中為BCD loop again clc exit:ret btobcd endp 252525七、七、DOSDOS系統(tǒng)功能調用系統(tǒng)功能調用zDOS(Disk Operating System)z核心:核心:z 有關I/O驅動、磁盤讀寫以及文件管理子程序,編了號供匯編語言的源程序調用。z方法:方法:z (1) 子程序號(或稱系統(tǒng)功能調用號)送AHz (2) 入口參數(shù)指定寄存器z (3) INT 21Hz (4) 根據(jù)出口參數(shù)分析功能調用執(zhí)行情況1. 顯示顯示AH 功能 入口參數(shù) 2 顯示一個字符 DL=字符 9 顯示一個字符串
28、DS:DX=串地址,串以$結束z 例:在CRT上顯示一個字符。 MOV DL,OUTPUT_CHAR MOV AH,2 INT 21Hz 例:功能調用9,連續(xù)顯示字符串。 mov dx,offset buffer mov ah,9 int 21hz 例:P.150,功能調用9,在CRT上連續(xù)顯示0059。 z分析:分析:z cx:循環(huán)次數(shù)z bl:要顯示的兩位十進制數(shù)0059z si:緩沖區(qū)指針bufferz movcx,1000z movbl,0z lea si,buffer z一次循環(huán): pushbxgoon: movdl,0dh mov ah,2 ;輸出回車符 int 21hmovdl,0ah mov ah,2 ;輸出換行處理 int 21h popbx mov al,bl;(2) bl+1bl inc aldaacmpal,60hjcnextmoval,0 znext:movbl,al ;(3) 高四位ASCII碼 pushbx movdl,al pushcx movcl,4 shral,cl or al,30h;把AL十進制轉換為ASCII movsi,al incsi moval,dl ;(4) 低四位ASCII碼 andal,0fh; AL寄存器的低4位清零 or al,30h;把AL個位轉換為ASCII mo
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 增值稅課件中例題的答案(補充)
- 感恩父母-擁抱親情:主題班會課件
- 《抗核抗體測定》課件
- 《DM測試培訓》課件
- 《分析小說語言》課件
- Excel圖表制作說課課件
- 人才流動與跨文化管理的挑戰(zhàn)
- 企業(yè)勞動合同管理制度
- 低空經濟與城市空中出行
- 《債的移轉和消滅》課件
- 《對私外匯業(yè)務從業(yè)資格》開放式測試答案
- 《保險法解讀》課件
- 非煤礦山復工復產安全培訓
- 變壓器投標書-技術部分
- 《我國跨境電子商務消費者權益保護問題研究》
- 2024九省聯(lián)考適應性考試【甘肅省】歷史試卷及答案解析
- 四年級語文下冊第六單元【集體備課】(教材解讀+教學設計)
- 蘇教版小學信息技術五年級下冊五年級下冊教案全集
- 蘇教版八年級數(shù)學上冊期末試卷及答案【完美版】
- 法院拍賣議價協(xié)議書
- 2021年人教版八年級物理上冊期末考試卷(完美版)
評論
0/150
提交評論