版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
微機接口第五章匯編語言功能第一頁,共一百四十六頁,編輯于2023年,星期二匯編語言程序的格式匯編語言程序的上機過程偽指令語句匯編語言程序設計的基本方法本章內容第二頁,共一百四十六頁,編輯于2023年,星期二了解匯編語言程序的基本格式,及其上機過程。熟練掌握數(shù)據(jù)定義偽指令、段定義偽指令、符號定義偽指令、過程定義偽指令。熟練掌握匯編語言程序設計的一般步驟以及順序程序、分支程序、循環(huán)程序、子程序設計的方法。學習目的第三頁,共一百四十六頁,編輯于2023年,星期二4.1匯編語言與匯編程序4.1.1匯編語言的基本概念1機器語言與匯編語言(MachineLanguageandAssemblyLanguage)
由二進制代碼0,1表示的指令稱為機器指令,相應的程序稱為機器語言程序。用指令助記符表示的指令稱為匯編語言指令,對應的程序稱為匯編語言程序。第四頁,共一百四十六頁,編輯于2023年,星期二
例4-1將4位二進制數(shù)轉換為ASCII碼字符。當數(shù)在0000B-1001B時,對應的ASCII碼為‘0’~‘9’;當數(shù)在1010B~1111B時,對應的ASCII碼為‘A’~‘F’。設待轉換的數(shù)據(jù)已在累加器AL中(低4位)。編制的機器語言程序與匯編語言程序如下表所示。第五頁,共一百四十六頁,編輯于2023年,星期二地址機器代碼對應的匯編指令E380:0000240FANDAL,0FHE380:00023C0ACMPAL,0AHE380:00047202JBNUME380:00060407ADDAL,07HE380:00080430NUM:ADDAL,30HE380:000AC3RET第六頁,共一百四十六頁,編輯于2023年,星期二2.匯編語言與高級語言(AssemblyLanguageandComputer-independentLanguage)
匯編語言是一種依賴于計算機微處理器的語言
匯編語言一般不具有通用性和可移植性
進行匯編語言程序設計必須熟悉機器的硬件資源和軟件資源
高級語言是面向過程的語言
高級語言具有很好的通用性和可移植性
第七頁,共一百四十六頁,編輯于2023年,星期二學習匯編語言的必要性
利用匯編語言可以設計出效率極高的核心底層程序。用匯編語言編寫的程序一般比用高級語言編寫的程序執(zhí)行得快,且所占內存較少。匯編語言程序能夠直接有效地利用機器硬件資源。學習匯編語言對于理解和掌握計算機硬件組成及工作原理是十分重要的。
第八頁,共一百四十六頁,編輯于2023年,星期二4.1.2匯編語言源程序的組成1.匯編語言源程序的結構(ProgramStructure)例6-2完整的匯編語言源程序示例。NAMEHEXTOASC;*****************************************************DATASEGMENT;數(shù)據(jù)段定義開始HEXDB5AHASCDB2DUP(?)DATAENDS;數(shù)據(jù)段定義結束;*****************************************************第九頁,共一百四十六頁,編輯于2023年,星期二;*************************************************STACKSEGMENT
;堆棧段定義開始
DB256DUP('S')TOPEQU$-STACKSTACKENDS;堆棧段定義結束;*************************************************;************************************************CODESEGMENT;代碼段定義開始
ASSUMECS:CODE,DS:DATA,SS:STACKSTART:MOVAX,DATA;主程序開始第十頁,共一百四十六頁,編輯于2023年,星期二
MOVDS,AXMOVAX,STACKMOVSS,AXMOVSP,TOPMOVBX,OFFSETASCMOVAL,HEXMOVAH,ALMOVCL,4SHRAL,CLCALLNEAR
PTRCONVERT
…HLT;主程序結束第十一頁,共一百四十六頁,編輯于2023年,星期二CONVERTPROC;過程(子程序)定義開始
ANDAL,0FHCMPAL,10JBNUMADDAL,7NUM:ADDAL,'0'RETCONVERTENDP;過程(子程序)定義結束CODEENDS;代碼段定義結束;*************************************************
ENDSTART;程序結束第十二頁,共一百四十六頁,編輯于2023年,星期二要點總結:匯編語言源程序由段結構組成。一個段由
“SEGMENT”(段定義開始)和“ENDS”(段定義結束)語句來定義。每個段都有唯一的段名,前后一致。不同段的段名不能相同。數(shù)據(jù)段、堆棧段和代碼段的作用各不相同。各個段都由一系列語句組成。語句包括指令語句和偽指令語句。第十三頁,共一百四十六頁,編輯于2023年,星期二2.匯編語言的語句格式(StatementFormats)匯編語言程序的每行語句由1~4個部分組成。指令語句和偽指令語句在格式上稍有區(qū)別,指令語句的標號后有冒號“:”,而偽指令語句的標號后則沒有冒號。指令語句的格式為[LABEL:]OPERATION[OPERAND][;COMMENT]標號域指令助記符域操作數(shù)域注釋域第十四頁,共一百四十六頁,編輯于2023年,星期二偽指令語句的格式為[LABEL]OPERATION[OPERAND][;COMMENT]標號域偽指令助記符域操作數(shù)域注釋域一行最多可有132個字符注:
指令助記符前面還可以有[前綴]。匯編語言程序語句中的四項,均可以用大寫、小寫或混合編寫。語句的各部分之間至少用一個空格分開第十五頁,共一百四十六頁,編輯于2023年,星期二3.標號(Label)(含數(shù)據(jù)變量標號和程序位置標號)標號是一個自行設計的標識符或名稱,最多可由31個字母、數(shù)字和特別字符(?、@、-、$)等組成。但 不能用數(shù)字開頭。不能為匯編語言的保留字。注:保留字指有專門用途的字符或字符串,如CPU的寄存器名、指令助記符、偽指令助記符等。第十六頁,共一百四十六頁,編輯于2023年,星期二(1)數(shù)據(jù)變量標號的三種屬性①段值:即所在段的段地址。②偏移量:即數(shù)據(jù)變量所在位置的地址與其段地址之差值。③類型:指該數(shù)據(jù)變量是字節(jié)、字還是雙字。(2)程序位置標號的兩種屬性①
NEAR——段內調用或轉移標號。②
FAR——段間調用或轉移標號。第十七頁,共一百四十六頁,編輯于2023年,星期二4.操作數(shù)域(OperandFields)操作數(shù)可以是常數(shù)、變量、標號、寄存器名或表達式(1)常數(shù):二進制、八進制、十進制、十六進制或ASCII碼字符串。(2)寄存器名、標號、變量指令:MOVAL,HEX中,AL為寄存器名,HEX為變量名。第十八頁,共一百四十六頁,編輯于2023年,星期二(3)表達式:由運算符連接起來的式子叫表達式,按一定的規(guī)則對表達式進行運算后得到一個數(shù)值或一個地址。
表達式可分為算術表達式、邏輯表達式、關系運算表達式、分析運算表達式和合成運算表達式。第十九頁,共一百四十六頁,編輯于2023年,星期二用算術運算符+、-、*、/和MOD連接的表達式。①算術表達式用邏輯運算符AND、OR、XOR和NOT連接的表達式。②邏輯表達式例如:5*8+30,128/100,206MOD128等算術表達式。
第二十頁,共一百四十六頁,編輯于2023年,星期二邏輯表達式的結果可能為8位或16位二進制數(shù),視參加運算的數(shù)的字長而定。
邏輯運算指令中可以包含有邏輯表達式,如指令ANDAL,10101010BAND0FH
左邊第一個AND為邏輯運算指令,第二個AND為邏輯運算符,10101010BAND0FH為邏輯表達式,其結果在匯編時即已確定,為00001010B,故上述指令等價于ANDAL,00001010B第二十一頁,共一百四十六頁,編輯于2023年,星期二用EQ、NE、LT、GT、GE和LE連接的表達式。若條件成立,其值為1,否則為0。③關系運算表達式分析運算表達式把存儲器操作數(shù)分解為幾個組成部分;而合成運算式是把這些組成部分綜合為存儲器操作數(shù)。④分析運算表達式和合成運算表達式例如:指令MOVBX,5GT3
等價于MOVBX,0FFFFH
第二十二頁,共一百四十六頁,編輯于2023年,星期二
分析運算表達式和合成運算表達式的操作對象都為存儲器操作數(shù)。
存儲器操作數(shù)表示變量、符號地址、存儲單元等與存儲器地址有關的量。
分析運算表達式把存儲器操作數(shù)分解為幾個部分,如分解出段值、偏移量、類型等;合成運算表達式則把這些組成部分綜合為存儲器操作數(shù)?;脽羝?7第二十三頁,共一百四十六頁,編輯于2023年,星期二4.2偽指令指令語句:匯編程序把它們翻譯成機器代碼,命令8086執(zhí)行對應操作。偽指令語句:匯編程序并不把它們翻譯成機器代碼,只是用來指示、引導匯編程序在匯編時做一些操作,它本身不占用存儲單元。第二十四頁,共一百四十六頁,編輯于2023年,星期二*變量定義及存儲器申請幻燈片43*程序分段及存儲器分配*過程定義*符號定義*程序模塊定義與通信*宏定義及宏調用*條件匯編*格式控制,列表及其他功能偽指令主要分為下列幾類:第二十五頁,共一百四十六頁,編輯于2023年,星期二段定義偽指令SEGMENT/ENDS1.SEGMENT和ENDS定義方式:
[段名]SEGMENT[定位方式][組合方式][類別名]
語句1
語句2…[段名]ENDS第二十六頁,共一百四十六頁,編輯于2023年,星期二
段名是賦予該段的一個名稱,SEGMENT與ENDS成對出現(xiàn),且前面的段名要相同,段名的取法與文件名、標號及變量名等相同。段名第二十七頁,共一百四十六頁,編輯于2023年,星期二基本源程序結構段的定義
一般方法
使用特點
先定義數(shù)據(jù)段DS、附加段ES、堆棧段SS后編寫代碼段CS代碼段CS——必要數(shù)據(jù)段DS——充分附加段ES——重疊(與數(shù)據(jù)段DS同段)堆棧段SS——省缺第二十八頁,共一百四十六頁,編輯于2023年,星期二基本源程序結構數(shù)據(jù)段(DS)的定義DATASEGMENT
TABLEDB01H,0ABH,‘AB2’
CNTEQU$-TABLE X1DBDUP(?,1,2DUP(0FFH))
X2DW12ABHX3DDX1 X4DWSEGX1 X5DD12345678HDATAENDS段名段定義偽指令變量名常量名第二十九頁,共一百四十六頁,編輯于2023年,星期二基本源程序結構過程定義法(CS段)
CODESEGMENT;CODE為代碼段名
ASSUMECS:CODE,DS:DATA
STARTPROCFAR
;START為過程名
PUSHDSMOVAX,0PUSHAXMOVAX,DATAMOVDS,AX
;上述為固定寫法第三十頁,共一百四十六頁,編輯于2023年,星期二基本源程序結構
程序正文(指令集合)
RET
;過程返回
STARTENDP
;結束過程定義
CODEENDS;結束代碼段
ENDSTART;結束匯編
幻燈片41固定寫法第三十一頁,共一百四十六頁,編輯于2023年,星期二基本源程序結構主程序定義法(CS段)
CODESEGMENT;CODE為代碼段名
ASSUMECS:CODE,DS:DATAMAIN:MOVAX,DATA;從MAIN開始匯編
MOVDS,AX
程序正文(指令集合)
MOVAH,4CHINT21H;21H號中斷退出
CODEENDS;
結束代碼段
ENDMAIN;結束匯編
第三十二頁,共一百四十六頁,編輯于2023年,星期二基本源程序結構段說明與段賦值
僅說明了DS段(CS段必須說明)
ASSUMECS:CODE,DS:DATA幻燈片36
DS段賦值
MOVAX,DATAMOVDS,AX
說明了DS段、ES段
ASSUMECS:CODE,DS:DATA,ES:EATA
DS段、ES段賦值
MOVAX,DATAMOVDS,AXMOVAX,EATAMOVES,AX第三十三頁,共一百四十六頁,編輯于2023年,星期二位置計數(shù)器$和定位偽指令ORG1.位置計數(shù)器$匯編程序專門設置了一個表示當前位置的計數(shù)器,稱位置計數(shù)器$。正常情況下,匯編程序每掃描一個字節(jié),位置計數(shù)器的值便加1。
語句:TOPEQU$-STACK含義:當前位置計數(shù)器的值$減去STACK代表的起始位置的值,然后把兩者的差值賦予符號常量TOP。語句:JMP$
含義:程序跳轉到本條指令執(zhí)行。第三十四頁,共一百四十六頁,編輯于2023年,星期二格式:ORG[數(shù)據(jù)表達式]功能:把位置計數(shù)器的值設置為表達式的值。ORG后面的一條指令性語句或數(shù)據(jù)區(qū)定義命令即從指定的位置處進行匯編。2.ORG偽指令第三十五頁,共一百四十六頁,編輯于2023年,星期二格式:ASSUME[段寄存器]:[段名],
[段寄存器]:[段名],…功能:用于告知匯編程序,段寄存器CS、DS、ES和SS的內容將被設定為那些段或組的段址。段尋址偽指令ASSUME第三十六頁,共一百四十六頁,編輯于2023年,星期二注:(1)段名可以是已定義過的任何段名或組名,也可以是表達式SEG[變量]或SEG[標號],還可以是NOTHING。
(2)除CS外,DS、ES、SS的設置必須通過指令性語句來完成。第三十七頁,共一百四十六頁,編輯于2023年,星期二例CODE SEGMENTASSUMECS:CODE,DS:DATA,
SS:STACK,ES:NOTHINGMOV AX,DATA MOV DS,AX;設置DS MOV AX,STACK MOV SS,AX;設置SS
CODE ENDS幻燈片33第三十八頁,共一百四十六頁,編輯于2023年,星期二過程定義偽指令PROC/ENDP
過程即是子程序。匯編語言規(guī)定必須對過程進行定義,以確定過程的三種屬性。過程的屬性確定之后,就可對調用指令CALL進行正確匯編,決定是產生近調用指令還是遠調用指令。
1.過程的三種屬性①段屬性:過程所在段的段地址。
②偏移量屬性:過程所處位置的段內偏移地址。③類型屬性(NEAR或FAR)。過程為NEAR或FAR類型。第三十九頁,共一百四十六頁,編輯于2023年,星期二使用格式:過程名PROCNEAR/FAR RET
過程名ENDP…NEAR---近過程。該過程與調用指令CALL處在同一個代碼段中(段名相同)。FAR---遠過程。該過程與調用指令CALL處在不同的代碼段中(段名不同)。2.過程的定義第四十頁,共一百四十六頁,編輯于2023年,星期二功能:把具有一定功能的程序段設計成為一個過程(子程序),便于實現(xiàn)模塊化的程序設計。注:(1)CALL指令中過程名起著標號的作用。有段屬性、偏移量屬性和類型屬性(NEAR和FAR)。
(2)子程序中至少有一個RET。過程名是為該過程指定的一個名稱,與變量、標號的定義法相同。第四十一頁,共一百四十六頁,編輯于2023年,星期二任何變量均有下列三種屬性。(1)段屬性即變量所使用的段;(2)段內偏移屬性;(3)變量的類型:字節(jié)、字、雙字等。數(shù)據(jù)定義偽指令與存儲器分配1.變量的三種屬性DB—定義字節(jié)型變量,每個變量分配1個存儲單元DW--定義字型變量,每個變量分配2個存儲單元DD--定義雙字型變量,每個變量分配4個存儲單元第四十二頁,共一百四十六頁,編輯于2023年,星期二2.變量定義及存儲器申請偽指令DB/DW/DD
(1)格式1:[變量名]{DB/DW/DD}表達式功能:定義一變量,并為其分配一定數(shù)量的存儲單元,變量的初值由表達式的值指定。若初值可任意,則用問號(?)表示。變量名可省。HEXDB
5AH;定義字節(jié)變量VWORDDW
1234H;定義字變量第四十三頁,共一百四十六頁,編輯于2023年,星期二注:在存放字變量時,低字節(jié)在前,高字節(jié)在后。BUFFERDW1,0,-1
;定義了三個字單元
STRDB‘Program’;定義了一個字符串
注:在存放字符串時,存儲的是字符的ASCII碼。HEX_OFFDWHEX;定義了一個字單元,其初值為已定義變量HEX的偏移量。
DVARDD12345678H;定義了一個雙字單元
第四十四頁,共一百四十六頁,編輯于2023年,星期二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
表達式第四十五頁,共一百四十六頁,編輯于2023年,星期二變量經(jīng)過定義及存儲器申請之后,在程序中即可像高級語言一樣使用。
MOVAL,HEX;取變量HEX的內容送 AL寄存器。MOVASC[BX],AL;取變量ASC的偏移 地址,再與BX寄存器的內容相加,得到 存儲器操作數(shù)的有效地址EA,再將AL寄 存器的內容送入該單元?;脽羝?53.變量的使用第四十六頁,共一百四十六頁,編輯于2023年,星期二1.EQU偽指令格式:符號名EQU數(shù)值表達式功能:為常量、變量、表達式或其他符號定義一個名字,但不申請分配內存。如:THREEEQU3TOPEQU$-STACK符號定義偽指令(EQU、LABEL)第四十七頁,共一百四十六頁,編輯于2023年,星期二“=”偽操作與EQU相似,其區(qū)別是前者可重復定義而后者不能。使用EQU可使程序簡單明了和便于修改。注:EQU可用PURGE解除。第四十八頁,共一百四十六頁,編輯于2023年,星期二2.LABEL偽指令格式:變量名/標號LABEL[類型]功能:為當前存儲單元定義一個指定類型的變量名或標號,其類型為BYTE、WORD、DWORD、結構名、記錄名、NEAR和FAR。第四十九頁,共一百四十六頁,編輯于2023年,星期二BYTE_ARRAYLABELBYTE;定義字節(jié)型數(shù)組標號WORD_ARRAYDW50DUP(?);定義字型數(shù)組如定義不同類型的數(shù)組:程序中的用法:
MOVAL,BYTE_ARRAY[2];將2號字節(jié)單元內容送ALMOVAX,WORD_ARRAY[0];將0號字單元內容送AX第五十頁,共一百四十六頁,編輯于2023年,星期二又如:TRANS_NLABELNEARTRANSPROCFAR這樣TRANS不僅適合遠程調用和轉移,也可用新名TRANS_N適合近程調用和轉移。
幻燈片25
第五十一頁,共一百四十六頁,編輯于2023年,星期二匯編語言程序可劃分為許多模塊,對每個模塊獨立地進行匯編及調試(見下圖),一般從低層到高層逐步進行。程序模塊定義偽指令(NAME/END、PUBLIC/EXTRN)第五十二頁,共一百四十六頁,編輯于2023年,星期二PUBLIC二級子模塊1PUBLIC二級子模塊2PUBLICPUBLIC二級子模塊n-1二級子模塊n…PUBLICPUBLICPUBLIC一級子模塊1EXTRN一級子模塊2EXTRN一級子模塊mEXTRN…主模塊EXTRN主模塊EXTRNPUBLIC二級子模塊1PUBLIC二級子模塊2PUBLICPUBLIC二級子模塊n-1二級子模塊n…PUBLICPUBLICPUBLIC一級子模塊1EXTRN一級子模塊2EXTRN一級子模塊mEXTRN…匯編語言程序的模塊結構第五十三頁,共一百四十六頁,編輯于2023年,星期二1.NAME和END偽指令功能:定義一個模塊,作為一個獨立的匯編單位,NAME缺省時模塊若使用了TITLE語句,則TITLE語句中前6個字符為模塊名,否則源文件名將作為模塊名。格式:NAME模塊名
END標號…注:一個模塊是一個獨立的匯編單位,匯編處理只進行到模塊結束語句END為止。第五十四頁,共一百四十六頁,編輯于2023年,星期二注:符號必須用“,”分開,且均在本模塊中定義過。注:2.PUBLIC偽指令格式:PUBLIC[符號表]功能:用來說明該模塊中被定義的那些常量、變量和標號(含過程名)可以被其他模塊所引用。如:PUBLICABC,BCD,CDE第五十五頁,共一百四十六頁,編輯于2023年,星期二3.EXTRN偽指令格式:EXTRN[符號:類型,…]功能:指出本模塊中需要引用但卻在其他模塊中定義并說明為PUBLIC屬性的符號(含常量,變量,標號和過程)。被引用符號的類型說明:BYTE、WORD、DWORD、NEAR、FAR、ABS(符號常量)。如:EXTRNABC:WORD,BCD:ABS,CDE:NEAR
第五十六頁,共一百四十六頁,編輯于2023年,星期二4.3匯編語言屬性操作符1.分析操作符(數(shù)值返回操作符)4.3.1分析操作符(SEG、OFFSET、TYPE、LENGTH、SIZE)返回的是變量或標號的段地址,偏移地址及類型的屬性值。格式:分析運算符變量或標號其運算的結果為一常數(shù)第五十七頁,共一百四十六頁,編輯于2023年,星期二(1)SEG——取段址算符(2)OFFSET——取偏移地址算符功能:分離出該變量或標號的段址如:MOVAX,SEGBUF功能:分離出該變量或標號的偏移地址如:MOVSI,OFFSETBUF第五十八頁,共一百四十六頁,編輯于2023年,星期二(3)TYPE——取類型算符(4)LENGTH——取變量所含存儲單元的個數(shù)功能:分離出該變量所含存儲單元的個數(shù)。功能:分離出該變量或標號的類型的字節(jié)數(shù)。變量類型為BYTE、WORD和DWORD時,返回的值分別為1、2和4;標號類型為NEAR或FAR時,則返回-1或-2。第五十九頁,共一百四十六頁,編輯于2023年,星期二注意:在定義該變量時,數(shù)據(jù)定義偽指令后面的第一個表達式的形式為“nDUP(表達式)”時,取值為n,否則為1。如:BUF1DB100DUP(0)
BUF2DW10,5DUP(2)
BUF3DD5DUP(1,2DUP(0))則LENGTHBUF1=100,LENGTHBUF2=1LENGTHBUF3=5。第六十頁,共一百四十六頁,編輯于2023年,星期二(5)SIZE——取變量所含存儲區(qū)的總字節(jié)數(shù)。功能:SIZE=LNGTH*TYPE SIZEBUF1=100(因為TYPEBUF1=1)
SIZEBUF2=2(因為TYPEBUF2=2)
SIZEBUF3=20(因為TYPEBUF3=4)第六十一頁,共一百四十六頁,編輯于2023年,星期二格式:類型PTR表達式類型:表達式:是變量、標號或數(shù)值變量的類型有:BYTE、WORD和DWORD;標號的類型有:NEAR和FAR;結構名稱4.3.2屬性修改操作符(PTR、THIS、SHORT)1.PTR操作符PTR操作符用于暫時修改變量或標號的原有屬性。
第六十二頁,共一百四十六頁,編輯于2023年,星期二功能:PTR把它左邊的屬性指派給它右邊的變量、標號或數(shù)值,使之產生一個新的存儲器地址操作數(shù)。如:(1)INCBYTEPTR[BX](2)ADDDX,WORDPTRFOOB[20]
新存儲器操作數(shù)的段地址和段內偏移量與PTR運算符右邊的操作數(shù)的對應量相同。PTR給已分配的存儲器一個另外的定義但并不重新分配存儲器。第六十三頁,共一百四十六頁,編輯于2023年,星期二2.SHORT操作符SHORT用于條件轉移、轉移和調用指令中,指出其轉移的相對位移量不超過一個字節(jié)所能表達的范圍。第六十四頁,共一百四十六頁,編輯于2023年,星期二3.THIS操作符
THIS操作符與PTR操作符有類似的功能,但新的屬性放在THIS的右邊。格式:THIS類型/距離其中類型是BYTE、WORD和DWORD,距離是NEAR和FAR屬性。功能:與PTR類似建立一個新的存儲器地址操作數(shù),但不分配存儲器,其類型由THIS指定。(1)FOOBEQUTHISBYTE(2)FAR-OUTEQUTHIS幻燈片25FAR如:第六十五頁,共一百四十六頁,編輯于2023年,星期二
4.4匯編語言程序的上機過程
4.4.1匯編語言程序上機運行的軟件環(huán)境
DOS操作系統(tǒng)下,編輯、修改和運行匯編語言程序,需要用文本編輯軟件、宏匯編程序、連接程序和調試程序。
①文本編輯軟件:EDIT.EXE等②宏匯編程序:MASM.EXE,TASM.EXE等③連接程序:LINK.EXE,TLINK.EXE等④調試程序:CV.EXE,TD.EXE等第六十六頁,共一百四十六頁,編輯于2023年,星期二編程者編輯源程序XXX.ASM
指令偽指令寫字板,記事簿等軟件匯編連接MASM.EXELINK.EXEXXX.EXE可執(zhí)行文件加載程序運行DOS磁盤文件DOS將磁盤文件讀入內存從指定起始指令開始執(zhí)行程序任務XXX.OBJ動態(tài)調試程序DEBUG.COMPC上匯編語言程序生成過程機器語言(模塊代碼)第六十七頁,共一百四十六頁,編輯于2023年,星期二4.4.2源程序的編輯與匯編1.編輯源程序C:\ASM>EDITHEXTOASC.ASM(回車)2.匯編源程序C:\ASM>TASMHEXTOASC(回車)在匯編中,如果有語法錯誤,會給出提示信息,指出錯誤的類型、行號。當匯編無錯之后,會自動生成目標文件(文件擴展名為OBJ)。注:待編輯的文件擴展名必須為ASM。第六十八頁,共一百四十六頁,編輯于2023年,星期二匯編程序通過ASSUME語句了解到運行時各段寄存器的設定值后,就可以對被匯編的指令語句中的變量和標號作如下處理。3.匯編程序對變量和標號的處理第六十九頁,共一百四十六頁,編輯于2023年,星期二
1.檢查指令中所引用的變量和標號是否合理,即它們的段屬性是否和某個段寄存器的段假設值相符。
2.檢查是否需要為所引用的變量和標號產生跨段前綴字節(jié),即檢查變量和標號的段屬性是否與硬件為該指令所規(guī)定的段寄存器的假設值相符。第七十頁,共一百四十六頁,編輯于2023年,星期二4.4.3目標程序的連接C:\ASM>TLINKHEXTOASC(回車)連接成功后,將生成可執(zhí)行程序HEXTOASC.EXE。6.4.4程序的調試與運行1.調試可執(zhí)行程序利用TurboDebuger(TD)對可執(zhí)行程序進行調試,以檢查程序可能存在的各種錯誤:C:\ASM>TDHEXTOASC.EXE(回車)第七十一頁,共一百四十六頁,編輯于2023年,星期二程序在存儲區(qū)中存放的邏輯地址源程序部分程序執(zhí)行后各寄存器、標志位的結果數(shù)據(jù)段中存放的40個“A”及對應的ASCII碼DEBUG調試環(huán)境如下:第七十二頁,共一百四十六頁,編輯于2023年,星期二2.運行可執(zhí)行程序C:\ASM>HEXTOASC(回車)第七十三頁,共一百四十六頁,編輯于2023年,星期二
4.5匯編語言程序與DOS的接口4.5.1DOS和BIOS的功能調用1.DOS系統(tǒng)功能調用的一般步驟
DOS為磁盤操作系統(tǒng)(DiskOperatingSystem)的簡稱。DOS提供了極為豐富的子程序,能夠實現(xiàn)控制鍵盤、顯示器、讀寫文件、串行通信等一系列功能。(課程設計中的數(shù)據(jù)顯示,輸入,響鈴設計等)
第七十四頁,共一百四十六頁,編輯于2023年,星期二使用DOS系統(tǒng)功能調用的一般過程:見下圖所示。功能調用號AH置入口參數(shù)執(zhí)行“INT21H”分析出口參數(shù)……系統(tǒng)功能調用的方法第七十五頁,共一百四十六頁,編輯于2023年,星期二鍵盤功能調用
AH功能入口參數(shù)出口參數(shù)1從鍵盤輸入一個字符,并在屏幕上回顯,檢查Ctrl+Bteak鍵
AL=字符6直接控制臺輸入/輸出字符,回顯,不檢查Ctrl+Break鍵DL=0FFHAL=字符7直接鍵盤輸入字符,無回顯,不檢查Ctrl+Break鍵
AL=字符8鍵盤輸入一個字符,無回顯,檢查Ctrl+Break鍵
AL=字符0AH輸入字符串到內存緩沖區(qū)DS:DX=緩沖區(qū)首址
0BH檢查鍵盤輸入狀態(tài)
AL=FFH有鍵入AL=0無鍵入0CH清鍵盤緩沖區(qū),調用鍵盤輸入功能AL=鍵盤功能號(1,6,7,8,A)
第七十六頁,共一百四十六頁,編輯于2023年,星期二(1)鍵盤輸入(1號調用)格式:MOVAH,1 INT 21H功能:等待從鍵盤輸入一個字符并將輸入字符的ASCII碼送入寄存器AL中,同時在顯示器上顯示該字符,碰到CTRL+Break則退出。2.DOS系統(tǒng)功能調用的一般步驟第七十七頁,共一百四十六頁,編輯于2023年,星期二(2)顯示單個字符(2號調用)格式:MOVAH,2 MOVDL,待顯字符的ASCII碼
INT21H功能:將DL中的字符送顯示器顯示,若為CTRL+Break的ASCII碼則退出。(單個字符)第七十八頁,共一百四十六頁,編輯于2023年,星期二(3)控制臺輸入(8號調用)格式:MOVAH,8INT21H功能:與1號調用相似,但只從鍵盤上輸入而不顯示。第七十九頁,共一百四十六頁,編輯于2023年,星期二(4)顯示字符串(9號調用)格式:LEADX,字符串首偏移地址
MOVAH,9INT21H功能:將當前數(shù)據(jù)區(qū)中以‘$’結尾的字符串送顯示器顯示。(字符串顯示)第八十頁,共一百四十六頁,編輯于2023年,星期二例如,要顯示下列DIS0數(shù)組變量中定義的字符串DIS0DB‘PRESSANYKEYTOQUIT’,0DH,0AH,‘$’程序如下:LEADX,DIS0MOVAH,09HINT21H0DH,0AH-換行回車,書上介紹第八十一頁,共一百四十六頁,編輯于2023年,星期二(5)鍵盤輸入字符串(10號調用)格式:LEADX,緩沖區(qū)首偏移地址
MOVAH,10INT21H功能:從鍵盤上往指定緩沖區(qū)中輸入字符串并送顯示器顯示。第八十二頁,共一百四十六頁,編輯于2023年,星期二如:BUFDB81DB?
DB80DUP(0)注:緩沖區(qū)應按規(guī)定的格式定。BUF第一字節(jié)規(guī)定了緩沖區(qū)的大小,從鍵盤輸入的字符串從第三個字節(jié)存放,第二個字節(jié)存放實際輸入的字符個數(shù)。第八十三頁,共一百四十六頁,編輯于2023年,星期二3.常用BIOS調用
BIOS為基本輸入輸出系統(tǒng)(BasicInputandOutputSystem),它提供了最底層的控制程序。(1)設置顯示器顯示模式
功能:設置顯示器顯示模式。顯示模式代碼見附錄E。格式:MOVAH,00HMOVAL,顯示模式代碼
INT10H第八十四頁,共一百四十六頁,編輯于2023年,星期二(2)設置光標位置
功能:設置光標位置,使字符從該位置處開始顯示。MOVAH,02HMOVBH,頁號MOVDH,行號MOVDL,列號INT10H第八十五頁,共一百四十六頁,編輯于2023年,星期二4.5.2用戶程序與DOS的接口1.程序段前綴PSP程序段前綴PSP是一個256字節(jié)的區(qū)域,從頁的邊界開始存放有關信息。用戶程序可從PSP中獲得有關鍵盤輸入?yún)?shù)等信息。
當DOS加載一個可執(zhí)行文件的程序代碼到內存中去時,它首先為該程序建立一個程序段前綴PSP,然后把可執(zhí)行的程序代碼加載到PSP后續(xù)的地址上。2.用戶程序與DOS的接口在DOS操作系統(tǒng)下,用戶程序的主程序,對于操作系統(tǒng)而言,也是一個過程,且必須說明為FAR屬性。第八十六頁,共一百四十六頁,編輯于2023年,星期二3.結束用戶程序返回DOS的方法
(1)INT20H
說明:INT20H為系統(tǒng)“結束任務返回DOS”的子程序。(2)用戶程序用RET指令返回說明:用戶程序必須定義為一個FAR過程。(3)用DOS系統(tǒng)功能調用4CH返回格式:MOVAH,4CHINT21H第八十七頁,共一百四十六頁,編輯于2023年,星期二明確任務,確定算法繪制流程圖根據(jù)流程圖編寫匯編語言程序上機調試程序程序設計步驟:匯編語言程序設計程序基本結構:順序結構、分支結構、循環(huán)結構及子程序結構第八十八頁,共一百四十六頁,編輯于2023年,星期二模塊化程序設計任務模塊圖小應用系統(tǒng)用簡單程序編程完成大應用系統(tǒng)用多模塊程序編程完成主模塊MAIN.ASMAN1.ASMAN2.ASMAN3.ASMBN1.ASMBN1.ASMCN1.ASM第八十九頁,共一百四十六頁,編輯于2023年,星期二程序的基本結構
順序程序結構條件程序結構分支程序結構...YN一般語句If–else語句Switch語句第九十頁,共一百四十六頁,編輯于2023年,星期二程序的基本結構
循環(huán)控制結構1循環(huán)控制結構2YYNNwhile語句do--while語句第九十一頁,共一百四十六頁,編輯于2023年,星期二基本程序設計順序程序設計條件程序設計
循環(huán)程序設計
指令指針I(yè)P值線性增加,IP=IP+1IP值受標志位的影響而跳變影響標志的指令CMP、TEST、JXXIP值受計數(shù)器CX中的值不為零而循環(huán)影響標志的指令DEC第九十二頁,共一百四十六頁,編輯于2023年,星期二標準流程圖符號起始和終止框執(zhí)行框判斷框連接框第九十三頁,共一百四十六頁,編輯于2023年,星期二6.6匯編語言程序設計的基本技術
6.6.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ù)段:第九十四頁,共一百四十六頁,編輯于2023年,星期二CODESEGMENT…MOVAX,WORDPTRX;取X的低位字
MOVDX,WORDPTRX+2;取X的高位字
SUBAX,WORDPTRY;與Y的低位字相減
SBBDX,WORDPTRY+2;與Y的高位字相減,并考慮低位的借位
SBBAX,29D;結果的低位與29D相減
SBBDX,0;可能產生借位,再減去借位
DIVZ;32位無符號數(shù)(DX:AX)除以16位無符號數(shù)Z
MOVA,AX;商在AX中,保存商
MOVB,DX;余數(shù)在DX中,保存余數(shù)
…CODEENDS定義代碼段:第九十五頁,共一百四十六頁,編輯于2023年,星期二例6-4編寫程序段,完成下面公式的計算:A=(X+Y)-(W+Z),其中X,Y,Z,W均為用壓縮BCD碼表示的數(shù)。DATASEGMENTXDB39HYDB25HWDB86HZDB46HADB?
DATAENDS定義數(shù)據(jù)段:第九十六頁,共一百四十六頁,編輯于2023年,星期二
MOVAL,WADDAL,Z;AL=(W+Z)DAA;加法的十進制調整
MOVA,AL;調整后的結果存到單元AMOVAL,XADDAL,Y;AL=(X+Y)DAA;加法的十進制調整
SUBAL,A;AL=(X+Y)-(Z+W)
DAS;減法的十進制調整
MOVA,AL
;結果送A程序如下:第九十七頁,共一百四十六頁,編輯于2023年,星期二例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第九十八頁,共一百四十六頁,編輯于2023年,星期二完整的匯編語言程序如下:NAMEMULTIPLY_32BITDATASEGMENTMULNUMDW8000H,0001H,0FFFH,0001H;定義被乘數(shù)B、A與乘數(shù)D、CPRODUCTDW4DUP(?);定義乘積,低字在前DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDS例如,求:00018000H*00010FFFH=0000000197FE8000H
ABCD第九十九頁,共一百四十六頁,編輯于2023年,星期二
CODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKSTARTPROCFARBEGIN:PUSHDS;DS中包含的是程序段前綴的段地址
MOVAX,0PUSHAX;設置返回至DOS的段值和偏移量
MOVAX,DATAMOVDS,AX;置段寄存器初值
MOVBX,0MULU32:MOVAX,MULNUM[BX];B→AXMOVSI,MULNUM[BX+4];D→SIMOVDI,MULNUM[BX+6];C→DI第一百頁,共一百四十六頁,編輯于2023年,星期二
MULSI ;B×DMOVPRODUCT[BX],AX ;保存部分積1MOVPRODUCT[BX+2],DXMOVAX,MULNUM[BX+2] ;A→AXMULSI ;A×DADDAX,PRODUCT[BX+2]ADCDX,0;部分積2的一部分與部分
;積1的相應部分相加
MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DX;保存
MOVAX,MULNUM[BX];B→AXMULDI;B×CADDAX,PRODUCT[BX+2];與部分積3的相應部分相加
ADCDX,PRODUCT[BX+4]第一百零一頁,共一百四十六頁,編輯于2023年,星期二
MOVPRODUCT[BX+2],AXMOVPRODUCT[BX+4],DXPUSHF;保存后一次相加的進位標志
MOVAX,MULNUM[BX+2];A→AXMULDI;A×CPOPFADCAX,PRODUCT[BX+4];與部分積4的相應部分相加
ADCDX,0MOVPRODUCT[BX+4],AXMOVPRODUCT[BX+6],DXRETSTARTENDPCODEENDSENDBEGIN第一百零二頁,共一百四十六頁,編輯于2023年,星期二程序中根據(jù)各種可能出現(xiàn)的情況及相應的處理方法分成若干支路,運行時,根據(jù)不同情況有選擇地執(zhí)行相應處理程序。例6-6
試編寫程序段,實現(xiàn)符號函數(shù)。
當x>0時當x=0時當x<0時6.6.2分支程序設計第一百零三頁,共一百四十六頁,編輯于2023年,星期二相應的程序段為;SIGN:MOVAX,BUFFER;(BUFFER)=XANDAX,A;做一次“與”運算,以把X
;的特征反映到標志位
MOVBX,0;預置X=0的標志0到BX JENEXT;若X確實為0,則轉NEXT JNSPLUS;X為正數(shù),則轉PLUSMOVBX,-1;X為負數(shù),則-1送BXJMPNEXTPLUS: MOVBX,1NEXT:…
…第一百零四頁,共一百四十六頁,編輯于2023年,星期二例6-7在數(shù)據(jù)段中定義了256個子程序的入口地址(段地址:偏移地址),試根據(jù)AL中的值,決定調用256個子程序中的哪一個。
分析:每個子程序的入口地址占用4個字節(jié),需將AL的值乘以4,再加上入口地址表首的偏移地址,即可得到某子程序入口地址在表中的偏移地址,將該地址送入BX,利用段間間接調用指令實現(xiàn)子程序調用。這種處理方法,類似于第9章中將要介紹的中斷向量表的處理。
BX=入口地址表首偏移地址+AL*4第一百零五頁,共一百四十六頁,編輯于2023年,星期二DATASEGMENTTABADDDDSUB0;0#子程序入口地址
DDSUB1;1#子程序入口地址
……DDSUB255;255#子程序入口地址DATAENDSSTACKSEGMENTPARASTACK‘STACK’DB100DUP(?)STACKENDS第一百零六頁,共一百四十六頁,編輯于2023年,星期二CODE1SEGMENT;代碼段CODE1實現(xiàn)查表轉移的程序段
ASSUMECS:CODE1,DS:DATA,SS:STACK……XORAH,AH;AH清0MOVCL,2SHLAX,CL;AX左移2次相當于乘以4MOVBX,OFFSETTABADD;取表首的偏移地址
ADDBX,AX;加上AL*4CALLDWORDPTR[BX];段間間接調用子程序
……CODE1ENDS第一百零七頁,共一百四十六頁,編輯于2023年,星期二
;代碼段CODE2定義256個子程序(過程):CODE2SEGMENTASSUMECS:CODE2SUB0PROCFAR……RETSUB0ENDPSUB1PROCFAR……RETSUB1ENDP……SUB255PROCFAR……RETSUB255ENDPCODE2ENDS第一百零八頁,共一百四十六頁,編輯于2023年,星期二一段程序有時重復執(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)。6.6.3循環(huán)程序設計第一百零九頁,共一百四十六頁,編輯于2023年,星期二3.循環(huán)結束條件在循環(huán)程序中必須給出循環(huán)結束條件,否則就會進入死循環(huán),結束條件有好多種,最常見的有:(1)用計數(shù)器控制循環(huán)(2)按問題的條件控制循環(huán)(3)用開關量控制循環(huán)(4)多重循環(huán)第一百一十頁,共一百四十六頁,編輯于2023年,星期二例6-8
分類統(tǒng)計字數(shù)組ARRAY中正數(shù)、負數(shù)和零的個數(shù),并分別存入內存字變量POST、NEGA和ZERO中,數(shù)組元素個數(shù)保存在數(shù)組的第一個字中。
分析:將字變量與0比較,然后判斷是大于0(JG)、等于0(JE)還是小于0(JL),以分別對相應的計數(shù)器加1。第一百一十一頁,共一百四十六頁,編輯于2023年,星期二
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ù)器第一百一十二頁,共一百四十六頁,編輯于2023年,星期二
MOVCX,ARRAY;用CX來進行循環(huán)計數(shù)
JCXZDONE;考慮數(shù)組的元素個數(shù)為0的情況
LEADI,ARRAY+2;;用指針DI來訪問整個數(shù)組AGAIN:CMPWORDPTR[DI],0;與0做比較
JGHIGH;大于0,為正數(shù)
JEEQUAL;
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024版工程車租賃合同模板范本
- 2025年度個人房產抵押擔保債務重組合同4篇
- 2025年度道路工程保險合同書3篇
- 2025年度汽車貸款逾期違約擔保合同4篇
- 2025年度個人財產抵押反擔保協(xié)議4篇
- 2025年紫金財產保險股份有限公司招聘筆試參考題庫含答案解析
- 2025年湖南藝創(chuàng)建筑工程有限公司招聘筆試參考題庫含答案解析
- 2025年度醫(yī)療健康產業(yè)貸款合同范本4篇
- 2025年廣西來賓市自來水有限公司招聘筆試參考題庫含答案解析
- 2025年南京航空航天大學后勤集團招聘筆試參考題庫含答案解析
- 第7課《中華民族一家親》(第一課時)(說課稿)2024-2025學年統(tǒng)編版道德與法治五年級上冊
- 2024年醫(yī)銷售藥銷售工作總結
- 急診科十大護理課件
- 山東省濟寧市2023-2024學年高一上學期1月期末物理試題(解析版)
- GB/T 44888-2024政務服務大廳智能化建設指南
- 2025年上半年河南鄭州滎陽市招聘第二批政務輔助人員211人筆試重點基礎提升(共500題)附帶答案詳解
- 山東省濟南市歷城區(qū)2024-2025學年七年級上學期期末數(shù)學模擬試題(無答案)
- 國家重點風景名勝區(qū)登山健身步道建設項目可行性研究報告
- 投資計劃書模板計劃方案
- 《接觸網(wǎng)施工》課件 3.4.2 隧道內腕臂安裝
- 2024-2025學年九年級語文上學期第三次月考模擬卷(統(tǒng)編版)
評論
0/150
提交評論