微機原理-第4章匯編語言程序設(shè)計課件_第1頁
微機原理-第4章匯編語言程序設(shè)計課件_第2頁
微機原理-第4章匯編語言程序設(shè)計課件_第3頁
微機原理-第4章匯編語言程序設(shè)計課件_第4頁
微機原理-第4章匯編語言程序設(shè)計課件_第5頁
已閱讀5頁,還剩62頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1第4章 匯編語言程序設(shè)計本章重點匯編語言源程序的基本語法指示性語句基本的DOS功能調(diào)用基本的程序設(shè)計2本章內(nèi)容4.1匯編語言的格式4.2語句行的構(gòu)成4.3指示性語句4.4指令語句4.5匯編語言程序設(shè)計及舉例34.1.18086匯編語言程序的一個例子(P90)MY_DATASEGMENT;定義數(shù)據(jù)段SUMDB ?;為符號SUM保留一個字節(jié)MY_DATAENDS;定義數(shù)據(jù)段結(jié)束MY_CODESEGMENT;定義碼段

ASSUMECS:MY_CODE,;規(guī)定CS和DS的內(nèi)容

DS:MY_DATAPORT_VALEQU3;端口的符號名GO:MOVAX,MY_DATA;DS初始化為MY_DATAMOVDS,AXMOVSUM,0;清SUM單元CYCLE:CMPSUM,100;SUM單元與100相比較

JNANOT_DONE;若未超過,轉(zhuǎn)至NOT_DONEMOVAL,SUM;若超過,把SUM單元的內(nèi)容

OUTPORT_VAL,AL;通過AL輸出

HLT;然后停機NOTDONE:INAL,PORT_VAL;未超過時,輸入下一個字節(jié)

ADDSUM,AL;與以前的結(jié)果累加

JMPCYCLE;轉(zhuǎn)至CYCLEMY_CODEENDS;碼段結(jié)束

ENDGO;整個程序結(jié)束54.1.匯編語言的格式匯編語言源程序的結(jié)構(gòu)源程序程序模塊1……程序模塊n堆棧段附加段代碼段過程1……過程n指令性語句指示性語句數(shù)據(jù)段6二.段與過程的定義1.段的定義段名

SEGMENT

段名ENDS2.過程(子程序)的定義過程名PROCNEAR/FAR

RET

過程名

ENDP

過程定義——設(shè)計具有一定功能的程序段,或稱為子程序。段內(nèi)過程的定義:過程名PROCNEAR段交叉過程的定義:過程名PROCFAR7[標號:][前綴]操作碼[操作數(shù)[,操作數(shù)]][;注釋][名字]偽操作 操作數(shù)[,操作數(shù)…] [;注釋]空格作為間隔由以上實例可知,每一語句行由4部分組成:4.2語句行的構(gòu)成指令性語句是計算機可執(zhí)行的指示性語句(偽指令)不能執(zhí)行,用來定義變量,分配存儲單元,指示程序開始和結(jié)束等這兩種語句的差別:在形式上:帶不帶冒號,是否可轉(zhuǎn)向它.在本質(zhì)上:匯編時能否形成對應(yīng)的機器碼.9(2)字符串常量用單引號括起來的字符或字符串匯編時被翻譯成對應(yīng)的ASCII碼數(shù)據(jù)項操作數(shù)包括常量、變量、標號及表達式1.常量(1)數(shù)字常量二進制常量以B結(jié)尾十進制常量以D結(jié)尾或省略

八進制常量以字母Q(或字母O)結(jié)尾

