CH4匯編語言程序設計_第1頁
CH4匯編語言程序設計_第2頁
CH4匯編語言程序設計_第3頁
CH4匯編語言程序設計_第4頁
CH4匯編語言程序設計_第5頁
已閱讀5頁,還剩43頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

匯編語言程序設計第四章4.0概述4.1匯編語言程序格式4.2MASM中的表達式4.3

偽指令語句4.4程序設計方法4.5DOS系統(tǒng)功能調用4.4程序設計方法一、匯編語言源程序設計基本步驟

1、明確任務,確定算法。

2、畫流程圖。

3、分配存儲空間及工作單元分析需要定義的段、變量、變量類型、長度;規(guī)劃各寄存器的使用等

4、編寫源程序(.ASM)、匯編(.OBJ)、連接(.EXE)。

5、程序調試。主要采用DEBUG來調試。開始執(zhí)行框判斷二、基本程序結構順序結構分支結構循環(huán)結構子程序結構DATASEGMENT………DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX……………

MOVAH,4CHINT21HCODEENDS

ENDSTART……………順序結構分支結構循環(huán)結構子程序結構順序結構順序結構分支結構循環(huán)結構子程序結構兩個分支YN三個分支YYNN順序結構分支結構循環(huán)結構子程序結構循環(huán)初始設置循環(huán)體循環(huán)條件判斷?YNYN循環(huán)初始設置循環(huán)體循環(huán)條件判斷?順序結構分支結構循環(huán)結構子程序結構codeSEGMENT…begin:CALL

sub1

CALLsub2

CALLsub3MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPsub3PROC…RETsub3ENDPcodeENDSENDbegin1、順序結構例1:已知當前數據段中有一個十進制數字0~9的七段代碼表,其數值依次為40H、79H、24H、30H、19H、12H、02H、78H、00H、18H。要求用XLAT指令將十進制數57轉換成相應的七段代碼值,存到BX寄存器中,編寫完整的匯編源程序。分析:先求5的七段代碼值,再求數字7的;需定義數據段、七段代碼表:TAB,字節(jié)變量;關鍵指令XLAT,表偏移地址放BX,原數字放入AL;三、程序舉例源程序清單:DATASEGMENTTABDB40H,79H,24H,30HDB19H,12H,02H,78HDB00H,18HDATAENDSCODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX

(轉右)

MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART

MOVBX,OFFSETTAB

MOVAL,5XLATMOVAH,ALMOVAL,7XLATMOVBX,AX2、分支結構程序根據不同條件選擇不同處理方法三、程序舉例例2:求內存中數X的絕對值,并送回原處2.根據以上分析畫出流程框圖3.根據流程圖確定所用寄存器,并編寫源程序;需定義數據段、變量X、使用寄存器AL1.分析:XX-0X0X<0|X|=

程序框圖及清單:開始從內存取數X0?

對X求負并回送結束YN

DATASEGMENT

XDB?

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATA;MOVDS,AX將數據段段地址送入DSMOVAL,[X]CMPAL,00H

;與0比較JGERETURNNEGAL

;求負MOV[X],AL

;回送結果RETURN:MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART

;結束源程序3、循環(huán)結構兩種形式:1)“先執(zhí)行,后判斷”:進入循環(huán)后至少要執(zhí)行一次循環(huán)體,再判斷循環(huán)是否結束。---用于循環(huán)次數固定的程序(掌握)2)“先判斷,后執(zhí)行”:進入循環(huán)后,先判斷循環(huán)結束條件,再決定是否執(zhí)行循環(huán)體,可能循環(huán)體一次也不執(zhí)行。

---用于循環(huán)次數不確定的程序三、程序舉例(a)“先執(zhí)行,后判斷”結構(b)“先判斷,后執(zhí)行”結構循環(huán)控制初始化部分入口循環(huán)體修改參數出口初始化部分入口循環(huán)控制循環(huán)體修改參數出口兩種循環(huán)結構都包括四部分:1)初始化---設置計數值、地址指針2)循環(huán)體---循環(huán)部分的核心:循環(huán)的全部執(zhí)行指令3)修改參數---改地址指針,為下次循環(huán)做準備4)循環(huán)控制---修改計數值,進行判斷(LOOP)例3:將附加段起始地址為DA1的100個字節(jié)的存儲區(qū)內容清0。DATASEGMENTDA1DB100DUP(?)DATAENDSCODESEGMENT

ASSUMECS:CODE,ES:DATASTART:MOVAX,DATAMOVES,AX

(轉右邊)

MOVAH,4CH;返回DOSINT21HCODEENDSENDSTART

MOVAL,00HMOVCX,0064HLEABX,DA1;初始化LP:MOVES:[BX],AL;循環(huán)體INCBX;修改參數

