最新計(jì)算機(jī) 匯編語(yǔ)言程序設(shè)計(jì)_第1頁(yè)
最新計(jì)算機(jī) 匯編語(yǔ)言程序設(shè)計(jì)_第2頁(yè)
最新計(jì)算機(jī) 匯編語(yǔ)言程序設(shè)計(jì)_第3頁(yè)
最新計(jì)算機(jī) 匯編語(yǔ)言程序設(shè)計(jì)_第4頁(yè)
最新計(jì)算機(jī) 匯編語(yǔ)言程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩216頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、最新計(jì)算機(jī) 匯編語(yǔ)言(hu bin y yn)程序設(shè)計(jì) 2013年4月24日共二百二十一頁(yè)第4章 匯編語(yǔ)言(hu bin y yn)程序設(shè)計(jì) 本章要點(diǎn)4.1 匯編語(yǔ)言與匯編程序 4.2 偽指令及其應(yīng)用 4.3 匯編語(yǔ)言屬性操作符 4.4基本結(jié)構(gòu)的程序設(shè)計(jì)(chn x sh j)4.5宏指令 4.6 32 位匯編語(yǔ)言與C+語(yǔ)言混合編程 2013年4月24日共二百二十一頁(yè)4.1 匯編語(yǔ)言(hu bin y yn)與匯編程序程序員用各種編程語(yǔ)言編寫(xiě)指令以指揮計(jì)算機(jī)工作。計(jì)算機(jī)程序由一系列指令序列組成。計(jì)算機(jī)通過(guò)對(duì)每條指令的譯碼和執(zhí)行來(lái)完成相應(yīng)的操作。指令必須以二進(jìn)制代碼的形式存放在內(nèi)存中,才能夠被計(jì)

2、算機(jī)所識(shí)別和理解,并加以執(zhí)行。由二進(jìn)制代碼表示的指令稱(chēng)為機(jī)器指令,相應(yīng)的程序稱(chēng)為機(jī)器語(yǔ)言程序。任何計(jì)算機(jī)所能直接理解的語(yǔ)言只有(zhyu)其本身的機(jī)器語(yǔ)言(Machine Language)。機(jī)器語(yǔ)言是特定計(jì)算機(jī)的自然語(yǔ)言,由計(jì)算機(jī)的硬件設(shè)計(jì)定義。機(jī)器語(yǔ)言通常由一系列數(shù)字組成(最終簡(jiǎn)化0和1),讓計(jì)算機(jī)一次一個(gè)地執(zhí)行最基本的操作。機(jī)器語(yǔ)言程序由0、1二進(jìn)制代碼組成,非常繁瑣、難于編程和記憶。隨著計(jì)算機(jī)越來(lái)越普及,機(jī)器語(yǔ)言編程對(duì)大多數(shù)程序員顯然太慢、太繁瑣。程序員不用計(jì)算機(jī)直接理解的一系列數(shù)字,而是用類(lèi)似英文縮寫(xiě)的助記符(Memoni)來(lái)表示計(jì)算機(jī)的基本操作,這些助記符構(gòu)成了匯編語(yǔ)言(Assem

3、bly Language)。使用匯編語(yǔ)言編寫(xiě)的程序,機(jī)器不能直接識(shí)別,稱(chēng)為匯編器/匯編程序(assembler)的翻譯程序?qū)R編語(yǔ)言程序轉(zhuǎn)換為機(jī)器語(yǔ)言。由此產(chǎn)生了用指令助記符表示的匯編語(yǔ)言指令,對(duì)應(yīng)的程序稱(chēng)為匯編語(yǔ)言程序。匯編程序把匯編語(yǔ)言翻譯成機(jī)器語(yǔ)言的過(guò)程稱(chēng)為匯編。 2013年4月24日共二百二十一頁(yè)4.1 匯編語(yǔ)言(hu bin y yn)與匯編程序【例4-1】【例4-28】均在MASM6.11的環(huán)境中編譯?!纠?-1】將4位二進(jìn)制數(shù)對(duì)應(yīng)的16進(jìn)制數(shù)轉(zhuǎn)換為ASCII碼字符并在屏幕上顯示出來(lái)。當(dāng)數(shù)在0000B-1001B時(shí),對(duì)應(yīng)的ASCII碼為0-9(30H-39H);當(dāng)數(shù)在1010B-1

4、111B時(shí),對(duì)應(yīng)的ASCII碼為A-F(41H-46H)。步驟如下:(1)在Windows系統(tǒng)中的【記事本】(%SystemRoot%system32notepad.exe)中輸入如下的匯編語(yǔ)言程序并另存為C:MASM611BINE4-1.ASM:DATAS SEGMENT ;此處輸入數(shù)據(jù)段代碼(di m) x DB 10DATAS ENDSCODES SEGMENT;此處輸入代碼段代碼 ASSUME CS:CODES,DS:DATASSTART: MOV AX,DATAS MOV DS,AX MOV AL,x AND AL,0FH CMP AL,0AH JB NUM; JB:jump whe

5、n below ADD AL,07HNUM: ADD AL,30H MOV DL,AL ;DOS2號(hào)功能調(diào)用,顯示DL中ASCII碼對(duì)應(yīng)的字符 MOV AH,2 INT 21H MOV AH,4CH ;帶返回碼結(jié)束 INT 21HCODES ENDS END START2013年4月24日共二百二十一頁(yè)4.1 匯編語(yǔ)言(hu bin y yn)與匯編程序(2)單擊【開(kāi)始】【程序】【運(yùn)行】,在【打開(kāi)】框中輸入cmd,再單擊【確定】。在彈出的DOS命令提示符窗口(chungku)中輸入如下帶下劃線(xiàn)的命令:C:Documents and SettingsCD C:masm611bin此命令將當(dāng)前目錄

6、切換到C:MASM611BIN。C:MASM611BINMASM E4-1.asm上述命令將匯編語(yǔ)言源程序E4-1.asm翻譯成二進(jìn)制代碼的機(jī)器語(yǔ)言程序(即目標(biāo)代碼),在C:masm611bin目錄里會(huì)看到新生成的目標(biāo)代碼文件E4-1.obj。2013年4月24日共二百二十一頁(yè)4.1 匯編語(yǔ)言(hu bin y yn)與匯編程序(3)C:MASM611BINLink E4-1.obj ( 不用附加(fji)名OBJ也可),如圖4-1所示。Microsoft (R) Segmented Executable Linker Version 5.31.009 Jul 13 1992Copyright

7、 (C) Microsoft Corp 1984-1992. All rights reserved.Run File e4-1.exe: 是否改動(dòng)輸出EXE文件名,如不改就ENTERList File nul.map: 是否需要列表文件(MAP),不需要?jiǎng)tENTERLibraries .lib: 是否需要庫(kù)文件,要就鍵入文件名,不要?jiǎng)tENTERDefinitions File nul.def:LINK : warning L4021: no stack segment由于COM文件不使用堆棧段,所以錯(cuò)誤信息,no stack segment并不影響程序正常執(zhí)行至此已經(jīng)生成EXE文件。連接程序