十六進制常量以H結(jié)尾10變量是內(nèi)存中的數(shù)據(jù)區(qū)在程序中作為存儲器操作數(shù)來使用變量有三種屬性段值—變量所在段的首地址偏移量—變量單元地址與段首地址之間的位移量類型—字節(jié)、字和雙字2.變量11標號是指令所存放單元的符號地址,可作為轉(zhuǎn)移指令或CALL指令的轉(zhuǎn)移地址。標號也有三種屬性:段值總是在CS段寄存器中,偏移量概念與變量同,類型分NEAR和FAR兩種。若沒有對類型進行說明,默認為NEAR。3.標號13(3)關(guān)系運算符EQ(相等),NE(不等),LT(小于),GT(大于),LE(小于或等于),GE(大于或等于)關(guān)系為真,結(jié)果為0FFFFH關(guān)系為假,結(jié)果為0例:MOVBX,PORT_VALGE514(4)取值運算符和屬性運算符(P103)取值運算符—獲得存儲器操作數(shù)的屬性O(shè)FFSET—獲得標號或變量的偏移地址SEG—獲得標號或變量的段地址例:MOVSI,OFFSETSTRI1 與LEASI,STRI1類似屬性運算符PTR—指定操作數(shù)的類型例:MOVAL,BYTEPTRVAR15(5)其它運算符1)方括號[]“[]”表示存儲器操作數(shù),方括號里的內(nèi)容表示操作數(shù)的偏移地址。(2)段超越運算符“:”“:”跟在某個段寄存器名之后表示段超越用來指定一個存儲器操作數(shù)的段屬性,而不管其原來隱含的段是什么。174.3.1符號定義語句(P99)1.等值偽指令EQU格式:符號名 EQU 表達式或:新符號名EQU老符號名例: CONSTANT EQU 100 NEW_PORT EQU PORT_VAL+1注意:EQU偽指令在未解除前,不能重新定義。2.解除偽指令PURGE例:PURGE NEW_PORTNEW_PORT EQU POTR_VAL+8183.等號(=)偽指令與EQU類似,但允許重新定義例: ┇

EMP=7 ;值為7 ┇

EMP=EMP+1 ;值為8194.3.2數(shù)據(jù)定義偽指令格式:變量名偽指令操作數(shù);注釋其中變量名用符號地址表示,后面不能跟冒號偽指令助記符

DB

用來定義字節(jié)

DW

用來定義字

DD

用來定義雙字例1:DATA_BYTE

DB

10,5,10HDATA_WORD

DW

100H,100,-4DATA_DW

DD

2*30,0FFFBH21例2:操作數(shù)可以是字符串

STR DB

‘HELLO’STR‘H’‘E’‘L’‘L’‘O’注意:

DB‘AB’ DW‘AB’41‘A’ 42 ‘B’42‘B’ 41 ‘A’22?操作數(shù)用來保留存儲空間,但不存入數(shù)據(jù).例3:ABC DB 0,1,?,?,?LPI DW ?,54,?匯編后:ABCLPI01?????54數(shù)據(jù)定義中的三個特殊符號:?,DUP,$23復(fù)制操作符DUP(P101)例4:ABCDB0,1,3DUP(?)例5:DO-2DB2DUP(0,1,2,?)與DO-2DB 0,1,2,?,0,1,2,?等價

$:表示的是地址計數(shù)器的當(dāng)前值例:BUFFERDW3,4,$+3設(shè)BUFFER的偏移地址為0088H,則匯編后$+3的值為多少25例:分析下面申請數(shù)據(jù)區(qū)的存儲內(nèi)容

NUMDB75H;申請一字節(jié),數(shù)為“75H”

ARRYDW20HDUP(0);申請20H個字,數(shù)均為“0”

ADR1DWNUM;申請一字,預(yù)置NUM的偏移地址

ADR2DDNUM;申請雙字,預(yù)置NUM的邏輯地址

ADR3DWARRY+2;申請一字,預(yù)置ARRY的偏移地址加2設(shè):NUM的段地址為0915H,NUM的偏移地址為0004H。75DS:NUMDS:ARRY0000DS:ADR1DS:ADR2DS:ADR3

40H

個單元040007000915:00040915:00050915:00450915:00470915:004B0915:000026分析運算符(P.103,也稱為數(shù)值返回運算符)在源程序中,只對存儲器進行操作,讀取存儲器的屬性。(1)SEG運算符——求取某存儲器單元的段地址。例:MOVAX,SEGNUM(2)OFFSET運算符——求取某存儲器單元的偏移地址。例:MOVAX,OFFSETNUM(3)TYPE運算符——求取某存儲器單元的類型屬性。例:MOVBL,TYPENUM屬性類型屬性值變量字節(jié)01H字02H雙字04H四字08H十字0AH27舉例:2930合成運算符(1)PTR運算符(P.104)格式:類型PTR

