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

下載本文檔

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

文檔簡介

6.4

8086微處理器匯編程序設計程序設計語言按照形式與功能的不同可分為三種,即機器語言、匯編語言和高級語言。匯編源程序需翻譯成機器語言,變成可執(zhí)行文件,機器才能執(zhí)行,這個翻譯過程叫匯編。

——高級語言中稱該過程為“解釋”或“編譯”。執(zhí)行翻譯的程序稱為“匯編程序”。.ASM.OBJ.EXE編譯連接匯編(編譯)程序:MASM.EXE2014/066§6.4.1

8086微處理器匯編偽指令1、偽指令的語句格式1)標號

目標名后面不能用冒號“:”,標號名可以是常量名、變量名、過程名、結構名、記錄名等。標號名表示一個常量或存儲器地址。2014/0662)偽指令

如定義數(shù)據(jù)偽指令DB,DW,DD;段定義偽指令SEGMENT;定義過程偽指令PROC;…。它們是偽指令語句要求匯編程序完成的具體操作命令。3)操作數(shù)

操作數(shù)可以是一個常數(shù)(二進制、十進制、十六進制等)、字符串、常量名、變量名、標號、一些專用的符號(如BYTE,F(xiàn)AR,PARA等)。4)注釋

必須以分號為開始,它的作用與指令語句的注釋字段相同。2014/0662、常數(shù)、變量和標號1)常數(shù)

常數(shù)是沒有任何屬性的純數(shù)值。2)變量

變量是代表存放在某些存儲單元的數(shù)據(jù),常以變量名的形式出現(xiàn)在程序中,它可以認為是存放數(shù)據(jù)的存儲單元地址。3)標號

標號是一條指令目標代碼的地址,它常作為轉(zhuǎn)移指令(含子程序調(diào)用指令)的操作數(shù)。2014/0663、運算符1)SEG

功能是求符號名所在段的段基址。2)OFFSET

功能是求符號名所在段的偏移地址。3)TYPE

功能是獲得符號名類型值。4)SIZE功能是獲得為符號名分配的字節(jié)數(shù)。5)PTR

功能是定義符號名為新類型。2014/066名字EQU

表達式名字=

表達式給名字定義一個值或其他符號名或一條可執(zhí)行語句,凡是出現(xiàn)該名字的地方就用定義的數(shù)據(jù)替代。用EQU賦值的名字不能重新賦值,但可用PURGE釋放后重新定義。例:TIMESEQU50BUFDBTIMESDUP(?)

ALPHAEQU256BETA=ALPHA-21)等價定義偽指令4、偽指令2014/0661.DB:定義字節(jié),其后的每個操作數(shù)占有一個字節(jié)單元,連續(xù)存放。BUFFERDB2,3,505H03H02HBUFFER2.DW:定義字,其后的每個操作數(shù)占有兩個字節(jié);BUFDW2,3,505H00H00H03H00H02HBUF2)內(nèi)存數(shù)據(jù)定義偽指令2014/0663.DD:

定義雙字,其后每個操作數(shù)占4個字節(jié)。4.

若僅保留單元,不初始化,用?代替初值;若數(shù)據(jù)重復,用n

DUP()代替,n為重復次數(shù)。STRINGDD

2,3,5ARRAYDB100DUP(?)保留100個字節(jié),首地址為ARRAY,不初始化,即100個字節(jié)內(nèi)均為隨機值。2014/0663)段定義偽指令

<段名>SEGMENT

[定位][組合][‘類別’][屬性]┆;段體

<段名>ENDS注意:1.完整段定義由SEGMENT和ENDS這一對偽指令實現(xiàn)2.指令后的4個關鍵字用于確定段的各種屬性3.如不指定,則采用默認參數(shù);用途:在匯編語言程序中定義邏輯段,指定段的名稱和范圍,并指明段的定位類型、組合類型及類別。1.