8、Link.exe將目標(biāo)文件E4-1.obj與其他目標(biāo)文件及系統(tǒng)提供的一些庫(kù)文件連接在一起,生成以EXE或COM為擴(kuò)展名的可執(zhí)行文件。2013年4月24日共二百二十一頁(yè)4.1 匯編語(yǔ)言(hu bin y yn)與匯編程序(4)運(yùn)行(ynxng)如圖所示,鍵入E4-1.exe,可看到輸出的結(jié)果A,A是10的十六進(jìn)制表示。 2013年4月24日共二百二十一頁(yè)4.1 匯編語(yǔ)言(hu bin y yn)與匯編程序(5)調(diào)試和查看(chkn)匯編代碼的機(jī)器碼在CodeView(安裝MASM6.11后,是默認(rèn)安裝路徑的C:MASM611BINCV.EXE文件)中打開(kāi)E4-1.exe文件,即可看到如下圖圖4-

9、2所示的窗口。 2013年4月24日共二百二十一頁(yè)4.1 匯編語(yǔ)言(hu bin y yn)與匯編程序畫(huà)面的左上窗口是調(diào)試器的主窗口,其顯示被調(diào)試的源程序或執(zhí)行代碼,左下窗口是命令窗口,用戶(hù)可輸入各種( zhn)DEBUG命令,右窗口是顯示寄存器窗口,它可顯示16位寄存器的內(nèi)容。在主窗口3中,分為3列顯示,第1列顯示的是代碼所在內(nèi)存單元的段地址和段內(nèi)偏移地址,請(qǐng)注意右側(cè)寄存器reg窗口的CS寄存器和IP寄存器的值,它們和當(dāng)前要執(zhí)行的指令的段地址和偏移地址是一致的。第2列顯示的是第3列匯編指令的相應(yīng)的16進(jìn)制表示的機(jī)器指令。按快捷鍵F10可以進(jìn)行單步運(yùn)行代碼,以逐語(yǔ)句觀察運(yùn)行結(jié)果。 2013年4

10、月24日共二百二十一頁(yè)4.1.2 匯編(hubin)與連接1匯編程序(hu bin chn x)匯編是把匯編語(yǔ)言程序翻譯成機(jī)器語(yǔ)言描述的目標(biāo)程序的過(guò)程。匯編程序是完成匯編任務(wù)的程序。2連接程序連接程序的主要功能是實(shí)現(xiàn)多個(gè)目標(biāo)文件及庫(kù)文件的連接,并完成浮動(dòng)地址的重定位。從匯編語(yǔ)言源程序到可執(zhí)行程序的生成過(guò)程如圖所示。2013年4月24日共二百二十一頁(yè)4.1.3 匯編語(yǔ)言與高級(jí)(goj)語(yǔ)言匯編語(yǔ)言程序的基本單位仍然是機(jī)器指令,只是采用助記符表示,便于人們記憶。匯編語(yǔ)言是一種依賴(lài)于計(jì)算機(jī)微處理器的語(yǔ)言,每種機(jī)器都有它專(zhuān)用的匯編語(yǔ)言(如8086CPU與8031單片機(jī)的匯編語(yǔ)言即不相同),匯編語(yǔ)言一般

11、不具有通用性和可移植性。由于進(jìn)行匯編語(yǔ)言程序設(shè)計(jì)必須熟悉機(jī)器的硬件資源和軟件資源,因此具有較大的難度和復(fù)雜性。為了加速編程過(guò)程,人們開(kāi)發(fā)了高級(jí)語(yǔ)言(high-level language),用一條語(yǔ)句完成大量任務(wù)。稱(chēng)為編譯器(compiler)的翻譯程序?qū)⒏呒?jí)語(yǔ)言程序變?yōu)橄鄳?yīng)的機(jī)器語(yǔ)言。高級(jí)語(yǔ)言使程序員能夠編寫(xiě)更像英語(yǔ)的指令,可以包含常用的數(shù)學(xué)符號(hào)。從程序員角度看,高級(jí)語(yǔ)言比機(jī)器語(yǔ)言和匯編語(yǔ)言都要強(qiáng)得多。C、C+、C#、VB和Java等等是目前最強(qiáng)大最廣泛使用的高級(jí)語(yǔ)言。將高級(jí)語(yǔ)言程序編譯為相應(yīng)的機(jī)器語(yǔ)言的過(guò)程可能需要大量時(shí)間。解釋器(interpreter)程序可以直接執(zhí)行高級(jí)語(yǔ)言程序,而不

12、必先將這些程序編譯成相應(yīng)的機(jī)器語(yǔ)言。盡管編譯程序的執(zhí)行速度比解釋程序更快,但解釋器在程序開(kāi)發(fā)環(huán)境中更常用,因?yàn)樵黾有绿匦院图m正錯(cuò)誤時(shí)經(jīng)常需要重新編譯程序。一旦程序開(kāi)發(fā)完成,編譯版本的運(yùn)行(ynxng)最有效。 2013年4月24日共二百二十一頁(yè)4.1.3 匯編語(yǔ)言與高級(jí)(goj)語(yǔ)言高級(jí)語(yǔ)言(Computer-independent Language),如BASIC,FORTRAN,C語(yǔ)言等是面向過(guò)程的語(yǔ)言,不依賴(lài)于機(jī)器,因而具有(jyu)很好的通用性和可移植性,并且具有(jyu)很高的程序設(shè)計(jì)效率,便于開(kāi)發(fā)復(fù)雜龐大的軟件系統(tǒng)。2013年4月24日共二百二十一頁(yè)4.1.3 匯編語(yǔ)言(hu bi

13、n y yn)與高級(jí)語(yǔ)言既然高級(jí)語(yǔ)言有很多優(yōu)點(diǎn),為什么還要學(xué)習(xí)匯編語(yǔ)言呢?理由如下: 匯編語(yǔ)言仍然是各種系統(tǒng)軟件(如操作系統(tǒng))設(shè)計(jì)的基本語(yǔ)言。利用匯編語(yǔ)言可以設(shè)計(jì)出效率極高的核心底層程序,如設(shè)備驅(qū)動(dòng)程序。迄今在許多高級(jí)應(yīng)用編程中,32位匯編語(yǔ)言編程仍然占有較大的市場(chǎng)。 用匯編語(yǔ)言編寫(xiě)的程序一般比用高級(jí)語(yǔ)言編寫(xiě)的程序執(zhí)行速度快,且占內(nèi)存較少。 匯編語(yǔ)言程序能夠直接有效地利用機(jī)器硬件資源,在一些實(shí)時(shí)控制系統(tǒng)中更是不可代替。 學(xué)習(xí)匯編語(yǔ)言對(duì)于理解和掌握計(jì)算機(jī)硬件組成及工作(gngzu)原理十分重要,也是進(jìn)行計(jì)算機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)的基礎(chǔ)。2013年4月24日共二百二十一頁(yè)4.1.4 匯編語(yǔ)言(hu bin

14、 y yn)源程序的結(jié)構(gòu)(Program Structure)一個(gè)匯編語(yǔ)言源程序由若干個(gè)代碼段、數(shù)據(jù)段、附加段或堆棧段組成,先看下面的例子?!纠?-2】將一個(gè)8位二進(jìn)制數(shù)分成高4位和低4位分別轉(zhuǎn)換為兩個(gè)ASCII字符。設(shè)待轉(zhuǎn)換的數(shù)據(jù)及轉(zhuǎn)換好的ASCII字符均存放在數(shù)據(jù)段中。完整(wnzhng)的匯編語(yǔ)言源程序如下:2013年4月24日共二百二十一頁(yè)1 NAME BIN2ASCII2 3 DATA SEGMENT ; 數(shù)據(jù)段定義開(kāi)始4 BIN DB 10101011B5 ASC DB 2 DUP(?)6 DATA ENDS ; 數(shù)據(jù)段定義結(jié)束(jish)78 STACK SEGMENT ; 堆棧