變量/標號/存儲器變量/存儲器類型標號BYTE(字節(jié))WORD(字)DWORD(雙字)NEAR(短調(diào)用)FAR(長調(diào)用)PTR舉例

NUM1DB20HDUP(?)NUM2DW10HDUP(0)

MOVAX,WORDPTRNUM1MOVBYTEPTRNUM2,BL

臨時修改操作數(shù)的屬性,并不分配存儲器31(2)THIS屬性運算符偽指令(P106)為當(dāng)前存儲單元定義一指定變量的類型,并不分配存儲空間段地址和段內(nèi)偏移是匯編時的當(dāng)前值格式:變量/標號EQUTHIS類型例:WBUFFER1EQUTHISWORDBUFFER1DB100DUP(0)

字節(jié)操作采用BUFFER1

,字操作采用WBBUFFER1合成運算符324.3.3段定義語句(P106)因8086/8088CPU的存儲器是分段的,這就需要有段定義語句。與段有關(guān)的偽指令有:

SEGMENT、ENDS、ASSUME

段定義偽指令的格式如下:段名SEGMENT[定位類型][組合類型][’類別’]

┇段名ENDS例:MY_SEGSEGMENTPARA

AT1A2BH33段定位(P109)表示對邏輯段起始邊界的選擇,可為:PAGE 段從一個頁邊界開始 (XXX00H,256Bytes/Page)PARA 段節(jié)邊界16倍數(shù)地址開始(XXXX0H)DWORD 段從一個4倍數(shù)地址開始WORD 段從一個偶地址開始BYTE 段可以從任意單元開始完整段定義偽指令的默認定位屬性是PARAMY_SEGSEGMENTPARA

AT1A2BH段的起始邊界為16倍數(shù)地址開始,段地址為1A2BH34成對出現(xiàn)前面的段名一致二者之間的部分對數(shù)據(jù)段、附加段及堆棧段,一般是符號、變量定義等偽指令。對于代碼段則是指令及偽指令。段和段寄存器的關(guān)系,可由ASSUME語句來實現(xiàn)SEGMENT

和ENDS35

設(shè)定段寄存器偽指令A(yù)SSUMEASSUME

段寄存器名:段名[,段寄存器名:段名[,...]]ASSUME偽指令應(yīng)放在可執(zhí)行程序開始位置的前面36ASSUME偽指令只是告知匯編程序有關(guān)段寄存器與段的關(guān)系,并沒有給段寄存器賦予實際的初值。將段基址裝入段寄存器

MOV AX,DATAMOV DS,AXMOV ES,AX

注意:代碼段不需要用戶裝,由初始化程序裝入由程序員把段地址裝入段寄存器(稱為段初始化)37例:CODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATASTART: MOVAX,DATA//段初始化 MOVDS,AX MOVES,AX LEASI,SUM

…CODE ENDS ENDSTART38ORG(origin),規(guī)定了段內(nèi)的起始地址。一般格式:

ORG <表達式>此語句指定了段內(nèi)在它以后的程序或數(shù)據(jù)塊存放的起始地址,即以語句中的表達式的值作為起始地址,連續(xù)存放,除非遇到一個新的ORG語句MY_SEGSEGMENTAT1A2BHORG0003H;//段內(nèi)從偏移量0003H開始MY_SEGENDS偽指令ORG(origin)394.3.4過程定義偽指令(P112)格式:過程名PROC

[NEAR]或 過程名 PROC

FAR

RET;過程返回

過程名

ENDP;過程結(jié)束調(diào)用一個過程的格式為:

CALL 過程名過程是程序的一部分,它們可被程序調(diào)用。每次可以調(diào)用一個過程。當(dāng)過程中的指令執(zhí)行完后,控制返回調(diào)用它的地方。404.5.7宏命令偽指令(P136)用宏指令名來代替一個程序段格式:宏命令名MACRO[形式參數(shù),...](宏定義體)ENDM41例4-6兩個數(shù)之和的宏定義和宏調(diào)用。宏定義為:DADDMACROX,Y,Z MOVAX,X ADDAX,Y MOVZ,AX ENDMX、Y、Z是形式參數(shù)。調(diào)用宏DADD:DADDDATA1,DATA2,SUMDATA1,DATA2,SUM是實際參數(shù)42上述宏命令經(jīng)匯編后展開的指令相當(dāng)于源程序:MOVAX,DATA1ADDAX,DATA2MOVSUM,AX宏調(diào)用與過程調(diào)用類似,

