




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
6.1匯編語言與匯編程序6.1.1匯編語言的基本概念1機器語言與匯編語言(MachineLanguageandAssemblyLanguage)
由二進制代碼0,1表示的指令稱為機器指令,相應(yīng)的程序稱為機器語言程序
。用指令助記符表示的指令稱為匯編語言指令,對應(yīng)的程序稱為匯編語言程序。
例6-1將4位二進制數(shù)轉(zhuǎn)換為ASCII碼字符。當(dāng)數(shù)在0000B-1001B時,對應(yīng)的ASCII碼為‘0’~‘9’;當(dāng)數(shù)在1010B~1111B時,對應(yīng)的ASCII碼為‘A’~‘F’。設(shè)待轉(zhuǎn)換的數(shù)據(jù)已在累加器AL中(低4位)。
編制的機器語言程序與匯編語言程序如下表所示。地址機器代碼對應(yīng)的匯編指令E380:0000240FANDAL,0FHE380:00023C0ACMPAL,0AHE380:00047202JBNUME380:00060407ADDAL,07HE380:00080430NUM:ADDAL,30HE380:000AC3RET2.匯編語言與高級語言(AssemblyLanguageandComputer-independentLanguage)
匯編語言是一種依賴于計算機微處理器的語言
匯編語言一般不具有通用性和可移植性
進行匯編語言程序設(shè)計必須熟悉機器的硬件資源和軟件資源
高級語言是面向過程的語言
高級語言具有很好的通用性和可移植性
學(xué)習(xí)匯編語言的必要性
利用匯編語言可以設(shè)計出效率極高的核心底層程序。用匯編語言編寫的程序一般比用高級語言編寫的程序執(zhí)行得快,且所占內(nèi)存較少。匯編語言程序能夠直接有效地利用機器硬件資源。學(xué)習(xí)匯編語言對于理解和掌握計算機硬件組成及工作原理是十分重要的。
6.1.2匯編語言源程序的組成1.匯編語言源程序的結(jié)構(gòu)(ProgramStructure)例6-2完整的匯編語言源程序示例。NAMEHEXTOASC;*****************************************************DATASEGMENT;數(shù)據(jù)段定義開始HEXDB5AHASCDB2DUP(?)DATAENDS;數(shù)據(jù)段定義結(jié)束;*****************************************************;*************************************************STACKSEGMENT
;堆棧段定義開始
DB256DUP('S')TOPEQU$-STACKSTACKENDS;堆棧段定義結(jié)束;*************************************************;************************************************CODESEGMENT;代碼段定義開始
ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;主程序開始
MOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPMOVBX,OFFSETASCMOVAL,HEXMOVAH,ALMOVCL,4SHRAL,CLCALLNEAR
PTRCONVERT
…HLT;主程序結(jié)束CONVERTPROC;過程(子程序)定義開始
ANDAL,0FHCMPAL,10JBNUMADDAL,7NUM:ADDAL,'0'RETCONVERTENDP;過程(子程序)定義結(jié)束CODEENDS;代碼段定義結(jié)束;*************************************************
ENDSTART;程序結(jié)束要點總結(jié):匯編語言源程序由段結(jié)構(gòu)組成。一個段由“SEGMENT”(段定義開始)和“ENDS”(段定義結(jié)束)語句來定義。每個段都有唯一的段名,前后一致。不同段的段名不能相同。數(shù)據(jù)段、堆棧段和代碼段的作用各不相同。各個段都由一系列語句組成。語句包括指令語句和偽指令語句。2.匯編語言的語句格式(StatementFormats)匯編語言程序的每行語句由1~4個部分組成。指令語句和偽指令語句在格式上稍有區(qū)別,指令語句的標(biāo)號后有冒號“:”,而偽指令語句的標(biāo)號后則沒有冒號。指令語句的格式為[LABEL:]OPERATION[OPERAND][;COMMENT]標(biāo)號域
指令助記符域
操作數(shù)域
注釋域偽指令語句的格式為[LABEL]OPERATION[OPERAND][;COMMENT]標(biāo)號域
偽指令助記符域
操作數(shù)域
注釋域
一行最多可有132個字符注:
指令助記符前面還可以有[前綴]。
匯編語言程序語句中的四項,均可以用大寫、小寫或混合編寫。
語句的各部分之間至少用一個空格分開3.標(biāo)號(Label)(含數(shù)據(jù)變量標(biāo)號和程序位置標(biāo)號)標(biāo)號是一個自行設(shè)計的標(biāo)識符或名稱,最多可由31個字母、數(shù)字和特別字符(?、@、-、$)等組成。但
不能用數(shù)字開頭。
不能為匯編語言的保留字。注:保留字指有專門用途的字符或字符串,如CPU的寄存器名、指令助記符、偽指令助記符等。(1)數(shù)據(jù)變量標(biāo)號的三種屬性①
段值:即所在段的段地址。②
偏移量:即數(shù)據(jù)變量所在位置的地址與其段地址之差值。③
類型:指該數(shù)據(jù)變量是字節(jié)、字還是雙字。(2)程序位置標(biāo)號的兩種屬性①
NEAR——段內(nèi)調(diào)用或轉(zhuǎn)移標(biāo)號。②
FAR——段間調(diào)用或轉(zhuǎn)移標(biāo)號。4.操作數(shù)域(OperandFields)操作數(shù)可以是常數(shù)、變量、標(biāo)號、寄存器名或表達式(1)常數(shù):二進制、八進制、十進制、十六進制或ASCII碼字符串。(2)寄存器名、標(biāo)號、變量
指令:
MOVAL,HEX中,AL為寄存器名,HEX為變量名。(3)表達式:由運算符連接起來的式子叫表達式,按一定的規(guī)則對表達式進行運算后得到一個數(shù)值或一個地址。
表達式可分為算術(shù)表達式、邏輯表達式、關(guān)系運算表達式、分析運算表達式和合成運算表達式。用算術(shù)運算符+、-、*、/和MOD連接的表達式。①
算術(shù)表達式用邏輯運算符AND、OR、XOR和NOT連接的表達式。②
邏輯表達式例如:5*8+30,128/100,206MOD128等算術(shù)表達式。
邏輯表達式的結(jié)果可能為8位或16位二進制數(shù),視參加運算的數(shù)的字長而定。
邏輯運算指令中可以包含有邏輯表達式,如指令A(yù)NDAL,10101010BAND0FH
左邊第一個AND為邏輯運算指令,第二個AND為邏輯運算符,10101010BAND0FH為邏輯表達式,其結(jié)果在匯編時即已確定,為00001010B,故上述指令等價于ANDAL,00001010B用EQ、NE、LT、GT、GE和LE連接的表達式。若條件成立,其值為1,否則為0。③
關(guān)系運算表達式分析運算表達式把存儲器操作數(shù)分解為幾個組成部分;而合成運算式是把這些組成部分綜合為存儲器操作數(shù)。④
分析運算表達式和合成運算表達式例如:指令MOVBX,5GT3
等價于
MOVBX,0FFFFH
分析運算表達式和合成運算表達式的操作對象都為存儲器操作數(shù)。
存儲器操作數(shù)表示變量、符號地址、存儲單元等與存儲器地址有關(guān)的量。
分析運算表達式把存儲器操作數(shù)分解為幾個部分,如分解出段值、偏移量、類型等;合成運算表達式則把這些組成部分綜合為存儲器操作數(shù)。6.2偽指令指令語句:匯編程序把它們翻譯成機器代碼,命令8086執(zhí)行對應(yīng)操作。偽指令語句:匯編程序并不把它們翻譯成機器代碼,只是用來指示、引導(dǎo)匯編程序在匯編時做一些操作,它本身不占用存儲單元。*程序分段及存儲器分配*變量定義及存儲器申請*過程定義*符號定義*程序模塊定義與通信*宏定義及宏調(diào)用*條件匯編*格式控制,列表及其他功能偽指令主要分為下列幾類:6.2.1段定義偽指令SEGMENT/ENDS1.SEGMENT和ENDS
定義方式:[段名]SEGMENT[定位方式][組合方式][類別名]
語句1
語句2…[段名]ENDS
段名是賦予該段的一個名稱,SEGMENT與ENDS成對出現(xiàn),且前面的段名要相同,段名的取法與文件名、標(biāo)號及變量名等相同。(1)段名LINK程序除完成段與段的聯(lián)合操作以外,還把聯(lián)合后得到的各個段互相銜接起來,段與段的銜接方式叫做定位方式,共4種。(2)定位方式③
WORD(字):表示段從地址是一個最低位為0的二進制數(shù)開始。④
PAGE(頁):表示段從一個頁的邊界,即十六進制數(shù)表示地址時最低兩位均為0處開始。①
PARA(缺省):表示段從一個節(jié)的邊界,即用十六進制數(shù)表示地址時最低位為0處開始。②
BYTE(字節(jié)):表示段可從任一地址開始。
BYTE XXXXXXXXXXXXXXXXXXXXBWORD XXXXXXXXXXXXXXXXXXX0
BPARA XXXXXXXXXXXXXXXX0
0
0
0
BPAGE XXXXXXXXXXXX0
0
0
00
0
0
0BX表示可取0或1定位類型
起
始
地
址(3)組合方式
程序不同模塊中具有相同性質(zhì)的段,若使用同樣的段名,則連接時就會把同名的段按照指定的方式組合起來,組合方式共有6種。表示該段與其他模塊的段沒有任何關(guān)系,每段都有自己的基址。這是缺省方式。
①
NONE(缺省)方式:③
STACK方式:
連接時把所有STACK方式的同名段連接成一個段
,運行時就是SS的裝入值,且棧指針SP指向該段的起始地址。②
PUBLIC方式:
表示該段與其他模塊中說明為PUBLIC方式的同名段互相組合成一個邏輯段,公用一個段址,運行時裝入同一個物理段中。⑤
MEMORY方式:
表示該段應(yīng)定位在所有其他段的上面,若有多個段選用MEMORY,則除第一個之外,其余段均作為COMMON處理。④
COMMON方式:
表示該段與其它模塊中所有已說明為COMMON的同名段共享相同的存儲區(qū)域,即具有相同的段起始地址,共享的長度為模塊同名段中最大長度。例:有A,B;C,A,B;A,C共7個段是3個模塊中的段,用P,C,S分別代表PUBLIC,COMMON或STACK。組合成4個新段(見下圖),新段的長度為被組合在一起的各段長度之和(用PUBLIC和STACK方式時),或是各段中最長段的長度(COMMON方式)。⑥
AT方式:
表示該段按絕對地址定位,其段地址即為其后表達式的值,位移量為0。A(P)B(C)C(S)A(P)B(C)AC(S)模塊1模塊2模塊3LINKPCSABCD連接程序的組合處理示意圖(4)類別名
是一個用單引號括起來的字符串,LINK程序把類別名相同的所有段放在連續(xù)的存儲區(qū)域內(nèi),先出現(xiàn)的在前,后出現(xiàn)的在后。例:
A SEGMENT
‘FAT’
A
B SEGMENT
‘BAZ’
E
C SEGMENT
‘BAZ’
B
D SEGMENT ‘ZOU’
C
E SEGMENT
‘FAT’
D
LINK處理前
LINK處理后2.GROUP偽指令格式:[組名]GROUP[段名][,…]功能:用來把模塊中若干不同名的段集合成一個組,使其裝入同一個物理段中,組內(nèi)各段之間的跳轉(zhuǎn)可視為段內(nèi)跳轉(zhuǎn)。注:組名與段名是一樣的取名規(guī)則,是代表該組的段地址,格式中的段名也可用表達式SEG[變量]或SEG[標(biāo)號]。6.2.2位置計數(shù)器$和定位偽指令ORG1.位置計數(shù)器$匯編程序?qū)iT設(shè)置了一個表示當(dāng)前位置的計數(shù)器,稱位置計數(shù)器$。正常情況下,匯編程序每掃描一個字節(jié),位置計數(shù)器的值便加1。
語句:TOPEQU$-STACK含義:當(dāng)前位置計數(shù)器的值$減去STACK代表的起始位置的值,然后把兩者的差值賦予符號常量TOP。語句:JMP$
含義:程序跳轉(zhuǎn)到本條指令執(zhí)行。格式:ORG[數(shù)據(jù)表達式]功能:把位置計數(shù)器的值設(shè)置為表達式的值。ORG后面的一條指令性語句或數(shù)據(jù)區(qū)定義命令即從指定的位置處進行匯編。2.ORG偽指令格式:ASSUME[段寄存器]:[段名],[段寄存器]:[段名],…功能:用于告知匯編程序,段寄存器CS、DS、ES和SS的內(nèi)容將被設(shè)定為那些段或組的段址。6.2.3段尋址偽指令A(yù)SSUME注:(1)段名可以是已定義過的任何段名或組名,也可以是表達式SEG[變量]或SEG[標(biāo)號],還可以是NOTHING。 (2)除CS外,DS、ES、SS的設(shè)置必須通過指令性語句來完成。例
CODE SEGMENTASSUMECS:CODE,DS:DATA,SS:STACK,ES:NOTHINGMOV AX,DATA MOV DS,AX;設(shè)置DS MOV AX,STACK MOV SS,AX;設(shè)置SS
CODE ENDS6.2.4過程定義偽指令PROC/ENDP
過程即是子程序。匯編語言規(guī)定必須對過程進行定義,以確定過程的三種屬性。過程的屬性確定之后,就可對調(diào)用指令CALL進行正確匯編,決定是產(chǎn)生近調(diào)用指令還是遠調(diào)用指令。
1.過程的三種屬性①段屬性:過程所在段的段地址。②偏移量屬性:過程所處位置的段內(nèi)偏移地址。③類型屬性(NEAR或FAR)。過程為NEAR或FAR類型。使用格式:過程名
PROCNEAR/FAR RET
過程名
ENDP…NEAR近過程。該過程與調(diào)用指令CALL處在同一個代碼段中(段名相同)。FAR
遠過程。該過程與調(diào)用指令CALL處在不同的代碼段中(段名不同)。2.過程的定義功能:把具有一定功能的程序段設(shè)計成為一個過程(子程序),便于實現(xiàn)模塊化的程序設(shè)計。注:(1)CALL指令中過程名起著標(biāo)號的作用。有段屬性、偏移量屬性和類型屬性(NEAR和FAR)。(2)子程序中至少有一個RET。過程名是為該過程指定的一個名稱,與變量、標(biāo)號的定義法相同。任何變量均有下列三種屬性。(1)段屬性即變量所使用的段;(2)段內(nèi)偏移屬性;(3)變量的類型:字節(jié)、字、雙字等。6.2.5數(shù)據(jù)定義偽指令與存儲器分配1.變量的三種屬性DB—定義字節(jié)型變量,每個變量分配1個存儲單元DW--定義字型變量,每個變量分配2個存儲單元DD--定義雙字型變量,每個變量分配4個存儲單元2.變量定義及存儲器申請偽指令DB/DW/DD
(1)格式1:[變量名]{DB/DW/DD}表達式功能:定義一變量,并為其分配一定數(shù)量的存儲單元,變量的初值由表達式的值指定。若初值可任意,則用問號(?)表示。變量名可省
。HEXDB
5AH;
定義字節(jié)變量VWORDDW
1234H;定義字變量注:在存放字變量時,低字節(jié)在前,高字節(jié)在后。BUFFERDW1,0,-1
;定義了三個字單元
STRDB‘Program’;定義了一個字符串
注:在存放字符串時,存儲的是字符的ASCII碼。HEX_OFFDWHEX;定義了一個字單元,其初值為已定義變量HEX的偏移量。
DVARDD12345678H;定義了一個雙字單元
ASCDB2DUP(?)功能:分配2個字節(jié)單元,初值任意
BUFDW100DUP(0)功能:分配100個字單元,初值為0ZIPDB3DUP(0,2DUP(1))功能:存儲單元依次初始化為:0,1,1,0,1,1,0,1,1。(2)格式2:[變量名]{DB/DW/DD}DUP
表達式變量經(jīng)過定義及存儲器申請之后,在程序中即可像高級語言一樣使用。
MOVAL,HEX;取變量HEX的內(nèi)容送AL寄存器。MOVASC[BX],AL;取變量ASC的偏移地址,再與BX寄存器的內(nèi)容相加,得到存儲器操作數(shù)的有效地址EA,再將AL寄存器的內(nèi)容送入該單元。
3.變量的使用記錄名
RECORD
字段名:寬度[=初值表達式],…6.2.6記錄與結(jié)構(gòu)定義偽指令(RECORD、STRUC/ENDS)1.記錄定義偽指令RECORD記錄:能進行位處理的8位或16位二進制數(shù)。字段:記錄中相鄰的若干位構(gòu)成一個字段。記錄類型:說明記錄中有哪些字段,各字段分別有多少位。(1)記錄類型的定義
記錄名和字段名遵循標(biāo)號的取名法則。寬度表示該字段占有的二進制位數(shù),最多不能超過16位,初值表達式可省,表示該字段的初值。
如:COLORRECORDX:3=5,Y:4=12,Z:9=2551011100011111111
151312980COLORXYZ注:當(dāng)定義中的字段總位數(shù)不能占滿整個字節(jié)或字時,匯編程序就把所定義的字段與記錄的低位端對齊。
如:COOLRECORDA:5=17,B:7=127
XXXX100011111111
151211760COOL未定義AB(2)記錄類型變量的定義及存儲器分配記錄可以用記錄名稱作為操作符。[名稱]記錄名稱<表達式,…>表達式DUP(<表達式,…>)一般格式:定義了一個記錄型變量,其字段X、Y和Z的初值分別為5(缺省值),15和9,即COLOR1=
1011,1110,0000,1001B如:COLOR1COLOR<,15,9>(3)記錄的使用定義了記錄型變量之后,在程序中可像一個字節(jié)或字型變量來使用。
如:MOVDX,COLOR1指令執(zhí)行后,DX=1011,1110,0000,1001B=BE09H(4)記錄專用操作符
①
MASK操作符:使字段名所在位置的位全為1,其余為0
。如:ANDDX,MASKZ②WIDTH操作符:返回紀(jì)錄或紀(jì)錄中字段的位數(shù)。
2.結(jié)構(gòu)定義偽指令
STRUC/END偽指令使用格式:結(jié)構(gòu)是一種復(fù)雜的數(shù)據(jù)類型。結(jié)構(gòu)體中包含若干個字段,其數(shù)據(jù)類型一般為基本的數(shù)據(jù)類型。
結(jié)構(gòu)名稱
STRUC
[字段名稱]
{DB/DW/DD}結(jié)構(gòu)名稱
ENDS表達式,…表達式
DUP(表達式,…)……⑴結(jié)構(gòu)類型的定義
COURSESTRUCNODD?CNAMEDB'Assembler’SCOREDW0COURSEENDS定義了結(jié)構(gòu)名為COURSE的結(jié)構(gòu),該結(jié)構(gòu)包含三個成員變量,結(jié)構(gòu)體長度為15(=4+9+2)個字節(jié)。
(2)結(jié)構(gòu)類型變量的定義及存儲器分配如:COURSE1COURSE<>定義一個結(jié)構(gòu)變量COURSE1,其初值為缺省。
格式:[變量名]結(jié)構(gòu)名<[字段值表]>(3)結(jié)構(gòu)的使用
定義了結(jié)構(gòu)型變量之后,在程序中即可使用。格式:結(jié)構(gòu)變量名.字段名
如:
MOVAX,COURSE1.SCORE
1.EQU偽指令格式:符號名
EQU數(shù)值表達式功能:為常量、變量、表達式或其他符號定義一個名字,但不申請分配內(nèi)存。如:THREEEQU3TOPEQU$-STACK6.2.7符號定義偽指令(EQU、LABEL)
“=”偽操作與EQU相似,其區(qū)別是前者可重復(fù)定義而后者不能。
使用EQU可使程序簡單明了和便于修改。注:
EQU可用PURGE解除。2.LABEL偽指令格式:變量名/標(biāo)號
LABEL[類型]功能:為當(dāng)前存儲單元定義一個指定類型的變量名或標(biāo)號,其類型為BYTE、WORD、DWORD、結(jié)構(gòu)名、記錄名、NEAR和FAR。BYTE_ARRAYLABELBYTE;定義字節(jié)型數(shù)
組標(biāo)號WORD_ARRAYDW50DUP(?);定義字型數(shù)組如定義不同類型的數(shù)組:程序中的用法:
MOVAL,BYTE_ARRAY[2];將2號字節(jié)單元內(nèi)容送ALMOVAX,WORD_ARRAY[0];將0號字單元內(nèi)容送AX又如:TRANS_NLABELNEARTRANSPROCFAR這樣TRANS不僅適合遠程調(diào)用和轉(zhuǎn)移,也可用新名TRANS_N適合近程調(diào)用和轉(zhuǎn)移。
匯編語言程序可劃分為許多模塊,對每個模塊獨立地進行匯編及調(diào)試(見下圖),一般從低層到高層逐步進行。6.2.8程序模塊定義偽指令(NAME/END、PUBLIC/EXTRN)PUBLIC二級子模塊1PUBLIC二級子模塊2PUBLICPUBLIC二級子模塊n-1二級子模塊n…PUBLICPUBLICPUBLIC一級子模塊1EXTRN一級子模塊2EXTRN一級子模塊mEXTRN…主模塊EXTRN主模塊EXTRNPUBLIC二級子模塊1PUBLIC二級子模塊2PUBLICPUBLIC二級子模塊n-1二級子模塊n…PUBLICPUBLICPUBLIC一級子模塊1EXTRN一級子模塊2EXTRN一級子模塊mEXTRN…匯編語言程序的模塊結(jié)構(gòu)1.NAME和END偽指令功能:定義一個模塊,作為一個獨立的匯編單位,NAME缺省時模塊若使用了TITLE語句,則TITLE語句中前6個字符為模塊名,否則源文件名將作為模塊名。格式:NAME模塊名
END標(biāo)號…注:一個模塊是一個獨立的匯編單位,匯編處理只進行到模塊結(jié)束語句END為止。注:符號必須用“,”分開,且均在本模塊中定義過。注:2.PUBLIC偽指令格式:PUBLIC[符號表]功能:用來說明該模塊中被定義的那些常量、變量和標(biāo)號(含過程名)可以被其他模塊所引用。如:PUBLICABC,BCD,CDE3.EXTRN偽指令格式:EXTRN[符號:類型,…]功能:指出本模塊中需要引用但卻在其他模塊中定義并說明為PUBLIC屬性的符號(含常量,變量,標(biāo)號和過程)。被引用符號的類型說明:BYTE、WORD、DWORD、NEAR、FAR、ABS(符號常量)。如:EXTRNABC:WORD,BCD:ABS,CDE:NEAR
6.3匯編語言屬性操作符1.分析操作符(數(shù)值返回操作符)
6.3.1分析操作符(SEG、OFFSET、TYPE、LENGTH、SIZE)返回的是變量或標(biāo)號的段地址,偏移地址及類型的屬性值。格式:分析運算符
變量或標(biāo)號其運算的結(jié)果為一常數(shù)(1)SEG——取段址算符(2)OFFSET——取偏移地址算符功能:分離出該變量或標(biāo)號的段址
如:MOVAX,SEGBUF功能:分離出該變量或標(biāo)號的偏移地址
如:MOVSI,OFFSETBUF(3)TYPE——取類型算符(4)LENGTH——取變量所含存儲單元的個數(shù)功能:分離出該變量所含存儲單元的個數(shù)。功能:分離出該變量或標(biāo)號的類型的字節(jié)數(shù)。
變量類型為BYTE、WORD和DWORD時,返回的值分別為1、2和4;
標(biāo)號類型為NEAR或FAR時,則返回-1或-2。注意:在定義該變量時,數(shù)據(jù)定義偽指令后面的第一個表達式的形式為“nDUP(表達式)”時,取值為n,否則為1。如:
BUF1DB100DUP(0)BUF2DW10,5DUP(2)BUF3DD5DUP(1,2DUP(0))則
LENGTHBUF1=100,LENGTHBUF2=1LENGTHBUF3=5。(5)SIZE——取變量所含存儲區(qū)的總字節(jié)數(shù)。功能:
SIZE=LNGTH*TYPE SIZEBUF1=100(因為TYPEBUF1=1) SIZEBUF2=2(因為TYPEBUF2=2) SIZEBUF3=20(因為TYPEBUF3=4)格式:
類型
PTR表達式類型:表達式:是變量、標(biāo)號或數(shù)值
變量的類型有:BYTE、WORD和DWORD;
標(biāo)號的類型有:NEAR和FAR;
結(jié)構(gòu)名稱6.3.2屬性修改操作符(PTR、THIS、SHORT)1.PTR操作符
PTR操作符用于暫時修改變量或標(biāo)號的原有屬性。
功能:PTR把它左邊的屬性指派給它右邊的變量、標(biāo)號或數(shù)值,使之產(chǎn)生一個新的存儲器地址操作數(shù)。如:(1)INCBYTEPTR[BX](2)ADDDX,WORDPTRFOOB[20]
新存儲器操作數(shù)的段地址和段內(nèi)偏移量與PTR運算符右邊的操作數(shù)的對應(yīng)量相同。
PTR給已分配的存儲器一個另外的定義但并不重新分配存儲器。2.SHORT操作符SHORT用于條件轉(zhuǎn)移、轉(zhuǎn)移和調(diào)用指令中,指出其轉(zhuǎn)移的相對位移量不超過一個字節(jié)所能表達的范圍。3.THIS操作符
THIS操作符與PTR操作符有類似的功能,但新的屬性放在THIS的右邊。
格式:
THIS類型/距離其中類型是BYTE、WORD和DWORD,距離是NEAR和FAR屬性。功能:與PTR類似建立一個新的存儲器地址操作數(shù),但不分配存儲器,其類型由THIS指定。(1)FOOBEQUTHISBYTE(2)FAR-OUTEQUTHISFAR如:6.4匯編語言程序的上機過程
6.4.1匯編語言程序上機運行的軟件環(huán)境
DOS操作系統(tǒng)下,編輯、修改和運行匯編語言程序,需要用文本編輯軟件、宏匯編程序、連接程序和調(diào)試程序。
①
文本編輯軟件:EDIT.EXE等②
宏匯編程序:MASM.EXE,TASM.EXE等③
連接程序:LINK.EXE,TLINK.EXE等④
調(diào)試程序:CV.EXE,TD.EXE等
6.4.2源程序的編輯與匯編1.編輯源程序
C:\ASM>EDITHEXTOASC.ASM(回車)2.匯編源程序
C:\ASM>TASMHEXTOASC(回車)
在匯編中,如果有語法錯誤,會給出提示信息,指出錯誤的類型、行號。當(dāng)匯編無錯之后,會自動生成目標(biāo)文件(文件擴展名為OBJ)。注:待編輯的文件擴展名必須為
ASM。匯編程序通過ASSUME語句了解到運行時各段寄存器的設(shè)定值后,就可以對被匯編的指令語句中的變量和標(biāo)號作如下處理。3.匯編程序?qū)ψ兞亢蜆?biāo)號的處理
1.檢查指令中所引用的變量和標(biāo)號是否合理,即它們的段屬性是否和某個段寄存器的段假設(shè)值相符。2.檢查是否需要為所引用的變量和標(biāo)號產(chǎn)生跨段前綴字節(jié),即檢查變量和標(biāo)號的段屬性是否與硬件為該指令所規(guī)定的段寄存器的假設(shè)值相符。6.4.3目標(biāo)程序的連接C:\ASM>TLINKHEXTOASC(回車)連接成功后,將生成可執(zhí)行程序HEXTOASC.EXE。6.4.4程序的調(diào)試與運行1.調(diào)試可執(zhí)行程序
利用TurboDebuger(TD)對可執(zhí)行程序進行調(diào)試,以檢查程序可能存在的各種錯誤:C:\ASM>TDHEXTOASC.EXE(回車)程序在存儲區(qū)中存放的邏輯地址源程序部分程序執(zhí)行后各寄存器、標(biāo)志位的結(jié)果數(shù)據(jù)段中存放的40個“A”及對應(yīng)的ASCII碼DEBUG調(diào)試環(huán)境如下:2.運行可執(zhí)行程序
C:\ASM>HEXTOASC(回車)6.5匯編語言程序與DOS的接口6.5.1DOS和BIOS的功能調(diào)用1.DOS系統(tǒng)功能調(diào)用的一般步驟
DOS為磁盤操作系統(tǒng)(DiskOperatingSystem)的簡稱。DOS提供了極為豐富的子程序,能夠?qū)崿F(xiàn)控制鍵盤、顯示器、讀寫文件、串行通信等一系列功能。
使用DOS系統(tǒng)功能調(diào)用的一般過程:見下圖所示。功能調(diào)用號
AH置入口參數(shù)執(zhí)行“INT21H”分析出口參數(shù)……系統(tǒng)功能調(diào)用的方法(1)鍵盤輸入(1號調(diào)用)格式:MOVAH,1 INT 21H功能:等待從鍵盤輸入一個字符并將輸入字符的ASCII碼送入寄存器AL中,同時在顯示器上顯示該字符,碰到CTRL+Break則退出。2.DOS系統(tǒng)功能調(diào)用的一般步驟(2)顯示單個字符(2號調(diào)用)格式:MOVAH,2 MOVDL,待顯字符的ASCII碼
INT21H功能:將DL中的字符送顯示器顯示,若為CTRL+Break的ASCII碼則退出。(3)控制臺輸入(8號調(diào)用)格式:MOVAH,8INT21H功能:與1號調(diào)用相似,但只從鍵盤上輸入而不顯示。(4)顯示字符串(9號調(diào)用)格式:LEADX,字符串首偏移地址
MOVAH,9INT21H功能:將當(dāng)前數(shù)據(jù)區(qū)中以
‘$’結(jié)尾的字符串送顯示器顯示。例如,要顯示下列DIS0數(shù)組變量中定義的字符串DIS0DB‘PRESSANYKEYTOQUIT’,0DH,0AH,‘$’程序如下:
LEADX,DIS0MOVAH,09HINT21H(5)鍵盤輸入字符串(10號調(diào)用)格式:LEADX,緩沖區(qū)首偏移地址
MOVAH,10INT21H功能:從鍵盤上往指定緩沖區(qū)中輸入字符串并送顯示器顯示。如:BUFDB81DB?DB80DUP(0)注:緩沖區(qū)應(yīng)按規(guī)定的格式定義。BUF第一字節(jié)規(guī)定了緩沖區(qū)的大小,從鍵盤輸入的字符串從第三個字節(jié)存放,第二個字節(jié)存放實際輸入的字符個數(shù)。3.常用BIOS調(diào)用
BIOS為基本輸入輸出系統(tǒng)(BasicInputandOutputSystem),它提供了最底層的控制程序。
(1)設(shè)置顯示器顯示模式
功能:設(shè)置顯示器顯示模式。顯示模式代碼見附錄E。格式:MOVAH,00HMOVAL,顯示模式代碼
INT10H(2)設(shè)置光標(biāo)位置
功能:設(shè)置光標(biāo)位置,使字符從該位置處開始顯示。MOVAH,02HMOVBH,頁號
MOVDH,行號
MOVDL,列號
INT10H6.5.2用戶程序與DOS的接口1.程序段前綴PSP程序段前綴PSP是一個256字節(jié)的區(qū)域,從頁的邊界開始存放有關(guān)信息。用戶程序可從PSP中獲得有關(guān)鍵盤輸入?yún)?shù)等信息。
當(dāng)DOS加載一個可執(zhí)行文件的程序代碼到內(nèi)存中去時,它首先為該程序建立一個程序段前綴PSP,然后把可執(zhí)行的程序代碼加載到PSP后續(xù)的地址上。
2.用戶程序與DOS的接口
在DOS操作系統(tǒng)下,用戶程序的主程序,對于操作系統(tǒng)而言,也是一個過程,且必須說明為FAR屬性。
3.結(jié)束用戶程序返回DOS的方法
(1)INT20H
說明:INT20H為系統(tǒng)“結(jié)束任務(wù)返回DOS”的子程序。
(2)用戶程序用RET指令返回說明:用戶程序必須定義為一個FAR過程。(3)用DOS系統(tǒng)功能調(diào)用4CH返回格式:
MOVAH,4CHINT21H6.6匯編語言程序設(shè)計的基本技術(shù)
6.6.1簡單程序設(shè)計例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ù)段:CODESEGMENT…MOVAX,WORDPTRX;取X的低位字
MOVDX,WORDPTRX+2;取X的高位字
SUBAX,WORDPTRY;與Y的低位字相減
SBBDX,WORDPTRY+2;與Y的高位字相減,并考慮低位的借位
SBBAX,29D;結(jié)果的低位與29D相減
SBBDX,0;可能產(chǎn)生借位,再減去借位
DIVZ;32位無符號數(shù)(DX:AX)除以16位無符號數(shù)Z
MOVA,AX;商在AX中,保存商
MOVB,DX;余數(shù)在DX中,保存余數(shù)
…CODEENDS定義代碼段:例6-4編寫程序段,完成下面公式的計算:A=(X+Y)-(W+Z),其中X,Y,Z,W均為用壓縮BCD碼表示的數(shù)。DATASEGMENTXDB39HYDB25HWDB86HZDB46HADB?
DATAENDS定義數(shù)據(jù)段:
MOVAL,WADDAL,Z;AL=(W+Z)DAA;加法的十進制調(diào)整
MOVA,AL;調(diào)整后的結(jié)果存到單元AMOVAL,XADDAL,Y;AL=(X+Y)DAA;加法的十進制調(diào)整
SUBAL,A;AL=(X+Y)-(Z+W)DAS;減法的十進制調(diào)整
MOVA,AL
;結(jié)果送A程序如下:例6-5編寫完整的匯編語言程序,用8086的16位無符號數(shù)乘法指令實現(xiàn)兩個32位無符號數(shù)的乘法運算。
算法分析:8086沒有32位無符號數(shù)乘法指令,需借助于16位無符號數(shù)乘法指令做4次乘法,然后把部分積相加,如下圖所示。ABB×DCDA×DB×CA×C+×部分積1部分積2部分積3部分積4最后乘積AB×CD完整的匯編語言程序如下:NAMEMULTIPLY_32BITDATASEGMENTMULNUMDW8000H,0001H,0FFFH,0001H;定義被乘數(shù)B、A與乘數(shù)D、CPRODUCTDW4DUP(?);定義乘積,低字在前DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDS例如,求:00018000H*00010FFFH=0000000197FE8000H
ABCD
CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前綴的段地址
MOVAX,0PUSHAX;設(shè)置返回至DOS的段值和偏移量
MOVAX,DATAMOVDS,AX;置段寄存器初值
MOVBX,0MULU32:MOVAX,MULNUM[BX];B→AXMOVSI,MULNUM[BX+4];D→SIMOVDI,MULNUM[BX+6];C→DI
MULSI ;B×DMOVPRODUCT[BX],AX ;保存部分積1
MOVPRODUCT[BX+2],DXMOVAX,MULNUM[BX+2] ;A→AXMULSI ;A×DADDAX,PRODUCT[BX+2]ADCDX,0;部分積2的一部分與部分
;積1的相應(yīng)部分相加
MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DX;保存
MOVAX,MULNUM[BX];B→AXMULDI;B×CADDAX,PRODUCT[BX+2];與部分積3的相應(yīng)部分相加
ADCDX,PRODUCT[BX+4]
MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DXPUSHF;保存后一次相加的進位標(biāo)志
MOVAX,MULNUM[BX+2];A→AXMULDI;A×CPOPFADCAX,PRODUCT[BX+4];與部分積4的相應(yīng)部分相加
ADCDX,0MOVPRODUCT[BX+4],AXMOVPRODUCT[BX+6],DXRETSTARTENDPCODEENDSENDBEGIN程序中根據(jù)各種可能出現(xiàn)的情況及相應(yīng)的處理方法分成若干支路,運行時,根據(jù)不同情況有選擇地執(zhí)行相應(yīng)處理程序。例6-6試編寫程序段,實現(xiàn)符號函數(shù)。
當(dāng)x>0時當(dāng)x=0時當(dāng)x<0時6.6.2分支程序設(shè)計相應(yīng)的程序段為;SIGN:MOVAX,BUFFER;(BUFFER)=XANDAX,AX;做一次“與”運算,以便把X
;的特征反映到標(biāo)志位
MOVBX,0;預(yù)置X=0的標(biāo)志0到BX JENEXT;若X確實為0,則轉(zhuǎn)NEXT JNSPLUS;X為正數(shù),則轉(zhuǎn)PLUSMOVBX,-1;X為負數(shù),則-1送BXJMPNEXTPLUS: MOVBX,1NEXT:…
…例6-7在數(shù)據(jù)段中定義了256個子程序的入口地址(段地址:偏移地址),試根據(jù)AL中的值,決定調(diào)用256個子程序中的哪一個。
分析:每個子程序的入口地址占用4個字節(jié),需將AL的值乘以4,再加上入口地址表首的偏移地址,即可得到某子程序入口地址在表中的偏移地址,將該地址送入BX,利用段間間接調(diào)用指令實現(xiàn)子程序調(diào)用。這種處理方法,類似于第9章中將要介紹的中斷向量表的處理。
BX=入口地址表首偏移地址+AL*4DATASEGMENTTABADDDDSUB0;0#子程序入口地址
DDSUB1;1#子程序入口地址……
DDSUB255;255#子程序入口地址DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSCODE1SEGMENT;代碼段CODE1實現(xiàn)查表轉(zhuǎn)移的程序段
ASSUMECS:CODE1,DS:DATA,SS:STACK……XORAH,AH;AH清0
MOVCL,2SHLAX,CL;AX左移2次相當(dāng)于乘以4
MOVBX,OFFSETTABADD;取表首的偏移地址
ADDBX,AX;加上AL*4CALLDWORDPTR[BX];段間間接調(diào)用子程序……CODE1ENDS;代碼段CODE2定義256個子程序(過程):CODE2SEGMENTASSUMECS:CODE2SUB0PROCFAR……RETSUB0ENDPSUB1PROCFAR……RETSUB1ENDP……SUB255PROCFAR……RETSUB255ENDPCODE2ENDS一段程序有時重復(fù)執(zhí)行多次,就牽涉到循環(huán)程序結(jié)構(gòu),其組成部分為:1.循環(huán)體即要求重復(fù)執(zhí)行的程序段部分,包括循環(huán)工作部分和循環(huán)控制部分。2.循環(huán)初態(tài)循環(huán)開始時往往要置初態(tài),賦初值,包括循環(huán)工作部分初態(tài)和結(jié)束條件初態(tài)。6.6.3循環(huán)程序設(shè)計3.循環(huán)結(jié)束條件在循環(huán)程序中必須給出循環(huán)結(jié)束條件,否則就會進入死循環(huán),結(jié)束條件有好多種,最常見的有:(1)用計數(shù)器控制循環(huán)(2)按問題的條件控制循環(huán)(3)用開關(guān)量控制循環(huán)(4)多重循環(huán)例6-8分類統(tǒng)計字?jǐn)?shù)組ARRAY中正數(shù)、負數(shù)和零的個數(shù),并分別存入內(nèi)存字變量POST、NEGA和ZERO中,數(shù)組元素個數(shù)保存在數(shù)組的第一個字中。
分析:將字變量與0比較,然后判斷是大于0(JG)、等于0(JE)還是小于0(JL),以分別對相應(yīng)的計數(shù)器加1。
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ù)器
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:INCDIINCDILOOPAGAINDONE:MOVPOST,AX;把各類的統(tǒng)計數(shù)保存到內(nèi)存單元中
MOVNEGA,BXMOVZERO,DXMOVAX,4C00H;結(jié)束程序返回DOSINT21HCODEENDSENDSTART
例6-9
統(tǒng)計字變量VAL中0和1的個數(shù),并將統(tǒng)計結(jié)果分別送字單元X和Y中。分析:每次將最高位移入CF中進行測試,若為0,則X單元加1;若為1,則Y單元加1。一個字有16位,故有16次循環(huán)。
程序段如下:
MOVCX,16;16次循環(huán)
MOVSI,0;SI中存放0的個數(shù)
MOVDI,0;DI中存放1的個數(shù)
MOVAX,VALAGAIN:SHLAX,1JCNOZERO;為1,轉(zhuǎn)走
INCSI;為0,SI加1
JMPNEXTNOZERO:INCDI;為1,DI加1NEXT:LOOPAGAINMOVX,SIMOVY,DI6.6.4子程序設(shè)計
子程序是程序設(shè)計中經(jīng)常使用的程序結(jié)構(gòu),通過把一些固定的、經(jīng)常使用的功能做成子程序的形式,可以使源程序及目標(biāo)程序大大縮短,提高程序設(shè)計的效率和可靠性。
在主程序與子程序中經(jīng)常要進行參數(shù)傳遞。參數(shù)傳遞一般有三種方法:①
利用寄存器。這是一種最常見方法,把所需傳遞的參數(shù)直接放在主程序的寄存器中傳遞給子程序。②
利用存儲單元。主程序把參數(shù)放在公共存儲單元,子程序則從公共存儲單元取得參數(shù)。③
利用堆棧。主程序?qū)?shù)壓入堆棧,子程序運行時則從堆棧中取參數(shù)。例6-10
編寫一個將單字節(jié)的二進制數(shù)轉(zhuǎn)換成BCD碼數(shù)的程序,再將對應(yīng)的十進制數(shù)位轉(zhuǎn)換成ASCII碼字符串,在顯示器上顯示出來。
分析:設(shè)單字節(jié)二進制數(shù)存放在NUMBIN單元。利用除法實現(xiàn)轉(zhuǎn)換。第一步,將該數(shù)除以100,商即為BCD碼數(shù)的百位,保留第一步所得余數(shù)。第二步,將第一步所得余數(shù)再除以10,商即為BCD碼數(shù)的十位,余數(shù)即為BCD碼數(shù)的個位。第三步,將BCD碼數(shù)的百位、十位和個位分別加上30H,即為它們的ASCII碼。第四步,將ASCII碼字符串存入一個緩沖區(qū),然后調(diào)用DOS功能調(diào)用INT21H的09H號功能即可顯示該字符串。DATASEGMENTNUMBINDB0E7H;待轉(zhuǎn)換的單字節(jié)二進制數(shù)STRINGDB10DUP(20H);定義顯示緩沖區(qū)
DB0DH,0AH;定義回車換行符
DB‘$’;定義結(jié)束符DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDSCODESEGMENT ASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX;置段寄存器初值
LEADI,STRINGXORAH,AH;AH清零
MOVAL,NUMB
溫馨提示
- 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. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 辦公自動化設(shè)備與辦公用品整合供應(yīng)合同
- 老人護理app課件
- 翻譯形合意和說課課件
- 大二政治概論考試題型及答案
- 安全培訓(xùn)課件下載
- 施工質(zhì)量事故應(yīng)急預(yù)案
- 安全生產(chǎn)24小時領(lǐng)導(dǎo)帶班制度
- 鋼結(jié)構(gòu)安全生產(chǎn)管理制度
- 空中交通安全管理
- 生產(chǎn)安全事故評估
- 手術(shù)室低值耗材成本管理
- 2024年無人駕駛環(huán)衛(wèi)行業(yè)研究報告
- DB21T 3358-2020 電梯再生制動系統(tǒng)要求及試驗方法
- 醫(yī)療器械生產(chǎn)質(zhì)量管理規(guī)范培訓(xùn)試題及答案
- ISO45001管理體系培訓(xùn)課件
- 對賬單標(biāo)準(zhǔn)格式模板
- 初中教研員面試題目
- 2024年快遞員職業(yè)技能大賽考試題庫(含答案)
- GB/T 44353.2-2024動物源醫(yī)療器械第2部分:來源、收集與處置的控制
- 【甲子光年】2024自動駕駛行業(yè)報告-“端到端”漸行漸近
- 生活垃圾衛(wèi)生填埋場運行管理方案
評論
0/150
提交評論