15、段定義開(kāi)始9 DB 256 DUP(S)10 TOP EQU $-STACK11 STACK ENDS ; 堆棧段定義結(jié)束1213 EXTRA SEGMENT ; 定義附加段14 data1 DW ? 15 data2 DW ?16 data3 DW ?17 EXTRA ENDS ; 附加段定義結(jié)束182013年4月24日共二百二十一頁(yè)19 CODE SEGMENT ; 代碼段定義(dngy)開(kāi)始20 ASSUME CS:CODE, DS:DATA, SS:STACK21 ;22 START: MOV AX, DATA ; 主程序開(kāi)始23 MOV DS, AX24 MOV AX, STACK2

16、5 MOV SS, AX26 MOV SP, TOP27 MOV BX, OFFSET ASC28 MOV AL, BIN29 MOV AH, AL30 MOV CL, 431 SHR AL, CL32 CALL NEAR PTR CONVERT33 MOV BX,AL34 35 INC BX36 MOV AL, AH2013年4月24日共二百二十一頁(yè)37 CALL NEAR PTR CONVERT38 MOV BX,AL39 INC BX40 MOV BX, $;加字符串結(jié)束(jish)標(biāo)記41 42LEA DX,ASC43MOV AH,944INT 21H45 46MOV AH,4CH47

17、INT 21H48HLT ; 主程序結(jié)束 49;50CONVERT PROC ; 過(guò)程(子程序)定義開(kāi)始51 AND AL,0FH52 CMP AL,1053 JB NUM54 ADD AL,755NUM: ADD AL, 056 RET57CONVERT ENDP ; 過(guò)程(子程序)定義結(jié)束58;59CODE ENDS ; 代碼段定義結(jié)束6061 END START ; 程序結(jié)束2013年4月24日共二百二十一頁(yè) 從例4-2中可以看出,一個(gè)匯編語(yǔ)言源程序由若干個(gè)代碼段、數(shù)據(jù)段、附加段和堆棧段組成,即程序由段結(jié)構(gòu)組成。它們由段定義開(kāi)始語(yǔ)句“SEGMENT”和段定義結(jié)束語(yǔ)句“ENDS”來(lái)定義一個(gè)

18、段。每個(gè)段都有一個(gè)段名,段名可自行命名,如數(shù)據(jù)段的段名為“DATA”,堆棧段的段名為“STACK”,代碼段的段名為“CODE”。 數(shù)據(jù)段和附加段用于存放變量、數(shù)據(jù)和結(jié)果,堆棧段用于執(zhí)行壓棧和出棧操作,以及子程序調(diào)用和參數(shù)傳遞,代碼段則是所編制的執(zhí)行程序或常數(shù)表格。各個(gè)段都由一系列語(yǔ)句組成。語(yǔ)句包括(boku)指令語(yǔ)句和偽指令語(yǔ)句。指令語(yǔ)句(Instruction Statements)產(chǎn)生對(duì)應(yīng)的機(jī)器代碼,指定CPU做什么操作,而偽指令語(yǔ)句(Directive Statements)并不產(chǎn)生機(jī)器代碼,僅僅起控制匯編過(guò)程的作用,它指定匯編器(Assembler)作何種操作。 匯編器是專(zhuān)門(mén)把匯編語(yǔ)言

19、源程序匯編成機(jī)器語(yǔ)言的工具軟件。它通過(guò)偽指令來(lái)了解諸如“變量名列表”、“變量所在位置”、“過(guò)程名”等信息。在例4-2中,NAME,SEGMENT/ENDS,DB,EQU,ORG,ASSUME,PTR,PROC/ENDP,END等都是偽指令,它們是匯編語(yǔ)言源程序的重要組成部分。2013年4月24日共二百二十一頁(yè)4.1.5 匯編語(yǔ)言(hu bin y yn)的語(yǔ)句格式(Statement Formats)匯編語(yǔ)言程序的每行語(yǔ)句(yj)由14個(gè)部分組成。指令語(yǔ)句(yj)和偽指令語(yǔ)句(yj)的格式稍有區(qū)別,指令語(yǔ)句(yj)的標(biāo)號(hào)后有冒號(hào)“:”,偽指令語(yǔ)句(yj)的標(biāo)號(hào)后沒(méi)有冒號(hào)。指令語(yǔ)句的格式為L(zhǎng)AB

20、EL: OPERATION OPERAND ;COMMENT標(biāo)號(hào)域 指令助記符域 操作數(shù)域 注釋域偽指令語(yǔ)句的格式為L(zhǎng)ABEL OPERATION OPERAND ;COMMENT標(biāo)號(hào)域 偽指令助記符域 操作數(shù)域 注釋域2013年4月24日共二百二十一頁(yè)語(yǔ)句格式中用方括號(hào)括起來(lái)的部分,是可選項(xiàng),可以有也可以沒(méi)有。每部分之間用空格(至少一個(gè))分開(kāi),一行最多可有132個(gè)字符。LABEL:標(biāo)號(hào)域,表示段名、變量名、過(guò)程名或指令符號(hào)地址等。OPERATION:助記符域,為指令或偽指令的助記符。OPERAND:操作數(shù)域,表示操作的對(duì)象,由一個(gè)或多個(gè)表達(dá)式組成,表達(dá)式與表達(dá)式之間必須用逗號(hào)“,”分開(kāi)。CO

21、MMENT:注釋域,用來(lái)說(shuō)明語(yǔ)句的功能,以“;”開(kāi)始。匯編程序?qū)Α?;”以后的部分不予匯編。指令助記符前面還可以有前綴。匯編程序語(yǔ)句中的四個(gè)域,均可以用大寫(xiě)、小寫(xiě)或大小寫(xiě)混合(hnh)編寫(xiě)。標(biāo)號(hào)(Label)是一個(gè)自行設(shè)計(jì)的標(biāo)識(shí)符或名稱(chēng),最多可由31個(gè)字母、數(shù)字和特別字符(?、_、$)等組成。但不能用數(shù)字開(kāi)頭,中間不能有空格,也不能為匯編語(yǔ)言的保留字。注:保留字指有專(zhuān)門(mén)用途的字符或字符串,如CPU的寄存器名、指令助記符、偽指令助記符等。標(biāo)號(hào)一般表示變量名、段名、過(guò)程名或指令符號(hào)地址。變量名、段名和過(guò)程名由專(zhuān)門(mén)的偽指令語(yǔ)句定義,而指令符號(hào)地址則根據(jù)需要在標(biāo)號(hào)域中寫(xiě)上,后面跟一個(gè)“:”。在同一個(gè)匯編