LOOPLP;循環(huán)控制

例4:統(tǒng)計一字符串BUF(長度小于256)中的大寫字母、數字及其他字符的個數,分別存入LETTR、DIGIT和OTHER單元。(循環(huán)+分支結構)

DATASEGMENTBUFDB‘123SAFASFLXCvfv@%¥&%’COUNTEQU$-BUFLETTERDB0DIGITDB0OTHERDB0

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉下頁)

MOVAH,4CH

INT21HCODEENDSENDSTART

MOVCX,COUNT

MOVBX,00HMOVDX,0;初始化LP:MOVAL,BUF[BX];循環(huán)體CMPAL,30H

JLNEXTCMPAL,39H

JGABC

INCDHJMPNEXTABC:CMPAL,41H

JLNEXTCMPAL,5AH(轉右邊)

JGNEXT

INCDLNEXT:INCBXLOOPLPMOVLETTER,DLMOVDIGIT,DHMOVAL,COUNTSUBAL,LETTERSUBAL,DIGITMOVOTHER,AL

例5:編程在一串給定個數的數據區(qū)BUFF中尋找最小數,結果存放至MIN單元中!(循環(huán)+分支結構)

DATASEGMENTBUFFDB42H,56,34,-5,-9,-78……COUNTEQU$-BUFFMINDB00H

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉下頁)

MOVAH,4CH

INT21HCODEENDSENDSTART

LEABX,BUFFMOVCX,COUNT-1MOVAL,[BX];初始化LP:CMPAL,[BX+1];循環(huán)體

JLENEXTMOVAL,[BX+1]NEXT:INCBX;修改參數LOOPLP;循環(huán)控制

MOVMIN,AL

例6:數據段從BUFF開始有一字數組,存放N個有符號數據,編程將數據按從小到大排序!(雙重循環(huán))

DATASEGMENTBUFFDW

42H,56,34,-5,-9,-78……NEQU($-BUFF)/2

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AX(轉下頁)

MOVAH,4CH

INT21HCODEENDSENDSTART

MOVCX,N-1LPW:MOVBX,0MOVDX,CX;初始化LPN:MOVAX,BUFF[BX];循環(huán)體CMPAX,BUFF[BX+2]

JLENEXTXCHGAX,BUFF[BX+2]MOVBUFF[BX],AXNEXT:ADD

BX,2

;修改參數DECDX;循環(huán)控制JNZLPNLOOPLPW;循環(huán)控制(轉右邊)思考:1、若為無符號數?2、若要求原數據不變?3、優(yōu)化算法?4、將排好序的數送到附加段的COPY單元?4、子程序結構子程序:將多次使用的程序語句寫成一個相對獨立的程序段,稱為子程序或過程。子程序結構的定義:使用過程定義語句PROC…ENDP。子程序屬性:調用程序和過程在同一代碼段中,則用NEAR屬性;調用程序和過程不在同一代碼段,使用FAR屬性。三、程序舉例過程調用和返回調用指令:CALL過程名返回指令:RET子程序說明:⑴功能描述:名稱,功能⑵子程序中用到的寄存器和存儲單元⑶子程序的入口參數,出口參數⑷調用其它子程序的名稱子程序結構段內調用格式codeSEGMENT…begin:CALL

sub1

CALLsub2

CALLsub3MOVAH,4CHINT21Hsub1PROC…RETsub1ENDPsub2PROC…RETsub2ENDPsub3PROC…RETsub3ENDPcodeENDSENDbegin子程序結構段間調用格式codeSEGMENT…begin:CALL

FARPTRsub1…MOVAH,4CHINT21HcodeENDScode1SEGMENT…sub1PROCFAR…RETsub1ENDPcode1ENDSENDbegin過程設計注意以下三點:⑴保護調用程序的斷點:由CALL指令本身完成。⑵保護某些寄存器內容:在子程序開頭,用一組PUSH指令,保護寄存器原來的內容;在子程序結尾,用一組POP指令,將寄存器原來的內容恢復。⑶主程序和過程(子程序)間的參數傳遞。入口參數:過程所需的初始數據。(調用時)

出口參數:過程運行所得結果。(返回時)參數傳遞常用的方法:①用寄存器傳遞參數:參數較少,速度較快。②用存儲器傳遞參數:參數較多;

調用前,將參數存入內存,將參數首地址送入某一寄存器(BX、SI、DI、BP)。進入過程后可采用寄存器間接尋址方式從內存中取出。③用堆棧傳遞參數:參數較多,多用在子程序嵌套與遞歸調用中。分析說明:通過存儲器來傳遞參數子程序名:SUB_MIN功能:找最小數所用REG:AL,用于暫存中間結果入口參數:數據區(qū)地址指針BX、

