程序設計課件_第1頁
程序設計課件_第2頁
程序設計課件_第3頁
程序設計課件_第4頁
程序設計課件_第5頁
已閱讀5頁,還剩189頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

程序設計課件1匯編語言程序的格式匯編語言程序的上機過程偽指令語句匯編語言程序設計的基本方法本章內容匯編語言程序的格式匯編語言程序的上機過程偽指令2了解匯編語言程序的基本格式,及其上機過程。熟練掌握數(shù)據(jù)定義偽指令、段定義偽指令、符號定義偽指令、過程定義偽指令。熟練掌握匯編語言程序設計的一般步驟以及順序程序、分支程序、循環(huán)程序、子程序設計的方法。學習目的了解匯編語言程序的基本格式,及其上機過程。熟練掌握數(shù)35.1

匯編語言與匯編程序5.2

偽指令5.3

匯編語言屬性操作符程序設計5.4

匯編語言程序上機過程5.5

匯編語言程序與DOS接口5.6

匯編語言程序設計的基本技術5.1匯編語言與匯編程序5.2偽指令5.3匯編語言屬性45.1匯編語言與匯編程序5.1.1匯編語言的基本概念1機器語言與匯編語言(MachineLanguageandAssemblyLanguage)

由二進制代碼0,1表示的指令稱為機器指令,相應的程序稱為機器語言程序

。用指令助記符表示的指令稱為匯編語言指令,對應的程序稱為匯編語言程序。5.1匯編語言與匯編程序5.1.1匯編語言的基本概念5

例5-1將4位二進制數(shù)轉換為ASCII碼字符。當數(shù)在0000B-1001B時,對應的ASCII碼為‘0’~‘9’;當數(shù)在1010B~1111B時,對應的ASCII碼為‘A’~‘F’。設待轉換的數(shù)據(jù)已在累加器AL中(低4位)。

編制的機器語言程序與匯編語言程序如下表所示。例5-1將4位二進制數(shù)轉換為ASCII碼6地址機器代碼對應的匯編指令E380:0000240FANDAL,0FHE380:00023C0ACMPAL,0AHE380:00047202JBNUME380:00060407ADDAL,07HE380:00080430NUM:ADDAL,30HE380:000AC3RET地址機器代碼對應的匯編指令E380:000024072.匯編語言與高級語言(AssemblyLanguageandComputer-independentLanguage)

匯編語言是一種依賴于計算機微處理器的語言

匯編語言一般不具有通用性和可移植性

進行匯編語言程序設計必須熟悉機器的硬件資源和軟件資源

高級語言是面向過程的語言

高級語言具有很好的通用性和可移植性