22、單位(以END結(jié)束的程序模塊)中,標(biāo)號(hào)域中的標(biāo)號(hào)不能相同。操作數(shù)(Operand)可以是常數(shù)、常量、變量、標(biāo)號(hào)、寄存器名或表達(dá)式。2013年4月24日共二百二十一頁(yè)1. 常數(shù)、常量編程時(shí)已經(jīng)確定其值,程序運(yùn)行期間不會(huì)改變其值的數(shù)據(jù)對(duì)象稱(chēng)為常數(shù)。8086/8088CPU允許定義四種形式的常數(shù): 整數(shù)、字符串、“組合(zh)BCD碼數(shù)”和實(shí)數(shù)(浮點(diǎn)數(shù)),但只能處理整數(shù)、字符串、“組合(zh)BCD碼數(shù)”,不能處理實(shí)數(shù)(浮點(diǎn)數(shù))。常數(shù)表達(dá)式的名字稱(chēng)為常量。 (程序員給出的一個(gè)名或助記名作為一個(gè)確定值的標(biāo)識(shí), 其值在程序執(zhí)行過(guò)程中保持不變。)常量可用偽指令說(shuō)明符“EQU”或“=”定義。例如,A EQU

23、 7或 A = 7都可將常量A的值定義為常數(shù)7。注意:偽指令說(shuō)明符EQU左邊的符號(hào)名不允許重復(fù)定義,而“=”左邊的符號(hào)名可以重復(fù)定義。即:A EQU 7可以(ky):A=7A EQU 8 (不允許)可以:A=82013年4月24日共二百二十一頁(yè)4.1.5 匯編語(yǔ)言的語(yǔ)句(yj)格式(Statement Formats)匯編語(yǔ)言語(yǔ)句中出現(xiàn)的常數(shù)一般有5種:(1) 二進(jìn)制數(shù)(binary) 后跟字母B,如10101011B。(2) 八進(jìn)制數(shù)(octal) 后跟字母Q,如367Q。(3) 十進(jìn)制數(shù)(decimal) 后跟字母D或不跟字母,如9D或9。(4) 十六進(jìn)制數(shù)(hexadecimal) 后跟

24、字母H,如0FH,3AH。注意,當(dāng)數(shù)字的第一個(gè)字符是AF時(shí),在字符前應(yīng)添加一個(gè)數(shù)字0,以示和變量或保留字的區(qū)別。如0AH表示十六進(jìn)制數(shù),而AH則表示8086CPU中的8位寄存器。(5) 字符和字符串 字符或字符串的值是取其對(duì)應(yīng)的ASCII碼,并用一對(duì)(y du)單引號(hào) 括起來(lái)。如字符0,其對(duì)應(yīng)的ASCII碼為30H。字符串MASM以ASCII碼4DH 、41H、53H和4DH存放。2013年4月24日共二百二十一頁(yè)2. 變量、標(biāo)號(hào)和寄存器名例如,指令MOV AL, BIN中,AL為寄存器名,表示目的操作數(shù),BIN為變量名,表示源操作數(shù)。標(biāo)號(hào)就是指令地址(dzh)的名字,也稱(chēng)為指令的符號(hào)地址(d

25、zh)。標(biāo)號(hào)定義在指令的前面(通常是左邊),用冒號(hào)作為分隔符。標(biāo)號(hào)只能定義在代碼段(CS)中,它代表其后第一條指令的第一個(gè)字節(jié)的存儲(chǔ)單元地址(dzh),用于說(shuō)明指令在存儲(chǔ)器中的存儲(chǔ)位置。例如, 在例4-2的指令序列中,START: MOV AX, DATA ; 主程序開(kāi)始這里,START就是標(biāo)號(hào).標(biāo)號(hào)有如下的屬性:(1) 段基值屬性: 指標(biāo)號(hào)后面第一條指令所在的代碼段的段基值;(2) 偏移地址屬性: 指標(biāo)號(hào)后面第一條指令首字節(jié)的段內(nèi)偏移地址;(3) 類(lèi)型屬性: 也稱(chēng)距離屬性,是指標(biāo)號(hào)與引用該標(biāo)號(hào)的指令之間允許距離的遠(yuǎn)、近。2013年4月24日共二百二十一頁(yè)4.1.5 匯編語(yǔ)言(hu bin y

26、 yn)的語(yǔ)句格式(Statement Formats)3. 表達(dá)式由運(yùn)算符連接起來(lái)的式子叫表達(dá)式,匯編程序在對(duì)其匯編時(shí),按一定的規(guī)則對(duì)表達(dá)式進(jìn)行運(yùn)算后得到(d do)一個(gè)數(shù)值或一個(gè)地址。表達(dá)式可分算術(shù)表達(dá)式、邏輯表達(dá)式、關(guān)系運(yùn)算表達(dá)式、分析運(yùn)算表達(dá)式和合成運(yùn)算表達(dá)式。2013年4月24日共二百二十一頁(yè)4.1.5 匯編語(yǔ)言的語(yǔ)句(yj)格式(Statement Formats)(1) 算術(shù)表達(dá)式算術(shù)運(yùn)算符有加(+)、減(-)、乘(*)、除(/)、求余(MOD)算術(shù)運(yùn)算表達(dá)式的最后結(jié)果(ji gu)仍為一個(gè)數(shù)。例如5*8+20, 127/100,5 MOD 3等算術(shù)表達(dá)式,其結(jié)果分別為60,1和

27、2。 2013年4月24日共二百二十一頁(yè)4.1.5 匯編語(yǔ)言(hu bin y yn)的語(yǔ)句格式(Statement Formats)(2) 邏輯表達(dá)式邏輯運(yùn)算符有AND(邏輯與)、OR(邏輯或)、XOR(邏輯異或)和NOT(邏輯非)。邏輯表達(dá)式的結(jié)果視情況不同而可能為8位或16位二進(jìn)制數(shù)。邏輯運(yùn)算符與邏輯運(yùn)算指令(zhlng)的區(qū)別在于,前者在匯編時(shí)完成邏輯運(yùn)算,而后者在指令(zhlng)執(zhí)行時(shí)完成邏輯運(yùn)算。例如AND AL, 10101011B AND 0FH10101011B AND 0FH 為邏輯表達(dá)式,其結(jié)果在匯編時(shí)即已確定,為00001011B,故上述指令等價(jià)于AND AL, 00

28、001011B2013年4月24日共二百二十一頁(yè)4.1.5 匯編語(yǔ)言(hu bin y yn)的語(yǔ)句格式(Statement Formats)(3) 關(guān)系表達(dá)式關(guān)系運(yùn)算符有EQ(Equal,等于)、NE(Not Equal,不等于)、LT(Less Than,小于)、LE(Less Than or Equal,小于或等于)、GT(Greater Than,大于)和GE(Greater Than or Equal,大于或等于)共六種。關(guān)系運(yùn)算符的兩個(gè)操作數(shù)必須都是數(shù)字或同一段內(nèi)的兩個(gè)存儲(chǔ)單元的地址。計(jì)算(j sun)的結(jié)果為邏輯值,結(jié)果為真,表示為0FFFFH;結(jié)果為假,表示為0000H。例如指

29、令MOV BX, 5 GT 3其中, 5 GT 3為關(guān)系表達(dá)式,該關(guān)系成立,結(jié)果為0FFFFH。故指令等價(jià)于MOV BX, 0FFFFH2013年4月24日共二百二十一頁(yè)4.1.5 匯編語(yǔ)言的語(yǔ)句(yj)格式(Statement Formats) (4) 分析(fnx)運(yùn)算表達(dá)式和合成運(yùn)算表達(dá)式分析運(yùn)算表達(dá)式和合成運(yùn)算表達(dá)式的操作對(duì)象都為存儲(chǔ)器操作數(shù)。存儲(chǔ)器操作數(shù)表示變量、符號(hào)地址、存儲(chǔ)單元等。分析運(yùn)算表達(dá)式把存儲(chǔ)器操作數(shù)分解為幾個(gè)部分,如分解出段值、偏移量、類(lèi)型等;而合成運(yùn)算表達(dá)式則把這些組成部分綜合為存儲(chǔ)器操作數(shù)。例如,例4-2中的指令MOV BX, OFFSET ASCOFFSET AS