數據個數放入CX出口參數:最小值存入存儲單元MIN

例5:用子程序結構實現例4的要求:編子程序找數據區(qū)BUFF中的最小數,結果存放至MIN單元中!轉下頁

DATASEGMENTBUFFDB42H,56,34,-5,-9,-78……COUNTEQU$-BUFFMINDB00H

DATAENDS

CODESEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATAMOVDS,AX

MOVAX,STACK MOVSS,AX MOVSP,TOPSTACKSEGMENTSTACK‘STACK’SADW100DUP(?)TOPEQULENGTHSASTACKENDS

MOVAH,4CH

INT21H

LEABX,BUFFMOVCX,COUNTCALLSUB_MIN

CODEENDSENDSTARTSUB_MINPROCNEAR

PUSHAX;保護現場MOVAL,[BX]LP:CMPAL,[BX]

JLENEXTMOVAL,[BX]NEXT:INCBXLOOPLP

MOVMIN,AL

POPAX;恢復現場

RET;返回SUB_MINENDP接右邊通過存儲器來傳遞參數例6:數據段定義兩個字型數組,編程序實現數組分別求和(不計溢出),要求用子程序實現求和。解:通過存儲器來傳遞參數。子程序說明如下:子程序名:SUB_SUM功能:求一組數之和所用REG:AX入口參數:數組地址指針SI、

數組長度存于CX出口參數:結果直接存入各數組之后的字單元DATA SEGMENTARY1 DW100DUP(?) ;定義數組1SUM1DW?ARY2 DW100DUP(?) ;定義數組2SUM2 DW?DATAENDSSTACKSEGMENTSTACK‘STACK’SADW100DUP(?)TOPEQULENGTHSASTACKENDSCODE SEGMENT

ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOV AX,DATAMOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPLEASI,ARY1;數組1首地址,入口參數MOVCX,LENGTHARY1;數組1長度,入口參數CALLSUB_SUM

;調用求和子程序LEA SI,ARY2;數組2首地址,入口參數MOVCX,LENGTHARY2;數組2長度,入口參數CALLSUB_SUM

;調用求和子程序MOVAH,4CHINT21H(轉下頁)SUB_SUMPROC NEAR

;子程序

PUSHAX

XORAX,AX;AX清0L1:ADDAX,WORDPTR[SI];加數組元素

INCSIINCSILOOPL1MOVWORDPTR[SI],AX;數組和送入SUM

POPAX

RET

;子程序返回SUB_SUMENDP

CODE ENDSEND START4.5DOS系統(tǒng)功能調用一、DOS中斷和BIOS中斷

DOS操作系統(tǒng)或ROMBIOS程序提供的一組子程序,用“INTN”指令調用。DOS中斷:DOS操作系統(tǒng)提供,位于系統(tǒng)磁盤,主要用于I/O設備管理、目錄及文件管理。BIOS中斷:ROM提供,位于內存,主要用于系統(tǒng)加電自檢、引導裝入初始化程序等。二、DOS中斷(占用類型號即N為:20H~3FH)DOS專用中斷:INT22H,INT23H,INT24H

不能直接調用DOS可調用中斷:

INT20H,INT21H,INT25H等一定條件下調用最常用的:INT21H

稱為:DOS系統(tǒng)功能調用

21H為子程序的總入口,進入后可調用各種功能。詳見“附錄F,P516”三、DOS系統(tǒng)功能調用的步驟及實例步驟:

1.設置入口參數

2.將功能號放入AH寄存器

3.使用指令INT21H轉入子程序入口

4.獲得出口參數,分析結果一般:2、3步必須有;1、4視情況而定DOS系統(tǒng)功能調用實例

以DOS鍵盤功能調用、DOS顯示功能調用為例

1、單字符輸入(1號功能)

2、字符串輸入(0A號功能)

3、單字符顯示(2號功能)

4、字符串顯示(9號功能)1、單字符輸入(1號功能)功能:從鍵盤輸入一個字符到AL中,并回顯入口參數:無出口參數:AL=ASCII碼例:程序段

………MOVAH,01HINT21H………等待鍵入字符;若鍵‘A’,則屏幕上顯示‘A’;且AL=41H2、字符串輸入(0A號功能)功能:多個字符輸入到緩沖區(qū)入口參數:DS:DX=輸入緩沖區(qū)首地址出口參數:DS:DX=輸入字符串所在緩沖區(qū)地址緩沖區(qū)定義格式:第1字節(jié):設定允許輸入字符的最大個數第2字節(jié):預留,系統(tǒng)最后自動填入實際

溫馨提示

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

評論

0/150

提交評論