段定義SEGMENT/ENDS2014/066定位類型:規(guī)定邏輯段的起始地址要求。方式PARA:邏輯段地址從段邊界開始BYTE:邏輯段地址從字節(jié)邊界開始WORD:邏輯段地址從字邊界開始PAGE:邏輯段地址從頁邊界開始以上4種邊界如下所示:××××××××××××00000000PAGE××××××××××××××××0000PARA×××××××××××××××××××0WORD××××××××××××××××××××BYTE2014/066組合類型:規(guī)定本段與其他段的關系NONE:與其他段在邏輯上沒有關系。PUBLIC:與其它同名、同類別的段相鄰地連在一起。STACK:此段為堆棧段,連接方式與PUBLIC相同。類別:

需用單引號括起來,凡是類型名相同的段在連接時均按先后順序連接起來。屬性類型:規(guī)定16位段或32位段。注意:大多數(shù)MASM程序使用‘code’、‘data’和‘stack’來分別指名代碼段、數(shù)據(jù)段和堆棧段。2014/066ASSUME<段寄存器名>:NOTHING

;取消段性質(zhì)的規(guī)定。4)指定段址偽指令ASSUME

ASSUME

<段寄存器名>:<段名>[,<段寄存器名>:<段名>…]功能:告訴匯編程序在匯編時,段寄存器CS:DS:SS:和ES:應具有的符號段基址,但是段寄存器實際值(CS除外)還要有傳送指令在執(zhí)行程序時賦值。

ASSUME

CS:CODE,DS:DATA,SS:STACK

2014/066

過程名

PROC

[NEAR/FAR]┆RET┆

過程名

ENDP

功能:把具有獨立功能的程序段定義為過程,供其它程序調(diào)用。對過程的調(diào)用要使用CALL語句,如:

CALL過程名

如果在過程定義中沒有寫明是NEAR過程或FAR過程,則匯編器將這個過程默認為NEAR過程。5)過程定義偽指令2014/0666)模塊定義偽指令1.模塊開始偽指令格式:NAME

模塊名功能:指明程序模塊的開始,并指出模塊名,一般取源程序文件名為模塊名。2.

模塊結束偽指令格式:END

[啟動標號或過程名]功能:告訴匯編程序源文件結束,并給出執(zhí)行程序的入口位置。2014/066例:MYDARASEGMENT ;定義數(shù)據(jù)段起始語句

……

;定義數(shù)據(jù)MYDATAENDS ;定義數(shù)據(jù)段終止語句MYCODESEGMENT ;定義代碼段起始語句 ASSUMECS:MYCODE,DS:MYDATA;約定段寄存器和段的關系 START: MOVAX,MYDATA ;裝填相應的段寄存器 MOVDS,AX …… ;完成所需功能的程序段MYCODEENDS ;定義代碼段終止語句ENDSTART ;程序結束2014/0661.定位偽指令格式:ORG<表達式>功能:把以下語句定義的內(nèi)存數(shù)據(jù)或程序,從表達式指定的起點(偏移地址)開始連續(xù)存放,直至遇到新的ORG指令。表達式值是一個無符號數(shù)2.列表偽指令格式:PAGE行數(shù),行字數(shù)功能:為列表文件定義每頁行數(shù)(10~255)和每行字符數(shù)(60~132),默認值是66行,80列7)其它偽指令2014/066在匯編程序中,如果用戶程序要與輸入輸出設備打交道,就要調(diào)用現(xiàn)成的程序,這些程序是DOS系統(tǒng)的一部分,隨著DOS系統(tǒng)駐留內(nèi)存,用戶需要按照這些程序要求的接口格式調(diào)用。返回操作的用DOS系統(tǒng)調(diào)用中斷指令:INT21H,在用戶程序結束時,用下面兩條指令:

MOVAH,4CHINT21H§6.4.2

DOS系統(tǒng)功能調(diào)用2014/066

8086指令系統(tǒng)中,每執(zhí)行一條軟中斷指令INTn,就調(diào)用一個相應的中斷服務程序。當n=5~1FH時,調(diào)用BIOS中的服務程序,當n=20~3FH時,調(diào)用DOS中的服務程序。其中,INT21H是一個具有多種功能的服務程序,一般稱之為DOS系統(tǒng)功能調(diào)用。1、DOS軟中斷