30、C即為分析運(yùn)算表達(dá)式,它的作用為取存儲(chǔ)器操作數(shù)(變量)ASC的地址偏移量,由于在例4-2中,ASC的偏移地址為0001H,即OFFSET ASC=0001H。故該指令等價(jià)于MOV BX, 0001H2013年4月24日共二百二十一頁(yè)4.2 偽指令及其應(yīng)用(yngyng)偽指令語(yǔ)句只是用來(lái)指示、引導(dǎo)匯編程序(hu bin chn x)在匯編時(shí)做一些操作,它不產(chǎn)生機(jī)器代碼,本身也不占用存儲(chǔ)單元。偽指令主要分為下列幾類(lèi):程序分段及存儲(chǔ)器分配變量定義及存儲(chǔ)器申請(qǐng)過(guò)程定義符號(hào)定義程序模塊定義與通信宏定義及宏調(diào)用條件匯編格式控制,列表及其他功能2013年4月24日共二百二十一頁(yè)4.2.1 段定義(dngy

31、)偽指令SEGMENT/ENDSSEGMENT和ENDS為程序分段的定義,其格式如下:段名 SEGMENT 定位方式(fngsh) 組合方式(fngsh) 類(lèi)別名 指令語(yǔ)句或偽指令語(yǔ)句段名 ENDS2013年4月24日共二百二十一頁(yè)4.2.1 段定義(dngy)偽指令SEGMENT/ENDS1段名段名是賦予該段的一個(gè)名稱(chēng),它位于SEGMENT與ENDS偽指令之前,成對(duì)出現(xiàn),且前后必須一致。段名的取法與標(biāo)號(hào)、變量名等相同。在同一個(gè)模塊中,不同段的段名不能相同。段名代表該段的段地址(dzh)。例如,例4-2中的指令:MOV AX, DATAMOV DS, AX表示取數(shù)據(jù)段的段地址(用段名表示)送A

32、X,然后再將AX(段地址)送數(shù)據(jù)段寄存器DS。2013年4月24日共二百二十一頁(yè)4.2.1 段定義(dngy)偽指令SEGMENT/ENDS2定位方式程序的段必須連續(xù)放置在內(nèi)存單元的某個(gè)區(qū)域,并占據(jù)一定的存儲(chǔ)空間。為了對(duì)程序的段進(jìn)行合理的管理,需要對(duì)段放置的起始地址進(jìn)行規(guī)定,這就是定位方式的作用。有4種定位類(lèi)型(lixng):BYTE、WORD、PARA、PAGE。起始地址分別為(X表示可為0或1):BYTE XXXX XXXX XXXX XXXX XXXX BWORD XXXX XXXX XXXX XXXX XXX0 BPARA XXXX XXXX XXXX XXXX 0000 BPAGE

33、XXXX XXXX XXXX 0000 0000 B分別表示以字節(jié)、字、節(jié)、頁(yè)的邊界為起始地址。如果缺省定位方式,則以節(jié)(PARA)的邊界為起始地址。一節(jié)包含16個(gè)連續(xù)的字節(jié)單元,一頁(yè)包含256個(gè)連續(xù)的字節(jié)單元。2013年4月24日共二百二十一頁(yè)4.2.1 段定義(dngy)偽指令SEGMENT/ENDS3組合方式對(duì)于規(guī)模(gum)較大的程序,常將程序分割為多個(gè)模塊。在不同的模塊中,段名可以相同,組合方式的作用是指示連接程序,把同名的段按照指定的方式組合起來(lái)形成一個(gè)新的段。組合方式共有6種。(1) NONE:表示該段與其他模塊的段沒(méi)有任何關(guān)系,每段都有自己的基址。這是缺省方式。(2) PUBL

34、IC:表示該段與其它模塊中說(shuō)明為PUBLIC方式的同名段互相組合成一個(gè)邏輯段,邏輯段的長(zhǎng)度為各段長(zhǎng)度之和。(3) STACK:表示此段為堆棧段,連接時(shí)把所有STACK方式的同名段連接成一個(gè)段,由SS指向該段的起始地址。(4) COMMON:表示該段與其它模塊中所有已說(shuō)明為COMMON的同名段共享相同的存儲(chǔ)區(qū)域,共享的長(zhǎng)度為模塊同名段中最大長(zhǎng)度,各共享段具有相同的段起始地址。(5) MEMORY方式:表示該段應(yīng)定位在所有其他段的上面。若有多個(gè)段選用MEMORY,則除第一個(gè)之外,其余段均作為COMMON處理。(6) AT:表示該段按絕對(duì)地址定位,其段地址即為其后表達(dá)式的值,位移量為0。2013年4

35、月24日共二百二十一頁(yè)4.2.1 段定義(dngy)偽指令SEGMENT/ENDS4類(lèi)別名類(lèi)別名必須用單引號(hào)括起來(lái)。連接程序把類(lèi)別名相同的所有段放在連續(xù)的存儲(chǔ)區(qū)域內(nèi),先出現(xiàn)的段放前,后出現(xiàn)的在后,但對(duì)各段不進(jìn)行重新組合。一般總是定義堆棧段的類(lèi)別名為STACK,例如,例4-2中,堆棧段可定義如下:STACK SEGMENT PARA STACK STACK表示堆棧段從節(jié)的起始地址開(kāi)始存放(cnfng),組合方式為STACK, 類(lèi)別名為STACK。2013年4月24日共二百二十一頁(yè)5指定段內(nèi)的偏移地址常用(chn yn)的有ORG和EVEN兩種說(shuō)明符,是指定下一個(gè)要用的存儲(chǔ)單元的偏移地址。(1)

36、格式: ORG 常數(shù)表達(dá)式指定當(dāng)前可用的存儲(chǔ)單元的偏移地址為常數(shù)表達(dá)式的值,就是將常數(shù)表達(dá)式的值送入$。(2) 格式: EVEN將當(dāng)前可用的存儲(chǔ)單元的偏移地址調(diào)整為最近的偶數(shù)值,就是將當(dāng)前可用的最小偶數(shù)偏移地址值送入$。例如,在下述偽指令語(yǔ)句序列中, ORG 1000H A DB 47H, 12H, 45H EVEN B DB 47H這里,指令 ORG 1000H 將A的偏移地址部分指定為1000H,從A開(kāi)始存放3個(gè)字節(jié)變量,占用地址1000H、1001H和1002H,B的偏移地址部分本應(yīng)是1003H,但EVEN指令會(huì)將B的偏移地址部分調(diào)整為偶數(shù)地址1004H。對(duì)于字?jǐn)?shù)組,為保證其從偶地址開(kāi)始