其差別是:①宏命令偽指令由宏匯編程序在匯編過理中進行替換處理;而過程調(diào)用指令CALL和返回指令RET則是CPU指令,需進行入棧和出棧處理②宏指令與過程都可以簡化編程434.3.5結(jié)束語句(P113)格式為:END

<表達式>

表達式通常是程序第一條指令的標號

每一個結(jié)束語句都與某個開始語句成對出現(xiàn):SEGMENT和ENDS,PROC和ENDP,MACRO和ENDM唯一的例外就是END語句,它標志著整個源程序的結(jié)束,它告訴匯編程序,沒有更多的指令要匯編了。44●

一個完整的用匯編語言編寫的源程序組成是:指令性語句:

可執(zhí)行指令指示性語句:

對符號定義、分配存儲單元、分段等。

●一個完整的程序至少應(yīng)該包含三種段:

源程序行組成的代碼段,堆棧操作所需要的堆棧段存放數(shù)據(jù)的數(shù)據(jù)段。45DATASEGMENT…...DATAENDSSTACKSEGMENTSTACK‘STACK’…...STACKENDSCODESEGMENT

ASSUMEDS:DATA,SS:STACK,CS:CODESTART:……

CODEENDSENDSTART匯編源程序結(jié)構(gòu)——完整的段定義表示是堆棧段,且給了一個名字“STACK”,自動進行堆棧段的初始化,即段基值→SS,且自動為SP初始化46分段結(jié)構(gòu)stack

SEGMENTstack‘stack’DB100DUP(?)stackENDSdataSEGMENT

szhelloDB'Helloworld',0dh,0ah,'$'dataENDScodeSEGMENTASSUMECS:code,DS:data,SS:stackstart:MOVAX,dataMOVDS,AXMOVAH,9MOVDX,OFFSETszhelloINT21hMOVAH,4chINT21hcodeENDSENDstart474.5.6DOS系統(tǒng)功能調(diào)用系統(tǒng)軟件中提供的功能調(diào)用D0S功能調(diào)用(也稱高級調(diào)用)BI0S功能調(diào)用(也叫低級調(diào)用)調(diào)用系統(tǒng)服務(wù)程序軟中斷指令I(lǐng)NTnD0S系統(tǒng)功能調(diào)用都是用軟中斷指令I(lǐng)NT21H來實現(xiàn)的48

DOS中斷調(diào)用簡介

中斷調(diào)用DOS功能格式

入口寄存器與參數(shù)賦值

AH功能號

INT21H(中斷類型號21H的中斷功能為請求DOS功能調(diào)用)

DOS中斷功能舉例01H02H09H0AH鍵盤輸入字符顯示字符顯示字符串鍵盤輸入字符串AL=輸入字符DL=輸出字符DX=緩沖區(qū)首地址DX=緩沖區(qū)首地址功能號入口參數(shù)出口參數(shù)功能25H置中斷向量AL=中斷類型號DS:DX=入口地址

35H取中斷向量AL=中斷類型號ES:DX=入口地址4CH返回DOS49

BIOS中斷調(diào)用簡介

中斷調(diào)用BIOS功能格式

入口寄存器與參數(shù)賦值

INT中斷類型號

BIOS中斷功能舉例02H01H02H設(shè)置光標位置發(fā)送一字符接收一字符AL=字符的ASCIIDX=串口代碼(0,1)DX=串口代碼(0,1)08H取當(dāng)前驅(qū)動器參數(shù)DL=驅(qū)動器號(80H和81H)硬盤

AH功能號BH=0(圖形方式)DH:DL=行:列10H00H讀當(dāng)前時鐘CX=時鐘高字DX=時鐘低字1AHAL=接收的ASCII14H13HDL=驅(qū)動器數(shù)DH=最大磁頭號CX=扇區(qū)數(shù)目10位功能號入口參數(shù)出口參數(shù)功能類型號0AH顯示字符AL=顯示字符BX=0001(色彩等)501.DOS鍵盤功能調(diào)用(1)