DOS軟中斷功能見表6-16,矢量號為20H~27H。2014/0662014/066在匯編程序中最常用的是INT21H中斷入口,也稱為DOS系統(tǒng)功能調(diào)用。這個中斷入口中有許多小程序,每個小程序都被編上號,固定完成某一種功能,調(diào)用時有一定的格式,因為對某一個小程序而言,輸入條件(入口參數(shù))和輸出結果(出口參數(shù))的格式都是固定的。用戶在使用時,既要給出小程序的編號(AH),又要按照其提供的格式進行調(diào)用,才能正確完成操作。2、DOS系統(tǒng)功能調(diào)用(INT21H)2014/0661)在顯示器上顯示單個字符(2號功能)功能:在屏幕的光標處顯示單個字符入口參數(shù):要顯示字符的ASCII碼放在DL中出口參數(shù):無MOVDL,‘A’MOVAH,2INT21H;提供調(diào)用功能號;系統(tǒng)功能調(diào)用;在屏幕光標處顯示字符A運行至此,屏幕上當前光標處顯示字符A2014/0662)在屏幕上顯示字符串(9號功能)功能:在屏幕上當前光標處輸出存儲在內(nèi)存數(shù)據(jù)段的一串字符串,該字符串以‘$’結束。入口參數(shù):DS:DX指向欲顯示字符串的首址出口參數(shù):無DATASEGMENTSTRINGDB‘Iamastudent.$’DATAENDS……MOVDX,OFFSETSTRINGMOVAH,9INT21H;指向字符串首址;提供調(diào)用功能號;系統(tǒng)功能調(diào)用2014/0663)帶顯示的鍵盤輸入(1號功能)功能:等待鍵盤輸入,直到按下一個鍵。入口參數(shù):無出口參數(shù):鍵入鍵的ASCII碼放在AL中,并在屏幕上顯示該鍵。MOVAH,1INT21HMOV[2000H],AL……;提供調(diào)用功能號;系統(tǒng)功能調(diào)用程序運行到此停下,等待用戶鍵盤輸入.用戶從鍵盤鍵入的鍵的ASCII碼進入AL中.2014/0664)不帶顯示的鍵盤輸入(7號功能)功能:等待鍵盤輸入,直到按下一個鍵。入口參數(shù):無出口參數(shù):鍵入鍵的ASCII碼放在AL中,但在屏幕上沒有顯示,常用于輸入密碼。MOVAH,7INT21HMOV[2000H],AL……;提供調(diào)用功能號;系統(tǒng)功能調(diào)用程序運行到此停下,等待用戶鍵盤輸入用戶從鍵盤鍵入的鍵的ASCII碼進入AL中該功能與1號功能類似,只是輸入的字符不在屏幕上顯示。2014/0665)字符串輸入(10號功能)功能:等待從鍵盤輸入一串字符到存儲區(qū)的數(shù)據(jù)段,直到按下回車結束輸入。入口參數(shù):DS:DX指向接收字符串的內(nèi)存地址的首址,該地址的第一個字節(jié)是由用戶設置的可輸入字符串的最大字符數(shù)(含回車)出口參數(shù):存放輸入字符串存儲區(qū)的第二個字節(jié)是實際輸入的字符數(shù)(不含回車),實際輸入的字符串從該存儲區(qū)的第三個字節(jié)處開始存放。2014/066DATASEGMENTBUFDB20,20DUP(?)DATAENDS……LEADX,BUFMOVAH,0AHINT21H程序運行到此停下,等待用戶鍵盤輸入若輸入ABCD<CR>后BUFDX實際字符個數(shù)開始存放2014/0666)程序結束,返回DOS(4C號功能)功能:將控制權移交DOS。入口參數(shù):無出口參數(shù):無MOVAH,4CHINT21H2014/066在屏幕上顯示W(wǎng)hat’syourname?,用戶輸入自己的名字###后顯示:Welcome###。DATASEGMENTMEGDB‘What’syourname?’,10,13,’$’MEG1DB'Welcome$'BUFDB30,?,30DUP(0)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXLEADX,MEGMOVAH,9INT21HLEADX,BUFMOVAH,10INT21HLEADX,MEG1MOVAH,9INT21HXORBH,BHMOVBL,BUF+1MOV[BX+BUF+2],‘$’LEADX,BUF+2MOVAH,9INT21HMOVAH,4CHINT21HMAINENDPCODEENDSENDSTART;輸出字符串;接受姓名;輸出Welcome;輸出姓名;返回DOS輸入緩沖區(qū)以‘$’結尾顯示字符串后回車換行2014/066