37、,可在它前面用EVEN 偽操作來(lái)達(dá)到這一目的,形如:DATA-SEG SEGMENT EVEN WORD-ARRAY DW 100 DUP(?)DATA-SEG ENDS2013年4月24日共二百二十一頁(yè)4.2.1 段定義(dngy)偽指令SEGMENT/ENDS6GROUP偽指令前述的組合方式是把同名的段按照指定的方式組合起來(lái)(q li)形成一個(gè)新的段,而GROUP偽指令則用來(lái)把模塊中若干不同名的段集合成一個(gè)組,使其裝入同一個(gè)物理段中,組內(nèi)各段之間的跳轉(zhuǎn)可視為段內(nèi)跳轉(zhuǎn)。格式如下:組名 GROUP 段名 ,注:組名與段名是一樣的取名規(guī)則,是代表該組的段地址,格式中的段名也可用表達(dá)式SEG 變量

38、或 SEG 標(biāo)號(hào)來(lái)代替,其中“SEG”運(yùn)算符表示取變量或標(biāo)號(hào)的段地址 。2013年4月24日共二百二十一頁(yè)4.2.2 偏移地址(dzh)計(jì)數(shù)器$和定位偽指令ORG1偏移地址計(jì)數(shù)器$匯編程序在對(duì)源程序進(jìn)行匯編的過(guò)程中,用偏移地址計(jì)數(shù)器$來(lái)保存當(dāng)前正在匯編的指令的偏移地址或偽指令語(yǔ)句中變量的偏移地址。用戶(hù)可將$用于自己編寫(xiě)的源程序中。在每個(gè)段開(kāi)始匯編時(shí),匯編程序( 匯編器)都將$清為0,以后,每處理一條指令或一個(gè)變量,$就增加(zngji)一個(gè)值,此值為該指令或該變量所占的字節(jié)數(shù)。可見(jiàn),$的內(nèi)容就是當(dāng)前指令或變量的偏移地址。在偽指令中,$代表其所在地的偏移地址。例如,如果A的偏移地址是0074H,

39、則語(yǔ)句A DW 1, 2, $+4, 3, 4, $+4 中的第一個(gè)$+4的偏移地址為A+4,第二個(gè)$+4的偏移地址為A+10。匯編后:第一個(gè)$+4:$+4=(A+4)+4=(0074H+4)+4=007CH第二個(gè)$+4:$+4=(A+10)+4=(0074H+0AH)+4=0082H 2013年4月24日共二百二十一頁(yè)4.2.2 偏移地址(dzh)計(jì)數(shù)器$和定位偽指令ORG2 ORG(origin)偽指令ORG偽指令把數(shù)據(jù)表達(dá)式的值賦予位置計(jì)數(shù)器。通過(guò)ORG偽指令,可以將位置計(jì)數(shù)器設(shè)置為新值, 以便(ybin)其后的指令性語(yǔ)句或數(shù)據(jù)定義語(yǔ)句從指定的位置處進(jìn)行匯編。ORG偽指令格式為:ORG

40、數(shù)據(jù)表達(dá)式例如,例4-2中變量BIN的原來(lái)位置為數(shù)據(jù)段中0000H單元,現(xiàn)將該變量改放到0100H單元:ORG 0100HBIN DB 5AH2013年4月24日共二百二十一頁(yè)4.2.3 段尋址偽指令A(yù)SSUME用ASSUME偽指令來(lái)指定段寄存器與段名之間的對(duì)應(yīng)關(guān)系,以便匯編程序能夠正確匯編。ASSUME語(yǔ)句的一般格式為:ASSUME 段寄存器:段名 ,段寄存器:段名 ,其中段寄存器有CS、DS、ES、SS。每個(gè)指定之間用逗號(hào)分開(kāi)。例如,例4-2中段的說(shuō)明語(yǔ)句為:ASSUME CS:CODE, DS:DATA, SS:STACK表示CODE為代碼段,DATA為數(shù)據(jù)段,STACK為堆棧段。該程序

41、(chngx)中沒(méi)有用到附加段。注意,ASSUME語(yǔ)句只是對(duì)各段的性質(zhì)進(jìn)行了說(shuō)明,并未向各個(gè)段寄存器真正賦值。要向各個(gè)段寄存器賦值,必須在程序中用指令語(yǔ)句實(shí)現(xiàn)。例如,用下列指令向SS賦值:MOV AX, STACKMOV SS, AX2013年4月24日共二百二十一頁(yè)4.2.4 過(guò)程(guchng)(子程序)定義偽指令PROC/ENDP過(guò)程即是子程序。匯編語(yǔ)言規(guī)定必須對(duì)過(guò)程進(jìn)行定義,以確定過(guò)程的三種屬性。過(guò)程的屬性確定之后,就可對(duì)調(diào)用指令CALL進(jìn)行正確(zhngqu)匯編,決定是產(chǎn)生近調(diào)用指令還是遠(yuǎn)調(diào)用指令。近調(diào)用時(shí),只需將返回位置的偏移地址壓棧,而遠(yuǎn)調(diào)用時(shí),需將返回位置的偏移地址和段地址都

42、壓入堆棧。2013年4月24日共二百二十一頁(yè)4.2.4 過(guò)程(guchng)(子程序)定義偽指令PROC/ENDP1過(guò)程的三種(sn zhn)屬性(1) 段屬性:過(guò)程所在段的段地址。(2) 偏移量屬性:過(guò)程所處位置的段內(nèi)偏移地址。(3) 類(lèi)型屬性(NEAR和FAR)。過(guò)程為NEAR或FAR類(lèi)型。NEAR近過(guò)程。該過(guò)程與調(diào)用指令CALL處在同一個(gè)代碼段中(段名相同)。FAR 遠(yuǎn)過(guò)程。該過(guò)程與調(diào)用指令CALL處在不同的代碼段中(段名不同)。 2013年4月24日共二百二十一頁(yè)4.2.4 過(guò)程(guchng)(子程序)定義偽指令PROC/ENDP2過(guò)程的定義過(guò)程定義的格式如下:過(guò)程名PROC NEA

43、R/FAR語(yǔ)句RET過(guò)程名ENDP其中,過(guò)程名是為該過(guò)程指定的一個(gè)名稱(chēng),與變量、標(biāo)號(hào)(bioho)的定義規(guī)則相同。PROC/ENDP必須成對(duì)出現(xiàn)。編寫(xiě)過(guò)程時(shí),最后一條指令必須是返回指令RET。它將堆棧內(nèi)保存的返回地址彈出,以實(shí)現(xiàn)程序的正確返回。2013年4月24日共二百二十一頁(yè)4.2.5 變量(binling)定義偽指令與存儲(chǔ)器分配1. 變量(binling)的三種屬性變量均有下列三種屬性。(1)段屬性:變量所在段的段地址。如例4-2中的變量HEX和ASC,它們都處在同一個(gè)數(shù)據(jù)段中,故有相同的段地址。(2)偏移屬性:變量所處位置的段內(nèi)偏移地址。例如變量HEX的偏移量為0000H, ASC的偏移

44、量為0001H。(3)類(lèi)型屬性:變量為字節(jié)、字或雙字類(lèi)型。2013年4月24日共二百二十一頁(yè)4.2.5 變量(binling)定義偽指令與存儲(chǔ)器分配變量定義符用于定義變量,也就是為變量分配存儲(chǔ)單元并可同時(shí)預(yù)置初始值,主要包括下列幾種: DB(Define Byte):定義字節(jié)型變量 DW(Define Word):定義字型變量。 DD(Define DWord):定義雙字變量。 DQ(Define QWord):定義四字變量。 DT(Define Tbyte):定義十字(sh z)節(jié)變量。分別表示存儲(chǔ)單元分配時(shí)以字節(jié)為單位、以字為單位、以雙字為單位、以4字為單位、以10字節(jié)為單位。例4-2中,