單字符輸入并回顯在屏幕上入口參數(shù):AH=01 ;功能調(diào)用號返回參數(shù):AL=輸入字符的ASCII碼中斷號:21H格式:MOVAH,1INT21H51

(2)

輸入字符串

將鍵盤輸入的字符串存入用戶定義的緩沖區(qū)。

入口參數(shù):AH=0AH

DS:DX=輸入字符串在內(nèi)存中的首地址

中斷號:21H

522.DOS顯示功能調(diào)用(1)顯示單個字符入口參數(shù):AH=02(或06)

DL=字符(用ASCII碼表示)中斷號:21H例:有如下程序段

MOV AH,02 MOV DL,41H INT 21H

;顯示‘A’53入口參數(shù):AH=09

DS:DX=字符串地址中斷號:21H被顯示的字符串必須以‘$’結(jié)束,且所顯示的內(nèi)容不應(yīng)出現(xiàn)非可見的ASCII碼,否則產(chǎn)生不可預(yù)料的結(jié)果。(2)顯示字符串54

DOS中斷調(diào)用舉例例1:鍵盤輸入字符,并顯示。鍵入字符時,結(jié)尾應(yīng)為“$”送緩沖區(qū)首地址鍵入字符串顯示字符串554.5匯編語言程序設(shè)計基礎(chǔ)4.5.1程序設(shè)計概述1.編寫匯編語言的步驟(1)根據(jù)實際問題抽象出數(shù)學(xué)模型(2)確定解決此數(shù)學(xué)模型的算法(3)畫出程序框圖(流程圖)(4)分配內(nèi)存工作單元和寄存器(5)根據(jù)框圖編制程序(6)上機調(diào)試,進行修改(匯編、鏈接)562.源程序的基本結(jié)構(gòu)

順序程序 分支程序 循環(huán)程序 子程序573.匯編語言上機過程匯編語言源程序(屬性為.ASM)

從鍵盤輸入(如在EDIT下)匯編--經(jīng)MASM的語法檢查和翻譯 若無語法錯,形成目的文件(.OBJ)鏈接--經(jīng)LINK連接,形成可執(zhí)行文件(.EXE)運行--直接鍵入.EXE的名字部分若運行結(jié)果不對,可用DEBUG調(diào)試,再編輯、匯編、連接、運行直至得到正確結(jié)果。584.5.5碼轉(zhuǎn)換程序設(shè)計輸入輸出設(shè)備以ASCII碼表示字符,所以,在CPU與I/O設(shè)備之間必須要進行碼的轉(zhuǎn)換。實現(xiàn)碼轉(zhuǎn)換的方法有:對于有些轉(zhuǎn)換,利用CPU的算術(shù)和邏輯運算指令很容易實現(xiàn),故可用軟件實現(xiàn)轉(zhuǎn)換;某些更為復(fù)雜的轉(zhuǎn)換,可以用查表來實現(xiàn),但要求占用較大的內(nèi)存空間;對于某些轉(zhuǎn)換,用硬件也是容易實現(xiàn)的,如BCD到七段顯示之間轉(zhuǎn)換的譯碼器等。59利用軟件實現(xiàn)不同碼之間的轉(zhuǎn)換:十六進制到ASCII例4-5(P127頁)

若有一個二進制數(shù)碼串,要把每一個字節(jié)中的二進制轉(zhuǎn)換為兩位十六進制數(shù)的ASCII碼,高4位的ASCII碼放在地址高的單元。串中的第一個字節(jié)為串的長度(小于128)。能實現(xiàn)這樣轉(zhuǎn)換的流程如圖4-8所示。6061

namehex_change_to_asciidata segmentl1 dw 2stringdb 34h,98hl2 dw ?buffer db 2*2dup(?);轉(zhuǎn)換好的ASCIIdata endsstack segment parastack′stack′ db 100dup(?)stack endscode segment assumecs:code,ds:data,es:data,ss:stack62start proc farbegin: push ds mov ax,0 push ax

mov ax,data mov ds,ax mov es,ax mov cx,l1;(l1)=2,字符串長度

lea bx,strin

溫馨提示

  • 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論