2.匯編語言與高級語言(AssemblyLanguage85.1.2匯編語言源程序的組成1.匯編語言源程序的結構(ProgramStructure)例5-2完整的匯編語言源程序示例。NAMEHEXTOASC;*****************************************************DATASEGMENT;數(shù)據(jù)段定義開始HEXDB5AHASCDB2DUP(?)DATAENDS;數(shù)據(jù)段定義結束;*****************************************************5.1.2匯編語言源程序的組成1.匯編語言源程序的結構9;*************************************************STACKSEGMENT

;堆棧段定義開始

DB256DUP('S')TOPEQU$-STACKSTACKENDS;堆棧段定義結束;*************************************************;************************************************CODESEGMENT;代碼段定義開始

ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;主程序開始;*****************************10

MOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPMOVBX,OFFSETASCMOVAL,HEXMOVAH,ALMOVCL,4SHRAL,CLCALLNEAR

PTRCONVERT

…HLT;主程序結束

MOVDS,AX11CONVERTPROC;過程(子程序)定義開始

ANDAL,0FHCMPAL,10JBNUMADDAL,7NUM:ADDAL,'0'RETCONVERTENDP;過程(子程序)定義結束CODEENDS;代碼段定義結束;*************************************************

ENDSTART;程序結束CONVERTPROC12要點總結:匯編語言源程序由段結構組成。一個段由“SEGMENT”(段定義開始)和“ENDS”(段定義結束)語句來定義。每個段都有唯一的段名,前后一致。不同段的段名不能相同。數(shù)據(jù)段、堆棧段和代碼段的作用各不相同。各個段都由一系列語句組成。語句包括指令語句和偽指令語句。要點總結:匯編語言源程序由段結構組成。一個段由“SEGME132.匯編語言的語句格式(StatementFormats)匯編語言程序的每行語句由1~4個部分組成。指令語句和偽指令語句在格式上稍有區(qū)別,指令語句的標號后有冒號“:”,而偽指令語句的標號后則沒有冒號。指令語句的格式為[LABEL:]OPERATION[OPERAND][;COMMENT]標號域

指令助記符域

操作數(shù)域

注釋域2.匯編語言的語句格式(StatementFormats)14偽指令語句的格式為[LABEL]OPERATION[OPERAND][;COMMENT]標號域

偽指令助記符域

操作數(shù)域

注釋域注:

指令助記符前面還可以有[前綴]。

匯編語言程序語句中的四項,均可以用大寫、小寫或混合編寫。

語句的各部分之間至少用一個空格分開偽指令語句的格式為[LABEL]OPERATION153.標號(Label)(含數(shù)據(jù)變量標號和程序位置標號)標號是一個自行設計的標識符或名稱,最多可由31個字母、數(shù)字和特別字符(?、@、-、$)等組成。但

不能用數(shù)字開頭。

不能為匯編語言的保留字。注:保留字指有專門用途的字符或字符串,如CPU的寄存器名、指令助記符、偽指令助記符等。3.標號(Label)(含數(shù)據(jù)變量標號和程序位置標號)標號16(1)數(shù)據(jù)變量標號的三種屬性①

段值:即所在段的段地址。②

偏移量:即數(shù)據(jù)變量所在位置的地址與其段地址之差值。③

類型:指該數(shù)據(jù)變量是字節(jié)、字還是雙字。(2)程序位置標號的兩種類型屬性①

NEAR——段內調用或轉移標號。②

FAR——段間調用或轉移標號。(1)數(shù)據(jù)變量標號的三種屬性①段值:即所在段的段地址。174.操作數(shù)域(OperandFields)操作數(shù)可以是常數(shù)、變量、標號、寄存器名或表達式(1)常數(shù):二進制、八進制、十進制、十六進制或ASCII碼字符串。(2)寄存器名、標號、變量

指令:

MOVAL,HEX中,AL為寄存器名,HEX為變量名。4.操作數(shù)域(OperandFields)操作數(shù)可以是常18(3)表達式:由運算符連接起來的式子叫表達式,按一定的規(guī)則對表達式進行運算后得到一個數(shù)值或一個地址。

表達式可分為算術表達式、邏輯表達式、關系運算表達式、分析運算表達式和合成運算表達式。(3)表達式:由運算符連接起來的式子叫表達式,按一定的規(guī)則19用算術運算符+、-、*、/和MOD連接的表達式。①

算術表達式用邏輯運算符AND、OR、XOR和NOT連接的表達式。②

邏輯表達式例如:5*8+30,128/100,206MOD128等算術表達式。

用算術運算符+、-、*、/和MOD連接的表達式。①算術表達20邏輯表達式的結果可能為8位或16位二進制數(shù),視參加運算的數(shù)的字長而定。

邏輯運算指令中可以包含有邏輯表達式,如指令ANDAL,10101010BAND0FH

左邊第一個AND為邏輯運算指令,第二個AND為邏輯運算符,BAND0FH為邏輯表達式,其結果在匯編時即已確定,為B,故上述指令等價于ANDAL,00001010B邏輯表達式的結果可能為8位或16位二進制數(shù),視參加運21用EQ、NE、LT、GT、GE和LE連接的表達式。若條件成立,其值為1,否則為0。③

關系運算表達式分析運算表達式把存儲器操作數(shù)分解為幾個組成部分;而合成運算式是把這些組成部分綜合為存儲器操作數(shù)。④

分析運算表達式和合成運算表達式例如:指令MOVBX,5GT3

等價于

MOVBX,0FFFFH

用EQ、NE、LT、GT、GE和LE連接的表達式。若條件成立22

分析運算表達式和合成運算表達式的操作對象都為存儲器操作數(shù)。

存儲器操作數(shù)表示變量、符號地址、存儲單元等與存儲器地址有關的量。

分析運算表達式把存儲器操作數(shù)分解為幾個部分,如分解出段值、偏移量、類型等;合成運算表達式則把這些組成部分綜合為存儲器操作數(shù)。分析運算表達式和合成運算表達式的操作對象都為存儲器操235.2偽指令指令語句:匯編程序把它們翻譯成機器代碼,命令8086執(zhí)行對應操作。偽指令語句:匯編程序并不把它們翻譯成機器代碼,只是用來指示、引導匯編程序在匯編時做一些操作,它本身不占用存儲單元。5.2偽指令指令語句:匯編程序把它們翻譯成機器代碼,命令8245.2.1段定義偽指令SEGMENT/ENDS1.SEGMENT和ENDS

定義方式:[段名]SEGMENT[定位方式][組合方式][類別名]

語句1

語句2…[段名]ENDS5.2.1段定義偽指令SEGMENT/ENDS1.S25

段名是賦予該段的一個名稱,SEGMENT與ENDS成對出現(xiàn),且前后的段名要相同,段名的取法與文件名、標號及變量名等相同。(1)段名段名是賦予該段的一個名稱,SEGMENT與END26LINK程序除完成段與段的聯(lián)合操作以外,還把聯(lián)合后得到的各個段互相銜接起來,段與段的銜接方式叫做定位方式,共4種。(2)定位方式LINK程序除完成段與段的聯(lián)合操作以外,還把聯(lián)合后得到的各個27③

WORD(字):表示段從地址是一個最低位為0的二進制數(shù)開始。④

PAGE(頁):表示段從一個頁的邊界,即十六進制數(shù)表示地址時最低兩位均為0處開始。①

PARA(缺省):表示段從一個節(jié)的邊界,即用十六進制數(shù)表示地址時最低位為0處開始。②

BYTE(字節(jié)):表示段可從任一地址開始。③WORD(字):表示段從地址是一個最低位為0的二進制數(shù)28

BYTE XXXXXXXXXXXXXXXXXXXXBWORD XXXXXXXXXXXXXXXXXXX0

BPARA XXXXXXXXXXXXXXXX0

0

0

0BPAGE XXXXXXXXXXXX0

0

0

00

0

0

0BX表示可取0或1定位類型

址BYTE XXXXXXXXXXXXXXXX292.GROUP偽指令格式:[組名]GROUP[段名][,…]功能:用來把模塊中若干不同名的段集合成一個組,使其裝入同一個物理段中,組內各段之間的跳轉可視為段內跳轉。注:組名與段名是一樣的取名規(guī)則,是代表該組的段地址,格式中的段名也可用表達式SEG[變量]或SEG[標號]。2.GROUP偽指令格式:[組名]GROUP[305.2.2位置計數(shù)器$和定位偽指令ORG1.位置計數(shù)器$匯編程序專門設置了一個表示當前位置的計數(shù)器,稱位置計數(shù)器$。正常情況下,匯編程序每掃描一個字節(jié),位置計數(shù)器的值便加1。

語句:TOPEQU$-STACK含義:當前位置計數(shù)器的值$減去STACK代表的起始位置的值,然后把兩者的差值賦予符號常量TOP。語句:JMP$

含義:程序跳轉到本條指令執(zhí)行。5.2.2位置計數(shù)器$和定位偽指令ORG1.位置計數(shù)31格式:ORG[數(shù)據(jù)表達式]功能:把位置計數(shù)器的值設置為表達式的值。ORG后面的一條指令性語句或數(shù)據(jù)區(qū)定義命令即從指定的位置處進行匯編。ORG偽指令用來指出其后的程序段或數(shù)據(jù)塊存放的起始地址的偏移量。2.ORG偽指令格式:ORG[數(shù)據(jù)表達式]功能:把位置計數(shù)器的值設置為32格式:ASSUME[段寄存器]:[段名],[段寄存器]:[段名],…功能:用于告知匯編程序,段寄存器CS、DS、ES和SS的內容將被設定為那些段或組的段址。5.2.3段尋址偽指令ASSUME格式:ASSUME[段寄存器]:[段名],功能:用于告知33注:(1)段名可以是已定義過的任何段名或組名,也可以是表達式SEG[變量]或SEG[標號],還可以是NOTHING。 (2)除CS外,DS、ES、SS的設置必須通過指令性語句來完成。注:(1)段名可以是已定義過的任何段名或組名,也可以是表達34例

CODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,ES:NOTHINGMOV AX,DATA MOVDS,AX;設置DS MOVAX,STACK MOV SS,AX;設置SS

CODE ENDS例CODE SEGMENT355.2.4

過程定義偽指令PROC/ENDP

過程即是子程序。匯編語言規(guī)定必須對過程進行定義,以確定過程的三種屬性。過程的屬性確定之后,就可對調用指令CALL進行正確匯編,決定是產(chǎn)生近調用指令還是遠調用指令。

1.過程的三種屬性①段屬性:過程所在段的段地址。

②偏移量屬性:過程所處位置的段內偏移地址。③類型屬性(NEAR或FAR)。過程為NEAR或FAR類型。5.2.4過程定義偽指令PROC/ENDP過程即36使用格式:過程名

PROCNEAR/FAR RET

過程名

ENDP…NEAR近過程。該過程與調用指令CALL處在同一個代碼段中(段名相同)。FAR

遠過程。該過程與調用指令CALL處在不同的代碼段中(段名不同)。2.過程的定義使用格式:過程名PROCNEA37功能:把具有一定功能的程序段設計成為一個過程(子程序),便于實現(xiàn)模塊化的程序設計。注:(1)CALL指令中過程名起著標號的作用。有段屬性、偏移量屬性和類型屬性(NEAR和FAR)。(2)子程序中至少有一個RET。過程名是為該過程指定的一個名稱,與變量、標號的定義法相同。功能:把具有一定功能的程序段設計成為一個過程(子程序),便于38任何變量均有下列三種屬性。(1)段屬性即變量所使用的段;(2)段內偏移屬性;(3)變量的類型:字節(jié)、字、雙字等。5.2.5數(shù)據(jù)定義偽指令與存儲器分配1.變量的三種屬性DB—定義字節(jié)型變量,每個變量分配1個存儲單元DW--定義字型變量,每個變量分配2個存儲單元DD--定義雙字型變量,每個變量分配4個存儲單元任何變量均有下列三種屬性。(1)段屬性即變量所使用的段;(392.變量定義及存儲器申請偽指令DB/DW/DD

(1)格式1:[變量名]{DB/DW/DD}表達式功能:定義一變量,并為其分配一定數(shù)量的存儲單元,變量的初值由表達式的值指定。若初值可任意,則用問號(?)表示。變量名相當于符號地址,可省

。HEXDB

5AH;

定義字節(jié)變量VWORDDW

1234H;定義字變量2.變量定義及存儲器申請偽指令DB/DW/DD(1)格式40注:在存放字變量時,低字節(jié)在前,高字節(jié)在后。BUFFERDW1,0,-1

;定義了三個字單元

STRDB‘Program’;定義了一個字符串

注:在存放字符串時,存儲的是字符的ASCII碼。HEX_OFFDWHEX

;定義了一個字單元,其初值為已定義變量HEX的偏移量。

DVARDD12345678H;定義了一個雙字單元

注:在存放字變量時,低字節(jié)在前,高字節(jié)在后。BUFFER41ASCDB2DUP(?)功能:分配2個字節(jié)單元,初值任意

BUFDW100DUP(0)功能:分配100個字單元,初值為0ZIPDB3DUP(0,2DUP(1))功能:存儲單元依次初始化為:0,1,1,0,1,1,0,1,1。(2)格式2:[變量名]{DB/DW/DD}DUP

表達式ASCDB2DUP(?)(2)格式42變量經(jīng)過定義及存儲器申請之后,在程序中即可像高級語言一樣使用。

MOVAL,HEX;取變量HEX的內容送AL寄存器。MOVASC[BX],AL

;取變量ASC的偏移地址,再與BX寄存器的內容相加,得到存儲器操作數(shù)的有效地址EA,再將AL寄存器的內容送入該單元。

3.變量的使用變量經(jīng)過定義及存儲器申請之后,在程序中即可像高級語言431.EQU偽指令格式:符號名

EQU數(shù)值表達式功能:為常量、變量、表達式或其他符號定義一個名字,但不申請分配內存。如:THREEEQU3TOPEQU$-STACK5.2.7符號定義偽指令(EQU、LABEL)1.EQU偽指令格式:符號名EQU數(shù)值表達式功能44“=”偽操作與EQU相似,其區(qū)別是前者可重復定義而后者不能。使用EQU可使程序簡單明了和便于修改。注:

EQU可用PURGE解除?!?”偽操作與EQU相似,其區(qū)別是前者可重復定義而后者不452.LABEL偽指令格式:變量名/標號

LABEL[類型]功能:為當前存儲單元定義一個指定類型的變量名或標號,其類型為BYTE、WORD、DWORD、結構名、記錄名、NEAR和FAR。2.LABEL偽指令格式:變量名/標號LA46BYTE_ARRAYLABELBYTE;定義字節(jié)型數(shù)

組標號WORD_ARRAYDW50DUP(?);定義字型數(shù)組如定義不同類型的數(shù)組:程序中的用法:

MOVAL,BYTE_ARRAY[2];將2號字節(jié)單元內容送ALMOVAX,WORD_ARRAY[0];將0號字單元內容送AXBYTE_ARRAYLABELBYTE;定義字節(jié)型47又如:TRANS_NLABELNEARTRANSPROCFAR這樣TRANS不僅適合遠程調用和轉移,也可用新名TRANS_N適合近程調用和轉移。

又如:TRANS_NLABELNEAR485.3匯編語言屬性操作符1.分析操作符(數(shù)值返回操作符)

5.3.1分析操作符(SEG、OFFSET、TYPE、LENGTH、SIZE)返回的是變量或標號的段地址,偏移地址及類型的屬性值。格式:分析運算符

變量或標號其運算的結果為一常數(shù)5.3匯編語言屬性操作符1.分析操作符(數(shù)值返回操作符)49(1)SEG——取段址算符(2)OFFSET——取偏移地址算符功能:分離出該變量或標號的段址

如:MOVAX,SEGBUF功能:分離出該變量或標號的偏移地址

如:MOVSI,OFFSETBUF(1)SEG——取段址算符(2)OFFSET——取偏移50(3)TYPE——取類型算符(4)LENGTH——取變量所含元素的個數(shù)功能:分離出該變量所含元素的個數(shù)。功能:分離出該變量或標號的類型的字節(jié)數(shù)。

變量類型為BYTE、WORD和DWORD時,返回的值分別為1、2和4;

標號類型為NEAR或FAR時,則返回-1或-2。(3)TYPE——取類型算符(4)LENGTH——取變51注意:在定義該變量時,數(shù)據(jù)定義偽指令后面的第一個表達式的形式為“nDUP(表達式)”時,取值為n,否則為1。如:

BUF1DB100DUP(0)BUF2DW10,5DUP(2)BUF3DD5DUP(1,2DUP(0))則

LENGTHBUF1=100,LENGTHBUF2=1LENGTHBUF3=5。注意:在定義該變量時,數(shù)據(jù)定義偽指令后面的第一個表達式的形式52(5)SIZE——取變量所含存儲區(qū)的總字節(jié)數(shù)。功能:

SIZE=LNGTH*TYPE SIZEBUF1=100(因為TYPEBUF1=1) SIZEBUF2=2(因為TYPEBUF2=2) SIZEBUF3=20(因為TYPEBUF3=4)(5)SIZE——取變量所含存儲區(qū)的總字節(jié)數(shù)。功能:53格式:

類型

PTR表達式類型:表達式:是變量、標號或數(shù)值

變量的類型有:BYTE、WORD和DWORD;

標號的類型有:NEAR和FAR;

結構名稱*5.3.2屬性修改操作符(PTR、THIS、SHORT)1.PTR操作符

PTR操作符用于暫時修改變量或標號的原有屬性。

格式:類型PTR表達式類型:表達54功能:PTR把它左邊的屬性指派給它右邊的變量、標號或數(shù)值,使之產(chǎn)生一個新的存儲器地址操作數(shù)。如:(1)INCBYTEPTR[BX](2)ADDDX,WORDPTRFOOB[20]

新存儲器操作數(shù)的段地址和段內偏移量與PTR運算符右邊的操作數(shù)的對應量相同。

PTR給已分配的存儲器一個另外的定義但并不重新分配存儲器。功能:PTR把它左邊的屬性指派給它右邊的變量、標號或數(shù)值,使552.SHORT操作符SHORT用于條件轉移、循環(huán)和調用指令中,指出其轉移的相對位移量不超過一個字節(jié)所能表達的范圍。2.SHORT操作符SHORT用于條件轉移、循環(huán)和調用指563.THIS操作符

THIS操作符與PTR操作符有類似的功能,但新的屬性放在THIS的右邊。

格式:

THIS類型/距離其中類型是BYTE、WORD和DWORD,距離是NEAR和FAR屬性。功能:與PTR類似建立一個新的存儲器地址操作數(shù),但不分配存儲器,其類型由THIS指定。(1)FOOBEQUTHISBYTE(2)FAR-OUTEQUTHISFAR如:3.THIS操作符THIS操作符與PTR操作57

5.4匯編語言程序的上機過程

5.4.1匯編語言程序上機運行的軟件環(huán)境

DOS操作系統(tǒng)下,編輯、修改和運行匯編語言程序,需要用文本編輯軟件、宏匯編程序、連接程序和調試程序。

文本編輯軟件:EDIT.EXE等②

宏匯編程序:MASM.EXE,TASM.EXE等③

連接程序:LINK.EXE,TLINK.EXE等④

調試程序:CV.EXE,TD.EXE等

5.4匯編語言程序的上機過程5.4.1匯編語言程585.4.2源程序的編輯與匯編1.編輯源程序

C:\ASM>EDITHEXTOASC.ASM(回車)2.匯編源程序

C:\ASM>TASMHEXTOASC(回車)

在匯編中,如果有語法錯誤,會給出提示信息,指出錯誤的類型、行號。當匯編無錯之后,會自動生成目標文件(文件擴展名為OBJ)。注:待編輯的文件擴展名必須為

ASM。5.4.2源程序的編輯與匯編1.編輯源程序C:\AS595.4.3目標程序的連接C:\ASM>TLINKHEXTOASC(回車)連接成功后,將生成可執(zhí)行程序HEXTOASC.EXE。5.4.4程序的調試與運行1.調試可執(zhí)行程序

利用TurboDebuger(TD)對可執(zhí)行程序進行調試,以檢查程序可能存在的各種錯誤:C:\ASM>TDHEXTOASC.EXE(回車)5.4.3目標程序的連接C:\ASM>TLINKH60程序在存儲區(qū)中存放的邏輯地址源程序部分程序執(zhí)行后各寄存器、標志位的結果數(shù)據(jù)段中存放的40個“A”及對應的ASCII碼DEBUG調試環(huán)境如下:程序在存儲區(qū)中存放的邏輯地址源程序部分程序執(zhí)行后各寄存器、標612.運行可執(zhí)行程序

C:\ASM>HEXTOASC(回車)2.運行可執(zhí)行程序C:\ASM>HEXTOASC(回車)625.5匯編語言程序設計的基本技術

5.5.1簡單程序設計例6-3編寫程序段,完成下面公式的計算(其中:變量X和Y是32位無符號數(shù),變量A,B和Z是16位無符號數(shù)):(X-Y-29)/Z的商→A,(X-Y-29)/Z的余數(shù)→BDATASEGMENTXDD453921F0HYDD123A6825HZDW0A86CHADW?BDW?DATAENDS定義數(shù)據(jù)段:5.5匯編語言程序設計的基本技術5.5.1簡單程序63CODESEGMENT…MOVAX,WORDPTRX;取X的低位字

MOVDX,WORDPTRX+2;取X的高位字

SUBAX,WORDPTRY;與Y的低位字相減

SBBDX,WORDPTRY+2;與Y的高位字相減,并考慮低位的借位

SBBAX,29D;結果的低位與29D相減

SBBDX,0;可能產(chǎn)生借位,再減去借位

DIVZ;32位無符號數(shù)(DX:AX)除以16位無符號數(shù)Z

MOVA,AX;商在AX中,保存商

MOVB,DX;余數(shù)在DX中,保存余數(shù)

…CODEENDS定義代碼段:CODESEGMENT定義代碼段:64程序中根據(jù)各種可能出現(xiàn)的情況及相應的處理方法分成若干支路,運行時,根據(jù)不同情況有選擇地執(zhí)行相應處理程序。例5-6試編寫程序段,實現(xiàn)符號函數(shù)。

當x>0時當x=0時當x<0時5.5.2分支程序設計程序中根據(jù)各種可能出現(xiàn)的情況及相應的處理方法分成若干支路,運65相應的程序段為;SIGN:MOVAX,BUFFER;(BUFFER)=XANDAX,AX;做一次“與”運算,以便把X

;的特征反映到標志位

MOVBX,0;預置X=0的標志0到BX JENEXT;若X確實為0,則轉NEXT JNSPLUS;X為正數(shù),則轉PLUSMOVBX,-1;X為負數(shù),則-1送BXJMPNEXTPLUS:MOVBX,1NEXT:…

…相應的程序段為;SIGN:MOVAX,BU66例5-7在數(shù)據(jù)段中定義了256個子程序的入口地址(段地址:偏移地址),試根據(jù)AL中的值,決定調用256個子程序中的哪一個。

分析:每個子程序的入口地址占用4個字節(jié),需將AL的值乘以4,再加上入口地址表首的偏移地址,即可得到某子程序入口地址在表中的偏移地址,將該地址送入BX,利用段間間接調用指令實現(xiàn)子程序調用。這種處理方法,類似于第9章中將要介紹的中斷向量表的處理。

BX=入口地址表首偏移地址+AL*4例5-7在數(shù)據(jù)段中定義了256個子程序的入口地址(段地址67DATASEGMENTTABADDDDSUB0;0#子程序入口地址

DDSUB1;1#子程序入口地址……

DDSUB255;255#子程序入口地址DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSDATASEGMENT68CODE1SEGMENT;代碼段CODE1實現(xiàn)查表轉移的程序段

ASSUMECS:CODE1,DS:DATA,SS:STACK……XORAH,AH;AH清0

MOVCL,2SHLAX,CL;AX左移2次相當于乘以4

MOVBX,OFFSETTABADD;取表首的偏移地址

ADDBX,AX;加上AL*4CALLDWORDPTR[BX];段間間接調用子程序……CODE1ENDSCODE1SEGMENT69;代碼段CODE2定義256個子程序(過程):CODE2SEGMENTASSUMECS:CODE2SUB0PROCFAR……RETSUB0ENDPSUB1PROCFAR……RETSUB1ENDP……SUB255PROCFAR……RETSUB255ENDPCODE2ENDS;代碼段CODE2定義256個子程序(過程):70一段程序有時重復執(zhí)行多次,就牽涉到循環(huán)程序結構,其組成部分為:1.循環(huán)體即要求重復執(zhí)行的程序段部分,包括循環(huán)工作部分和循環(huán)控制部分。2.循環(huán)初態(tài)循環(huán)開始時往往要置初態(tài),賦初值,包括循環(huán)工作部分初態(tài)和結束條件初態(tài)。5.5.3循環(huán)程序設計一段程序有時重復執(zhí)行多次,就牽涉到循環(huán)程序結構,其組成部分為713.循環(huán)結束條件在循環(huán)程序中必須給出循環(huán)結束條件,否則就會進入死循環(huán),結束條件有好多種,最常見的有:(1)用計數(shù)器控制循環(huán)(2)按問題的條件控制循環(huán)(3)用開關量控制循環(huán)(4)多重循環(huán)3.循環(huán)結束條件在循環(huán)程序中必須給出循環(huán)結束條件,否則就72例5-8

分類統(tǒng)計字數(shù)組ARRAY中正數(shù)、負數(shù)和零的個數(shù),并分別存入內存字變量POST、NEGA和ZERO中,數(shù)組元素個數(shù)保存在數(shù)組的第一個字中。

分析:將字變量與0比較,然后判斷是大于0(JG)、等于0(JE)還是小于0(JL),以分別對相應的計數(shù)器加1。例5-8分類統(tǒng)計字數(shù)組ARRAY中正數(shù)、負數(shù)和零的個數(shù),73

DATASEGMENTARRAYDW8;元素個數(shù)

DW230,-1437,26,-31,0,3458,0,10POSTDW0NEGADW0ZERODW0DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXXORAX,AX;用AX作為正數(shù)的計數(shù)器

XORBX,BX;用BX作為負數(shù)的計數(shù)器

XORDX,DX;用DX作為零的計數(shù)器DATASEGMENT74

MOVCX,ARRAY;用CX來進行循環(huán)計數(shù)

JCXZDONE;考慮數(shù)組的元素個數(shù)為0的情況

LEADI,ARRAY+2;用指針DI來訪問整個數(shù)組AGAIN:CMPWORDPTR[DI],0;與0做比較

JGHIGH;大于0,為正數(shù)

JEEQUAL;等于0

INCBX;小于0,為負數(shù),負數(shù)個數(shù)增1

JMPNEXTHIGH:INCAX;正數(shù)個數(shù)增1

JMPNEXTEQUAL:INCDX;0的個數(shù)增1NEXT:INCDIINCDILOOPAGAINMOVCX,AR75DONE:MOVPOST,AX;把各類的統(tǒng)計數(shù)保存到內存單元中

MOVNEGA,BXMOVZERO,DXMOVAX,4C00H;結束程序返回DOSINT21HCODEENDSENDSTARTDONE:MOVPOST,AX76

例5-9統(tǒng)計字變量VAL中0和1的個數(shù),并將統(tǒng)計結果分別送字單元X和Y中。分析:每次將最高位移入CF中進行測試,若為0,則X單元加1;若為1,則Y單元加1。一個字有16位,故有16次循環(huán)。

例5-9統(tǒng)計字變量VAL中0和1的個數(shù),77程序段如下:

MOVCX,16;16次循環(huán)

MOVSI,0;SI中存放0的個數(shù)

MOVDI,0;DI中存放1的個數(shù)

MOVAX,VALAGAIN:SHLAX,1JCNOZERO;為1,轉走

INCSI;為0,SI加1

JMPNEXTNOZERO:INCDI;為1,DI加1NEXT:LOOPAGAINMOVX,SIMOVY,DI程序段如下:785.6.4子程序設計

子程序是程序設計中經(jīng)常使用的程序結構,通過把一些固定的、經(jīng)常使用的功能做成子程序的形式,可以使源程序及目標程序大大縮短,提高程序設計的效率和可靠性。

在主程序與子程序中經(jīng)常要進行參數(shù)傳遞。參數(shù)傳遞一般有三種方法:①

利用寄存器。這是一種最常見方法,把所需傳遞的參數(shù)直接放在主程序的寄存器中傳遞給子程序。②

利用存儲單元。主程序把參數(shù)放在公共存儲單元,子程序則從公共存儲單元取得參數(shù)。③

利用堆棧。主程序將參數(shù)壓入堆棧,子程序運行時則從堆棧中取參數(shù)。5.6.4子程序設計子程序是程序設計中79例5-10編寫一個將單字節(jié)的二進制數(shù)轉換成BCD碼數(shù)的程序,再將對應的十進制數(shù)位轉換成ASCII碼字符串,在顯示器上顯示出來。

分析:設單字節(jié)二進制數(shù)存放在NUMBIN單元。利用除法實現(xiàn)轉換。第一步,將該數(shù)除以100,商即為BCD碼數(shù)的百位,保留第一步所得余數(shù)。第二步,將第一步所得余數(shù)再除以10,商即為BCD碼數(shù)的十位,余數(shù)即為BCD碼數(shù)的個位。第三步,將BCD碼數(shù)的百位、十位和個位分別加上30H,即為它們的ASCII碼。第四步,將ASCII碼字符串存入一個緩沖區(qū),然后調用DOS功能調用INT21H的09H號功能即可顯示該字符串。例5-10編寫一個將單字節(jié)的二進制數(shù)轉換成BCD碼數(shù)的程80DATASEGMENTNUMBINDB0E7H;待轉換的單字節(jié)二進制數(shù)STRINGDB10DUP(20H);定義顯示緩沖區(qū)

DB0DH,0AH;定義回車換行符

DB‘$’;定義結束符DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARDATASEGMENT81BEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX;置段寄存器初值

LEADI,STRINGXORAH,AH;AH清零

MOVAL,NUMBINMOVBL,100DDIVBL;AX除以BL,商在AL中,余數(shù)在AH中

CALLBCDTOASC;調用轉換程序,入口參數(shù): ;AL=BCD數(shù)

MOVAL,AH;取余數(shù)送ALXORAH,AHBEGIN:PUSHDS82

MOVBL,10DDIVBLCALLBCDTOASCMOVAL,AHCALLBCDTOASCCALLDISPASC;調用顯示程序

RETSTARTENDPBCDTOASCPROC;BCD碼到ASCII碼轉換程序

ADDAL,30HMOV[DI],AL;保存ASCII字符

INCDI;指向下一個單元

RETBCDTOASCENDPMOV83DISPASCPROC;顯示子程序

LEADX,STRINGMOVAH,09HINT21HRETDISPASCENDPCODEENDSENDBEGINDISPASCPROC84例5-11利用堆棧傳遞被加數(shù)和加數(shù),在子程序中實現(xiàn)兩個32位無符號數(shù)相加的過程,結果置于DX:AX中返回。DATASEGMENTNUM1DD01234567H;定義第一個32位數(shù),存放順序:67H,45H,23H,01HNUM2DD89ABCDEFH;定義第二個32位數(shù),存放順序:0EFH,0CDH,0ABH,89HRESULTDD(?);定義結果單元DATAENDS例5-11利用堆棧傳遞被加數(shù)和加數(shù),在子程序中實現(xiàn)兩個385STACKSEGMENTPARASTACK'STACK'DB100DUP(?)STACKENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AXSTACKSEGMENTPARASTACK86

MOVBX,OFFSETNUM1MOVAX,[BX];取第一個數(shù)的低字(4567H)PUSHAX;壓入堆棧

MOVAX,[BX+2];取第一個數(shù)的高字(0123H)PUSHAX;壓入堆棧

MOVAX,[BX+4];取第二個數(shù)的低字(0CDEFH)PUSHAX;壓入堆棧

MOVAX,[BX+6];取第二個數(shù)的高字(89ABH)PUSHAX;壓入堆棧

CALLADDPROC;調用過程MOVBX,OFFS87

MOVBX,OFFSETRESULT;保存結果

MOV[BX],AXMOV[BX+2],DXRETSTARTENDPMOVBX,OF88ADDPROCPROC;32位無符號數(shù)相加的過程

PUSHBP;保護BPMOVBP,SP;將當前的堆棧指針SP送BPMOVAX,[BP+10];取第一個數(shù)的低字

MOVDX,[BP+8];取第一個數(shù)的高字

ADDAX,[BP+6];與第二個數(shù)的低字相加

ADCDX,[BP+4];與第二個數(shù)的高字相加,并

考慮低字相加

;的進位

POPBP;恢復BPRET8;返回,并使SP再加8,以丟棄堆棧中參數(shù)ADDPROCENDPCODE ENDSENDBEGINADDPROCPROC89

設被加數(shù)為A,加數(shù)為B,先壓入A的低字,再壓入A的高字;然后再壓入B的低字和高字。主程序在執(zhí)行CALL指令之前的堆棧情況如下圖(a)所示.

進入子程序之后,SP減2,將CALL指令的下一條指令的返回地址壓棧(因是近調用,只存放偏移地址)。執(zhí)行PUSHBP指令之后,SP再減2。當把SP賦給BP時,BP指向了堆棧的棧頂,而BP+4則指向了參數(shù)區(qū),此時堆棧的情況如下圖(b)所示。圖中SP的具體值與系統(tǒng)初始化情況有關。

設被加數(shù)為A,加數(shù)為B,先壓入A的低字,再壓入90(a)CALL指令之前的堆棧SP指針堆棧區(qū)地址堆棧區(qū)內容

SP→SS:005889ABH

SS:005ACDEFH

SS:005C0123H

SS:005E4567H棧底SS:0060/////(a)CALL指令之前的堆棧SP指針堆棧區(qū)地址堆棧區(qū)內91(b)執(zhí)行PUSHBP指令之后的堆棧SP指針堆棧區(qū)地址堆棧區(qū)內容BP=SP→SS:0054BP內容

SS:0056返回地址BP+4SS:005889ABHBP+6SS:005ACDEFHBP+8SS:005C0123HBP+10SS:005E4567H棧底SS:0060/////(b)執(zhí)行PUSHBP指令之后的堆棧SP指針堆棧區(qū)92程序設計課件93休息一下休息一下94學有所成這是你收獲的季節(jié)豐收去學有所成這是你收獲的季節(jié)95經(jīng)常不斷地學習,你就什么都知道。你知道得越多,你就越有力量StudyConstantly,AndYouWillKnowEverything.TheMoreYouKnow,TheMorePowerfulYouWillBe寫在最后經(jīng)常不斷地學習,你就什么都知道。你知道得越多,你就越有力量寫96ThankYou在別人的演說中思考,在自己的故事里成長ThinkingInOtherPeople‘SSpeeches,GrowingUpInYourOwnStory講師:XXXXXXXX年XX月XX日ThankYou97程序設計課件98匯編語言程序的格式匯編語言程序的上機過程偽指令語句匯編語言程序設計的基本方法本章內容匯編語言程序的格式匯編語言程序的上機過程偽指令99了解匯編語言程序的基本格式,及其上機過程。熟練掌握數(shù)據(jù)定義偽指令、段定義偽指令、符號定義偽指令、過程定義偽指令。熟練掌握匯編語言程序設計的一般步驟以及順序程序、分支程序、循環(huán)程序、子程序設計的方法。學習目的了解匯編語言程序的基本格式,及其上機過程。熟練掌握數(shù)1005.1

匯編語言與匯編程序5.2

偽指令5.3

匯編語言屬性操作符程序設計5.4

匯編語言程序上機過程5.5

匯編語言程序與DOS接口5.6

匯編語言程序設計的基本技術5.1匯編語言與匯編程序5.2偽指令5.3匯編語言屬性1015.1匯編語言與匯編程序5.1.1匯編語言的基本概念1機器語言與匯編語言(MachineLanguageandAssemblyLanguage)

由二進制代碼0,1表示的指令稱為機器指令,相應的程序稱為機器語言程序

。用指令助記符表示的指令稱為匯編語言指令,對應的程序稱為匯編語言程序。5.1匯編語言與匯編程序5.1.1匯編語言的基本概念102

例5-1將4位二進制數(shù)轉換為ASCII碼字符。當數(shù)在0000B-1001B時,對應的ASCII碼為‘0’~‘9’;當數(shù)在1010B~1111B時,對應的ASCII碼為‘A’~‘F’。設待轉換的數(shù)據(jù)已在累加器AL中(低4位)。

編制的機器語言程序與匯編語言程序如下表所示。例5-1將4位二進制數(shù)轉換為ASCII碼103地址機器代碼對應的匯編指令E380:0000240FANDAL,0FHE380:00023C0ACMPAL,0AHE380:00047202JBNUME380:00060407ADDAL,07HE380:00080430NUM:ADDAL,30HE380:000AC3RET地址機器代碼對應的匯編指令E380:00002401042.匯編語言與高級語言(AssemblyLanguageandComputer-independentLanguage)

匯編語言是一種依賴于計算機微處理器的語言

匯編語言一般不具有通用性和可移植性

進行匯編語言程序設計必須熟悉機器的硬件資源和軟件資源

高級語言是面向過程的語言

高級語言具有很好的通用性和可移植性

2.匯編語言與高級語言(AssemblyLanguage1055.1.2匯編語言源程序的組成1.匯編語言源程序的結構(ProgramStructure)例5-2完整的匯編語言源程序示例。NAMEHEXTOASC;*****************************************************DATASEGMENT;數(shù)據(jù)段定義開始HEXDB5AHASCDB2DUP(?)DATAENDS;數(shù)據(jù)段定義結束;*****************************************************5.1.2匯編語言源程序的組成1.匯編語言源程序的結構106;*********************

溫馨提示

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

評論

0/150

提交評論