45、變量BIN和ASC均為字節(jié)型變量,各分配一個(gè)存儲(chǔ)單元。 2013年4月24日共二百二十一頁(yè)4.2.5 變量定義(dngy)偽指令與存儲(chǔ)器分配2. 變量定義及存儲(chǔ)器申請(qǐng)偽指令DB/DW/DD(1) 格式1變量名 DB/DW/DD 表達(dá)式功能:定義一變量,并為其分配(fnpi)一定數(shù)量的存儲(chǔ)單元,變量的初值由表達(dá)式的值指定。若初值可任意,則用問(wèn)號(hào)(?)表示。變量名可省。例如,在下述定義中,A DB 12H, ?B DW ?, 3456HC DD 789ABCDEH;定義了一個(gè)雙字單元,其初值為789ABCDEH。D DB A, B, C, DE DB ABCDF DW AB, CD上述各變量的存儲(chǔ)

46、情況如圖4-4所示。顯然,DBAB和DWAB的存儲(chǔ)情況不同。 2013年4月24日共二百二十一頁(yè)4.2.5 變量定義(dngy)偽指令與存儲(chǔ)器分配2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu)定義偽指令(RECORD、STRUC/ENDS)1. 記錄定義偽指令RECORD記錄是匯編語(yǔ)言的一種特殊(tsh)數(shù)據(jù)類(lèi)型。記錄的長(zhǎng)度固定,為8位或16位二進(jìn)制數(shù)。記錄中相鄰的若干位稱(chēng)為一個(gè)字段。要使用記錄,首先要定義記錄的類(lèi)型,然后定義記錄型變量,并分配存儲(chǔ)單元,最后配合某些專(zhuān)用的操作符使用記錄。2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu)定義偽指令(REC

47、ORD、STRUC/ENDS)(1)記錄類(lèi)型的定義在所有段定義語(yǔ)句之前定義記錄類(lèi)型,其格式如下(rxi):記錄名 RECORD 字段名:寬度=初值表達(dá)式,記錄名和字段名遵循標(biāo)號(hào)的取名規(guī)則。寬度表示該字段占有的二進(jìn)制位數(shù),最多不能超過(guò)16位。初值表達(dá)式表示該字段的初值,可以省略。例如COLOR RECORD X:3=5,Y:4=12,Z:9=255定義了一個(gè)記錄類(lèi)型,記錄名為COLOR,包含了三個(gè)字段X,Y,Z,寬度分別為3位、4位和9位,總寬度為16位。字段初值分別為5,12和255,如下所示。 2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu)定義偽指令(RECORD、ST

48、RUC/ENDS)當(dāng)定義中的字段總位數(shù)不能占滿(mǎn)整個(gè)字節(jié)或字時(shí),匯編程序就把所定義的字段與記錄的低位端對(duì)齊(du q)。例如COOL RECORD A:5=17, B:7=127定義了12位寬,向低端對(duì)齊,高4位未定義,如下所示。 2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu)定義偽指令(RECORD、STRUC/ENDS)(2)記錄類(lèi)型變量(binling)的定義及存儲(chǔ)器分配一般在數(shù)據(jù)段中定義記錄類(lèi)型變量,其格式如下:變量名 記錄名 變量名即為該記錄類(lèi)型的變量名,它可省缺;字段值表是給字段賦初值,中間用逗號(hào),分開(kāi),其字段值的排列順序及大小應(yīng)與該記錄說(shuō)明時(shí)各字段相一致;如果

49、記錄變量的某字段用其說(shuō)明時(shí)的缺省值,那么,可用逗號(hào)來(lái)表示;如果所有字段都如此,則可省去字段值表,但必須保留一對(duì)尖括號(hào)。 2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu)定義偽指令(RECORD、STRUC/ENDS)例如COLOR1 COLOR 定義了一個(gè)記錄型變量(binling),其字段X、Y和Z的初值分別為5(缺省值),15和9。(3)記錄的使用定義了記錄型變量之后,在程序中可像一個(gè)字節(jié)或字型變量來(lái)使用。如MOV DX, COLOR1指令執(zhí)行后,DX=1011,1110,0000,1001B=BE09H2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu

50、)定義偽指令(RECORD、STRUC/ENDS)(4)記錄專(zhuān)用操作符 MASK操作符它的操作對(duì)象為記錄的字段名,結(jié)果是字段名所在位置的位全為1,其余(qy)為0。例如AND DX, MASK ZMASK Z使得Z字段的所有位為1,其余位為0,結(jié)果MASK Z=0000,0001,1111,1111B=01FFH。 WIDTH操作符WIDTH操作符返回的是紀(jì)錄或紀(jì)錄中字段的位數(shù)。 2013年4月24日共二百二十一頁(yè)4.2.6 記錄(jl)與結(jié)構(gòu)定義偽指令(RECORD、STRUC/ENDS)2. 結(jié)構(gòu)定義偽指令STRUC/ENDS結(jié)構(gòu)是一種復(fù)雜的數(shù)據(jù)類(lèi)型。結(jié)構(gòu)體中包含若干個(gè)字段,其數(shù)據(jù)類(lèi)型一般

51、為基本(jbn)的數(shù)據(jù)類(lèi)型。像記錄一樣,要使用結(jié)構(gòu),首先要定義結(jié)構(gòu)類(lèi)型,然后定義結(jié)構(gòu)型變量,并分配存儲(chǔ)單元,最后采用“.”運(yùn)算符訪(fǎng)問(wèn)結(jié)構(gòu)體中的字段。 2013年4月24日共二百二十一頁(yè)4.2.6 記錄(jl)與結(jié)構(gòu)定義偽指令(RECORD、STRUC/ENDS) 結(jié)構(gòu)類(lèi)型的定義(dngy)在所有段定義語(yǔ)句之前定義結(jié)構(gòu)類(lèi)型,其格式如下:結(jié)構(gòu)名 STRUC 字段名1 DB/DW/DD表達(dá)式 字段名2 DB/DW/DD表達(dá)式 結(jié)構(gòu)名 ENDS2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu)定義偽指令(RECORD、STRUC/ENDS)表達(dá)式中可以包含DUP在內(nèi)的重復(fù)操作符。例如

52、COURSE STRUC NO DD ? CNAME DB Assembler SCORE DW 0COURSE ENDS定義了結(jié)構(gòu)(jigu)名為COURSE的結(jié)構(gòu)(jigu),該結(jié)構(gòu)(jigu)包含三個(gè)成員變量,結(jié)構(gòu)(jigu)體長(zhǎng)度為15(=4+9+2)個(gè)字節(jié)。2013年4月24日共二百二十一頁(yè)4.2.6 記錄與結(jié)構(gòu)(jigu)定義偽指令(RECORD、STRUC/ENDS) 結(jié)構(gòu)(jigu)類(lèi)型變量的定義及存儲(chǔ)器分配一般在數(shù)據(jù)段中定義結(jié)構(gòu)類(lèi)型變量,其格式如下:變量名 結(jié)構(gòu)名 2013年4月24日共二百二十一頁(yè)4.2.6 記錄(jl)與結(jié)構(gòu)定義偽指令(RECORD、STRUC/ENDS)