例:編程實現(xiàn)多字節(jié)加法,如S=3B74AC60F8H+20D59E36C1HF8H60HACH74H3BHC1H36H9EHD5H20H被加數(shù)、和加數(shù)DATA1DATA2……2014/066CODESEGMENT

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

MOVCX,5MOVSI,0CLCLOOPER:MOVAL,DATA2[SI]ADCDATA1[SI],ALINCSIDECCXJNZLOOPERMOVAH,4CHINT21HCODEENDS

ENDSTARTDATASEGMENTDATA1DB0F8H,60H,0ACH,74H,3BHDATA2DB0C1H,36H,9EH,0D5H,20HDATAENDS2014/066特點:計算機執(zhí)行程序的方式是“從頭到尾”逐條執(zhí)行指令語句,直至程序結束。1、順序結構程序設計例:

內(nèi)存10050H單元的內(nèi)容拆成兩段,每段4位,并將它們分別存入內(nèi)存10051H和10052H單元;即10050H單元中的低4位放入10051H單元的低4位,10050H單元中的高4位放入10052H單元的低4位,而10051H和10052H單元的高4位均為零。§6.4.3

8086微處理器匯編程序設計2014/066流程圖:2014/066程序:DATASEGMENT ORG50HData1DB7AHData2DB?Data3DB?DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATACODEENDSEND START?2014/066程序:START:MOV AX,DATAMOV DS,AXMOV SI,Data1 ;需拆字節(jié)的指針(SI)=50HMOV AL,[SI] ;取一個字節(jié)→(AL)MOV BL,AL ;(BL)←(AL),內(nèi)容備份AND AL,0FH ;(AL)的前4位清0MOV SI,Data2 ;(SI)=51HMOV [SI],AL ;把得到的后4位→(10051H)MOV AL,BL ;再取出需拆字節(jié)→(AL)MOV CL,4SHR AL,CL ;邏輯右移4次,前4位補0MOV SI,Data3 ;(SI)=52HMOV [SI],AL ;(10052H)←(AL)2014/066

利用條件轉(zhuǎn)移指令,使程序執(zhí)行到某一指令后,根據(jù)條件(即上面運算的情況)是否滿足,改變程序執(zhí)行的次序。特點:先用比較指令、數(shù)據(jù)操作、位測指令等改變標志寄存器各個標志位,然后用條件轉(zhuǎn)移指令進行分支。例:求AX累加器和BX寄存器中兩個無符號數(shù)之差的絕對值,結果放在內(nèi)存2800H單元中。

2、分支程序設計2014/066流程圖:2014/066CODESEGMENTASSUMECS:CODE,DS:DATA

MOVAX,DATAMOVDS,AXCODEENDS

END CLC

MOV CX,AX SUB AX,BX JC AA MOV DI,2800H MOV [DI],AXLP:JMP LP AA:SUB BX,CX MOV DI,2800H MOV [DI],BX;清除CF;AX←(AX-BX),影響CF;CF=1轉(zhuǎn)AA去執(zhí)行(AX<BX);結果指針DI=2800H;結果送到2800H和2801H單元;暫停;BX←(BX-CX)2014/066例:編制程序從外設71H端口中取一個數(shù)M,判斷其值是否在10和20之間,即10≤M<20。如果M≥20,則送0FFH給外設73H端口;如果M<10,則送00H給外設73H;如果10≤M<20,則送88H給外設73H

。開始暫停輸出BL值到73號外設去輸入71號外設的值AL令BL=88H令BL=00H令BL=0FFHAL值≥

20AL值≥

10是是否否LP1LP22014/066START:IN AL,71H

;將71H端口的字節(jié)讀入AL CLC ;清除CF CMPAL,10 ;AL←AL-10 JC Lw10 ;小于10轉(zhuǎn)LP1 CMPAL,20 ;AL←AL-20 JC L10to20 ;10≤AL<20轉(zhuǎn)LP2 MOVBL,0FFH