53、例如,定義一個(gè)(y )結(jié)構(gòu)變量COURSE1,其初值為缺省。COURSE1 COURSE 結(jié)構(gòu)的使用定義了結(jié)構(gòu)型變量之后,在程序中即可使用,格式如下:結(jié)構(gòu)變量名.字段名例如MOV AX, COURSE1.SCORE表示取結(jié)構(gòu)變量COURSE1的SCORE字段值。2013年4月24日共二百二十一頁(yè)4.2.7 符號(hào)(fho)定義偽指令(EQU、=、LABEL) 1. EQU(equate)偽指令EQU偽指令為常量、變量、表達(dá)式或其他符號(hào)定義一個(gè)名字,但不分配內(nèi)存空間,格式如下:符號(hào)名 EQU 數(shù)值表達(dá)式例如THREE EQU 3 ;標(biāo)號(hào)THREE 代表數(shù)值3TOP EQU $-STACK說(shuō)明:(1

54、) 使用EQU可使程序簡(jiǎn)單明了,便于修改。(2)“=”偽操作與EQU功能相似,但“=”語(yǔ)句(yj)可重復(fù)定義,而EQU不能。(3) EQU可用PURGE解除,以便重新賦予新的數(shù)值。2013年4月24日共二百二十一頁(yè)4.2.7 符號(hào)(fho)定義偽指令(EQU、=、LABEL)2. 格式: 符號(hào)名 = 表達(dá)式將表達(dá)式的值賦予符號(hào)名,以后即可用該符號(hào)名代表此表達(dá)式的值。3. LABEL偽指令LABEL偽指令為當(dāng)前存儲(chǔ)單元定義一個(gè)指定(zhdng)類(lèi)型的變量名或標(biāo)號(hào),變量名的類(lèi)型為BYTE、WORD、DWORD,標(biāo)號(hào)的類(lèi)型為NEAR和FAR。格式如下:變量名/標(biāo)號(hào) LABEL 類(lèi)型2013年4月24

55、日共二百二十一頁(yè)4.2.7 符號(hào)(fho)定義偽指令(EQU、=、LABEL)例如BYTE_ARRAY LABEL BYTEWORD_ARRAY DW 50 DUP(?)第二條語(yǔ)句定義了一個(gè)字型數(shù)組變量WORD_ARRAY,有50個(gè)字單元,100個(gè)字節(jié)。如程序中同樣(tngyng)想把這些單元作為字節(jié)單元使用,則采用第一條語(yǔ)句,即定義一個(gè)字節(jié)型數(shù)組變量BYTE_ARRAY,程序可采用下列指令訪(fǎng)問(wèn)存儲(chǔ)單元:MOV AL, BYTE_ARRAY2 ;將2號(hào)字節(jié)單元內(nèi)容送ALMOV AX, WORD_ARRAY0 ;將0號(hào)字單元內(nèi)容送AX又如,若過(guò)程TRANS既要適合遠(yuǎn)調(diào)用,也要適合近調(diào)用,可采用如

56、下語(yǔ)句:TRANS_N LABEL NEARTRANS PROC FAR這樣,遠(yuǎn)調(diào)用時(shí)采用標(biāo)號(hào)TRANS,近調(diào)用時(shí)則采用標(biāo)號(hào)TRANS_N。2013年4月24日共二百二十一頁(yè)4.2.8 程序模塊定義(dngy)偽指令(NAME/END、PUBLIC/EXTRN )匯編語(yǔ)言程序可劃分為許多模塊,對(duì)每個(gè)模塊獨(dú)立地進(jìn)行匯編,然后連接形成可執(zhí)行文件。1. NAME/END偽指令NAME/END偽指令定義一個(gè)模塊,作為一個(gè)獨(dú)立的匯編單位,匯編處理只進(jìn)行到模塊結(jié)束(jish)語(yǔ)句END為止。NAME缺省時(shí)模塊若使用了TITLE語(yǔ)句,則TITLE語(yǔ)句中前6個(gè)字符為模塊名,否則源文件名將作為模塊名。格式如下:

57、NAME 模塊名 .END 標(biāo)號(hào)2013年4月24日共二百二十一頁(yè)4.2.8 程序模塊定義(dngy)偽指令(NAME/END、PUBLIC/EXTRN )2. PUBLIC偽指令PUBLIC偽指令用來(lái)說(shuō)明本模塊中被定義的哪些符號(hào)(常量(chngling)、變量、標(biāo)號(hào)、過(guò)程名)可以被其他模塊所引用,格式如下:PUBLIC 符號(hào)名表例如,在模塊A中,定義了字型變量ABC,常量BCD,近過(guò)程CDE,它們將在其它模塊中被引用,則在模塊A中需做如下說(shuō)明:PUBLIC ABC,BCD,CDE2013年4月24日共二百二十一頁(yè)4.2.8 程序模塊定義(dngy)偽指令(NAME/END、PUBLIC/EX

58、TRN )3. EXTRN偽指令EXTRN偽指令用來(lái)說(shuō)明本模塊中哪些符號(hào)(常量、變量、標(biāo)號(hào)、過(guò)程名)是引用其它模塊已經(jīng)被PUBLIC所說(shuō)明的,格式如下:EXTRN 符號(hào):類(lèi)型,符號(hào)的類(lèi)型可為BYTE、WORD、DWORD、NEAR、FAR和ABS(符號(hào)常量)等,必須與它們?cè)谄渌K中定義的類(lèi)型一致。例如,在模塊B中對(duì)模塊A中的上述(shngsh)符號(hào)進(jìn)行引用,語(yǔ)句為:EXTRN ABC:WORD,BCD:ABS,CDE:NEAR2013年4月24日共二百二十一頁(yè)4.3 匯編語(yǔ)言(hu bin y yn)屬性操作符4.3.1 分析操作符分析操作符也叫數(shù)值回送(Value returning)操作

59、符,它有TYPE、LENGTH、SIZE、OFFSET、SEG 5種。這些操作符把一些特征或存儲(chǔ)器地址的一部分作為數(shù)值回送。下面分別說(shuō)明各個(gè)操作符的功能。1. TYPE格式:TYPE Variable或label功能:如果是變量,則匯編程序?qū)⒒厮驮撟兞康囊宰止?jié)數(shù)表示的類(lèi)型(lixng),DB為1,DW為2,DD為4,DQ為8,DT為10。如果是標(biāo)號(hào),則匯編程序?qū)⒒厮痛碓摌?biāo)號(hào)類(lèi)型的數(shù)值:NEAR為1,F(xiàn)AR為2。 2013年4月24日共二百二十一頁(yè)4.3 匯編語(yǔ)言(hu bin y yn)屬性操作符2. LENGTH格式為:LENGTH Variable對(duì)于變量中使用DUP的情況,匯編程序(h

60、u bin chn x)將回送分配給該變量的單元個(gè)數(shù),且只返回變量定義時(shí)最外層DUP的重復(fù)次數(shù)。而對(duì)于其他情況則回送1。如,定義了三個(gè)變量BUF1 DB 100 DUP(0)BUF2 DW 10, 5 DUP(2)BUF3 DD 5 DUP(1,2 DUP(0)則 LENGTH BUF1=100, LENGTH BUF2=1, LENGTH BUF3=5。 2013年4月24日共二百二十一頁(yè)4.3 匯編語(yǔ)言(hu bin y yn)屬性操作符3. SIZE格式為:SIZE Variable其匯編的值為L(zhǎng)ENGTH Variable * TYPE Variable,即回送直接分配給該變量(bin

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論