;將FFH送入BL寄存器

JMP LOutLw10:MOVBL,00H JMP LoutL10to20:MOVBL,88HLOut:MOVAL,BL

OUT

73H,AL;將結果的標志數(shù)據(jù)輸出到73H端口

HLT ;暫停2014/066強制CPU重復執(zhí)行某一指令系列(程序段)的一種程序結構形式。組成:初始化循環(huán)體循環(huán)控制循環(huán)結束例:求兩個多字節(jié)數(shù)之和。兩個數(shù)位于內(nèi)存數(shù)據(jù)段,其偏移量為0050H地址,連續(xù)存放,低位在小地址一端,結果放在這兩個數(shù)之后。設這兩個多字節(jié)數(shù)均為8個字節(jié)長。3、循環(huán)程序設計2014/066DATASEGMENT ORG0050HLopDat1DB23H,56H,45H,63H,78H,66H,90H,42HLopDat2DB13H,44H,86H,80H,24H,64H,56H,60HDatSumDB8DUP(?)

DATAENDS

CODESEGMENTASSUMECS:CODE,DS:DATASTARTPROCFARMOVAX,DATAMOVDS,AX2014/066MOV SI,LopDat1 MOV DI,LopDat2MOV BX,DatSum MOV CX,4

CLC

Ad:MOV AX,[SI] ADC AX,[DI] MOV [BX],AX

ADD SI,2 ADD DI,2 ADD BX,2

LOOP Ad

STARTENDP

END;指針(SI)=0050H;指針(DI)=0058H;指針(BX)=0060H;循環(huán)(CX)=4;清進位CF=0;(AX)←((SI)),取一個字;(AX)←(AX)+((DI))+CF;存一個字到((BX));(SI)←(SI)+2;(DI)←(DI)+2;(BX)←(BX)+2;(CX)←(CX)-1,若(CX)≠0轉(zhuǎn)Ad2014/066CALLRET4、子程序設計

1)子程序調(diào)用與返回2014/0662)子程序設計注意問題(1)現(xiàn)場保護和恢復為避免沖突,應在進入過程時,將該過程所用到的寄存器內(nèi)容保護起來,稱為保護現(xiàn)場。而從過程返回主程序前,再將這些寄存器的內(nèi)容恢復,稱為恢復現(xiàn)場。保護現(xiàn)場和恢復現(xiàn)場通常分別用堆棧壓入指令和彈出指令來實現(xiàn)。例如:2014/066SUBPRPROCFAR PUSHAX PUSHBX PUSHCX PUSHDX POPDX POPCX POPBX POPAX RETSUBPRENDP…(2)參數(shù)傳遞:①寄存器傳遞②存儲單元(參數(shù)表)傳遞③堆棧傳遞2014/066例:AX寄存器中存放著4位十六進制數(shù),將這4位十六進制數(shù)分別轉(zhuǎn)換為相應的ASCII碼,并依次存放到RESULT數(shù)組的4個字節(jié)中,要求子程序方法實現(xiàn)。

DATASEGMENT DA1DW3D7EH RESULTDB4DUP(?) DATAENDS

CODESEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX2014/066

MOV CX,4 LEA SI,DA1 LEA DI,RESULT MOV BX,[SI]NEXT:MOVAX,BX AND AL,0FH

CALL ASC MOV [DI],AL INC DI PUSHCX MOV CX,4 SHRBX,CL POP CX

LOOPNEXT十六進制轉(zhuǎn)換成ASCII碼子程序

ASCPROC

CMP AL,0AH JB PL30 ADD AL,07HPL30:ADD AL,30H RET

ASCENDP2014/066

LEA SI,RESULT+3 MOV CX,4 STDLOOP1:LODSB MOV DL,AL MOV AH,02H INT 21H LOOP LOOP1 MOV DL,'H' MOV AH,02H INT 21H MOV AH,4CH INT 21HCODE ENDS END START2014/066例:從自然數(shù)1開始累加,直到累加和大于1000為止,統(tǒng)計被累加的自然數(shù)的個數(shù),并把統(tǒng)計的個數(shù)送入n單元,把累加和送入sum單

溫馨提示

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

最新文檔

評論

0/150

提交評論