2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩46頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、匯編語言程序設計,第4章 匯編語言程序格式,Assembly Language Programming,2,? 匯編程序功能 ? 偽操作 ? 匯編語言程序格式 ? 匯編語言程序的上機過程,第4章 匯編語言程序格式,3,4.1 匯編程序功能,4.1.1. 程序運行步驟及生成的文件,MASMPlus,MASM.EXE,LINK.EXE,4,4.2 基本語法,和其他計算機語言一樣,80X86匯編語言的基本語法主要包括:

2、 1. 詞法(字符集、標識符、保留字) 2. 句法(指令語句、偽指令語句) 3. 程序結構的若干規(guī)定。,5,4.2.1 字符集 匯編語言的基本元素是字符,字符按一定語法規(guī)則的有序組合就是語句。 80X86 匯編語言允許使用的字符是: 英文字母: A~Z 和 a~z 數(shù)字字符: 0~9 算術運算符:+ - * / 關系運算符:< > = 分隔符:

3、, ; : ( ) [ ] ‘ SPACE TAB 控制符: CR,LF,F(xiàn)F 其它字符: $ & _ ? · @ % !,基本語法,6,4.2.2 標識符,標識符用來對程序中的常量、變量、記錄、結構、段、過程、模塊等進行命名。應符合如下規(guī)定: 標識符第一個字符必須是字母、?、_ 或 @ 從第二個字

4、符開始可以是字母、數(shù)字、?、_ 或 @ 一個標識符的長度可以由131個字符組成。如: _sum x @block ?tablename 等均是合法的變量名。,基本語法,7,4.2.3 保留字80X86中的寄存器名、指令助記符、偽指令助記符、表達式運算符以及屬性操作符等都是系統(tǒng)專用的保留字,不能做標識符。如:AX、BX、ADD、DB、DW、DD、+、-等,都是保留字。,8,⑴ 80X86匯編語言有兩

5、類語句 指令性語句 匯編指令,經匯編后產生一一 對應的機器指令代碼,在程序運行時使機器產生動作。 【標號:】 指令助記符 【操作數(shù)】【;注釋】 例: GOON: ADD AX,1 ;AX加1 偽指令語句 對源程序匯編時由匯編程序處理。 【名字】 偽操作命令 【操作數(shù)】【;注釋】 例: X DB 100⑵ MASM對語句格式的要求: 大小寫無關。 每條語句必須占

6、1行,但可以使用續(xù)行符“\”。 為了提高可讀性,應該使各個域對齊。,4.2.4 語句,9,4.2.5 程序結構 80X86匯編語言程序,.386data_seg1 segment……data_seg1 endsdata_seg2 segment……data_seg2 endscode_seg segmentassume cs:code_seg, ds:data_seg1, es:data_seg2

7、start:movax, data_seg1movds, axmovax, data_seg2moves, ax…… code_seg endsend start,一個源程序可以分模塊編寫,每一模塊獨立匯編生成OBJ文件,多模塊最后連接成一個可執(zhí)行程序,包含啟動地址的模塊稱主模塊。,10,4.3 偽操作,偽操作 提供保證指令正確匯編的信息,是匯編程序對源程序進行匯編時處理的操作。

8、4.3.1 處理器選擇偽操作4.3.2 段定義偽操作4.3.3 程序開始和結束偽操作4.3.4 數(shù)據(jù)定義、存儲分配及表達式賦值偽操作4.3.5 賦值偽操作4.3.6 地址計數(shù)器與對準偽操作4.3.7 基數(shù)控制偽操作,11,4.3.1 處理器選擇偽指令,在缺省方式下,MASM只承認8086指令。 為了使用更高的CPU指令,必須使用處理器選擇偽指令,主要包括: .8086

9、 .286/.286P(含287) .386/.386P (含387) .486/.486P .586/.586P .686/.686P .MMX .XMM分別表示其后面的代碼使用相應CPU的指令。其中,結尾的‘P’表示使用特權指令。,12,4.3.2 段定義偽操作,1.完

10、整的段定義偽操作 ⑴基本形式 段名 SEGMENT [定位類型] [組合類型][使用類型][ 類別] ……. 段名 ENDS,數(shù)據(jù)/附加/堆棧段: 存儲單元分配和數(shù)據(jù)定義代碼段: 指令、偽指令段名: 作為操作數(shù)出現(xiàn)在指令中時,MASM將其視為 立即數(shù),表示段地址,定位類型:BYTE(不對齊),WORD(偶數(shù)邊界),DWORD(4的倍數(shù)),QWORD(8的倍數(shù)),PARA(小段邊界

11、,16的倍數(shù)。為默認值),PAGE(頁邊界,256)組合類型:(連接時的段合并方法) PRIVATE:私有段,連接時不與其它同名段合并。(默認) PUBLIC :按連接命令指定的順序合并同名段,每模塊 從小段邊界開始。 COMMON: 重疊存放同名段(覆蓋模式) AT 表達式:段地址由表達式計算(不能用此方法指定 代碼段) MEM

12、ORY:與PUBLIC相同 STACK :合并同名堆棧段,段定義偽操作,段的起始地址的邊界值,14,使用類型:USE16 使用16位尋址方式(段長64KB) USE32 使用32位尋址方式(段長4GB) 類別:類名,用于段的合并。⑵明確段寄存器和段的關系 ASSUME 段寄存器 : 段名[,段寄存器 : 段名…] 明確指出段與段寄存器的缺省對應關系,即告訴MASM某個段的段地址在哪

13、個段寄存器里。實際上,數(shù)據(jù)段之所以成為數(shù)據(jù)段,是由于DS指向它。,段定義偽操作,15,⑶ 取消段寄存器和段的關系 ASSUME NOTHING⑷ 設置段寄存器的初值ASSUME 只是告訴匯編器段寄存器指向哪個段,并不設置 段寄存器的值;CS與IP的初值 不能在程序中顯式設置,由系統(tǒng)自動設置為END后指定的起始地址;DS、ES的初值 必須在程序中用MOV指令設置;SS與SP的初值 可在程序中顯式設置。然而,若堆棧

14、段定義時給出了屬性STACK,則由系統(tǒng)自動設置;,段定義偽操作,16,例:定義用戶堆棧 stack_seg segment dw 40H dup (?) tos label word stack_seg ends code_seg segment ……

15、 mov ax, stack_seg mov ss, ax mov sp, offset tos …… code_seg ends,,,,STACK,,40H,(SP),,(SS),段定義偽操作,低地址,棧底,高地址,17,data_seg1 segment…data_seg1 ends

16、 ; 定義數(shù)據(jù)段data_seg2 segment…data_seg2 ends ; 定義附加段code_seg segment assume cs:code_seg, ds:data_seg1, es:data_seg2start: mov ax, data_seg1 mov ds, ax mov ax, dat

17、a_seg2 mov es, ax ; 段地址?段寄存器 …code_seg ends end start,18,2.簡化段定義偽操作(自學)⑴ MODEL 偽操作 .MODEL 內存模式 [, 語言類型] [, 堆棧選項] ; 用來指出存儲模式內存模式: Tiny Small Medium Compact

18、 Large Huge Flat語言類型:C BASIC FORTRAN PASCAL SYSCALL STDCALL堆棧類型:NEARSTACK 或 FARSTACK⑵ 基本形式 .CODE [名] .DATA .DATA? .FARDATA [名] .FARDATA? [名] .CONST .STACK [尺寸] 缺省為1KB,.model sm

19、all, stdcall.stack.datasource db 33h,34h,35h,36h;在數(shù)據(jù)區(qū)定義4個字符數(shù)據(jù)target db 80 dup( );分配復制數(shù)據(jù)空間4×20=80.code.startupmov ax,ds,19,mov es, axcldmov si, offset sourcemov di, offset targetmov cx, 80rep mov

20、sb;串傳送mov si, 0;顯示mov bx, offset targetagain:mov dl, [bx+si]mov ah, 2int 21hinc sicmp si, 80jb again.exit 0end,20,4.3.3 程序開始和結束偽操作,⒈指定程序名字 NAME module_name TITLE text⒉

21、源程序結束: END 地址 功能: 表示匯編語言源程序到此結束,對END之后的語句不再進行匯編。可選的地址指出程序執(zhí)行的起始點,通常是標號或過程名。 若程序包含多個源文件,則每個源文件的最后必須有一條END語句,但只有主模塊文件可以指出執(zhí)行的起始地址,,21,4.3.4數(shù)據(jù)定義及存儲器分配偽操作,⒈格式: [變量] 類型助記符 操作數(shù) [ , 操作數(shù) , … ] [ ; 注釋

22、]類型助記符 DB, DW, DD, DF, DQ, DT.操作數(shù) 可以是常數(shù)、用 EQU 或 = 定義的符號常量、表達式、?和DUP子句等。其中,?表示只保留內存空間,未定義初始值。DUP子句的格式為: 重復次數(shù) DUP (操作數(shù),...,操作數(shù))DATA_WORD DW 100, 100HDATA_BYTE DB 100 DUP (?)MESS1

23、DB ‘AB’MESS2 DW ‘AB’,BYTE, WORD, SWORD, DWORD, SDWORD, FWORD, QWORD, TBYTE, REAL4, REAL8, REAL10,22,例1: OPER1 DB ?, ? OPER2 DW ?, ? … MOV OPER1, 0 ; 字節(jié)指令

24、 MOV OPER2, 0 ; 字指令例2: OPER1 DB 1, 2 OPER2 DW 1234H, 5678H … MOV AX, OPER1+1 × MOV AL, OPER2 × 類型不匹配 MOV AX, WORD PTR OPER1+1

25、 MOV AL, BYTE PTR OPER2 (AX)=3402H (AL)=34H,數(shù)據(jù)定義及存儲器分配偽操作,23,2.說明(1)變量可以定義在任何段(包括代碼段),但一般定義在 數(shù)據(jù)段。(2)用DW/DD/DQ/DF/DT定義的數(shù)據(jù)在內存按“低字節(jié)在低地址”的方式存放。例如:S1DB'AB'; 等價于 S1 DB 41H, 42H S2DW'

26、AB'; 等價于 S2 DW 4142H (3)當DW與DD后的操作數(shù)是地址表達式時,分別表示其16位偏移地址和32位分段地址(段地址在高字,偏移地址在低字)。例如:XDB10 DUP (?)ADDR1DW X ; ADDR1的內容(字)為變量X的偏移地址ADDR2DDX ; ADDR2的高字為X的段地址, ;低字為X的偏移地址,數(shù)據(jù)定義及存儲器分配偽操作,24,(4)

27、變量在定義后,其類型便被確定,使用時要注意類型匹配。 例如:OP1 DB?, ? OP2 DW ?, ?下列兩條指令執(zhí)行不同類型的操作: MOV OP1 + 1, 0 ; 將0作為1個字節(jié)送到地址OP1 + 1 MOV OP2 + 2, 0 ; 將0作為1個字送到地址OP2 + 2然而,下列兩條指令是錯誤的: MOV OP1,

28、AX; 類型不匹配 MOV OP2, AL; 類型不匹配 若希望進行與變量類型不一致的操作可以采用下面介紹的LABEL偽指令或類型操作符PTR等。,數(shù)據(jù)定義及存儲器分配偽操作,25,5. LABEL ⑴基本形式:名字LABEL類型 ⑵功能:將名字作為一個符號地址,指定其類型,地址由所在位置確定。然而,并不為名字分配內存空間。 ⑶說明: 當類型是BYTE、WORD、D

29、WORD時,名字作為相應類型的變量; 當類型是NEAR或FAR時,名字作為相應類型的標號。,數(shù)據(jù)定義及存儲器分配偽操作,26,【例】 定義地址相同、類型不同的兩個變量。balabel bytewadw50 dup (?) 將100個字節(jié)的數(shù)組首地址賦予兩個不同類型的變量:字節(jié)類型變量BA與字類型變量WA。如: mov wa + 2, 0 ;將0作為1個字送到地址WA + 2 mov ba + 2, 0

30、 ;將0作為1個字節(jié)送到地址BA + 2盡管WA + 2與BA + 2指向同一內存地址,兩條指令的操作類型不同,數(shù)據(jù)定義及存儲器分配偽操作,27,4.3.5 賦值偽操作,⒈表達式賦值偽操作(EQU) 不占存儲單元 格式: 表達式名 EQU 表達式 CONSTANT EQU 256 ALPHA EQU 7 BETA EQU ALPHA-2

31、 ⒉ “=”偽操作 (允許重復定義) 格式:變量=表達式 EMP=7 … EMP=EMP+1,28,4.3.6 地址計數(shù)器$,⒈ $ 保存當前正在匯編的指令的地址例: ORG $+8 ; 跳過8個字節(jié)的存儲區(qū) JNE $+6 ; 轉向地址是JNE的首址+6⒉ $ 用在偽操作的參數(shù)字段——表示地址計數(shù)器的當前值 ARRAY DW 1, 2 , $+4 ,

32、 3 , 4 , $+4,29,4.3.7 基數(shù)控制與對準偽操作,⒈基數(shù)控制偽操作 .RADIX格式:.RADIX 表達式 (2,8,10,16) 功能: 規(guī)定無標記數(shù)的基數(shù)例: .RADIX 16 MOV BX, 0FF MOV BX, 178D⒉ 對準偽操作EVEN 格式: EVEN功能:使下一地址從偶地址開始A DB ‘morning’EVENB

33、DW 2 DUP (?),30,⒊對準偽操作ORG格式: ORG 常數(shù)表達式 功能: 使下一地址是常數(shù)表達式的值 ORG 100H START: …...⒋ 對準偽操作ALIGN格式: ALIGN boundry 功能: 使下一地址從boundry的整數(shù)倍開始, boundry的值為2的冪. ALIGN 4 ARRAY DD 100 DUP(?),,基數(shù)控制與對準偽操作,3

34、1,4.4 匯編語言程序格式,數(shù)據(jù) 是指令和偽指令語句中操作數(shù)的基本組成部分,它的大小和屬性對機器語言代碼的生成有直接關系。匯編語言能識別的數(shù)據(jù)是常量、變量和標號。 4.4.1 常量 4.4.2 變量 4.4.3 標號 4.4.4 表達式和運算符,32,4.4.1 常量 常量是匯編時已經確定的值,主要用于偽指令中給變量賦值,或作為指令語句中的立即數(shù)或存儲器操作數(shù)的組成部分(如位移量)。 為了便于程序設計,

35、常量有多種表示形式,缺省的基數(shù)是十進制,且可以用.RADIX改變。 常量可以用數(shù)值形式直接寫在匯編語言的語句中,也可以預先為它定義一個名字,供程序員編程時直接引用。這里,用名字表示的常量為符號常量,符號常量使用偽指令EQU或=進行定義。 例: PI EQU 3.1415926e+0,匯編語言數(shù)據(jù)與表達式,33,4.4.1 常量,匯編語言數(shù)據(jù)與表達式,34,變量 用于定義存儲器中的數(shù)據(jù),在程序運行過程中可修改。為

36、了便于對變量的訪問,變量常常以變量名的形式出現(xiàn)在程序中。變量名可以認為是存放數(shù)據(jù)的存儲單元符號地址,它的三個屬性是: 段屬性:指變量所在段的段基址 偏移地址屬性: 指變量所在段中的偏移量 類型屬性: 指變量占用存儲單元的字節(jié)數(shù) 例:XBYTE DB 1,2,3 XWORD DW 123,456,789,匯編語言數(shù)據(jù)與表達式,4.4.2 變量,35,標號 是給指令性語句

37、所在地址取的名字,它表明該指令 在存儲器中的位置,可作為轉移類指令的操作數(shù),以確定程序轉移的目標地址。和變量一樣,標號也有以下三個屬性: 段屬性:指標號所在段的段基址 偏移地址屬性:指標號所在段中的偏移量,即標號所在 地址與段基址之間的字節(jié)距離。 距離屬性(或類型屬性):標號可作為轉移和調用指令的目標地址,也可作為過程定義偽指令的過程名。 有NEAR(段內,隱含)和FAR(段間)之分。 可以用LABEL偽指令加以改變

38、。,匯編語言數(shù)據(jù)與表達式,4.4.3 標號,36,表達式 由常量、變量、標號和操作符構成。有兩類: 數(shù)值表達式 結果是數(shù)值; 地址表達式 結果是存儲器地址.格式: 變量名/標號名 ± 常數(shù) 類型由相應的變量或標號確定。 兩個地址表達式的差 表示兩個地址之間的距離(字節(jié)數(shù)),兩個地址必須在同一個段內。 注意:不能將兩個地址表達式相加。 $是一個特殊的地址表達式,表示當前地址,即地址

39、計數(shù)器的當前值。,匯編語言數(shù)據(jù)與表達式,4.4.4 表達式和運算符,存放數(shù)據(jù),稱為變量;存放指令,稱為標號。,37,⑴ 算術操作符七種:+、-、*、/、MOD、SHL、SHR結果類型:均為整數(shù) ;例: NUM=15*4MOV DX,BLOCK +(6 - 1)*2;將BLOCK數(shù)組的第6個字傳送到DX寄存器MOV AL,00001010B SHL 4 ;(AL)=10100000B; 將000

40、01010B 邏輯左移4位 例: 數(shù)組ARRAY定義如下,把數(shù)組長度存入CX的指令 MOV CX,(END-ARRAY)/2;程序在匯編時將表達式形成指令MOV CX,7,匯編語言數(shù)據(jù)與表達式,表達式和運算符,38,⑵ 邏輯操作符:AND, OR, XOR, NOT 只能用于數(shù)字表達式中 例: IN AL,PORT_VAL OUT PORT_VAL A

41、ND 0FEH, AL ;輸出總在偶數(shù)端口上例: OPR1 EQU 25 OPR2 EQU 7 …… AND AX, OPR1 AND OPR2,表達式和運算符,匯編語言數(shù)據(jù)與表達式,39,⑶ 關系操作符: EQ, NE, LT, LE, GT, GE計算結果為邏輯值:真 0FFFFH

42、 假 0000H 例:MOV FID, (OFFSET Y - OFFSET X) LE 128 X: ……Y: ……若?128(真),匯編結果 MOV FID, -1若?128(假),匯編結果 MOV FID, 0例: MOV AX,5 EQ 101B ;(AX)= 0FFFFH MOV

43、 AH,10H GT 16 ;(AX)=0,表達式和運算符,匯編語言數(shù)據(jù)與表達式,40,⑷數(shù)值回送操作符 運算對象:變量或標號。格式:運算符 運算對象 。 結果: 數(shù)值。① SEG 返回變量/標號所在段的段基址;② OFFSET 返回變量/標號所在段內的偏移地址;③TYPE 返回變量/標號的類型屬性;④LENGTH 加在變量名之前,返回變量中所定義的元素個數(shù)。 若變量

44、是用DUP說明的,則返回DUP前面的數(shù)值; 否則返回的值總是1。⑤SIZE 加在變量名之前,返回變量所占的總字節(jié)數(shù),且等于 LENTH和TYPE兩個運算符返回值的乘積。,表達式和運算符,匯編語言數(shù)據(jù)與表達式,變量:DB DW DD DF DQ DT 標號:NEAR FAR類型值: 1 2 4 6 8 10

45、 -1 -2,41,;TYPEN1 DB 30H,31H,32HN2 DW 4142H,4344HN3 DD 12345678HLAB : MOV AL,TYPE N1MOV AL , TYPE N1 ; (AL)=1MOV AL , TYPE N2 ; (AL)=2MOV AL , TYPE N3 ; (AL)=

46、4,;SIZEN1 DB 10H DUP (?)N2 DW 4142H,4344HN3 DB ‘12345678’LAB: MOV AL,TYPE N1MOV AL,SIZE N1 ; (AL)=16MOV AL,SIZE N2 ; (AL)=2MOV AL,SIZE N3 ; (AL)=1,匯編語言數(shù)據(jù)與表達式,;LENTHN1 DB 10H

47、 DUP (?)N2 DW 4142H,4344HN3 DB ‘12345678’LAB : MOV AL , TYPE N1MOV AL , LENTH N1 ; (AL)=16MOV AL , LENTH N2 ; (AL)=1MOV AL , LENTH N3 ; (AL)=1,42,⑸修改屬性運算符 用來修改變量、標號或地址表達式的屬性 ① “

48、:” ② PTR ③ THIS ④ HIGH和LOW運算符⑤ SHORT ⑥ 圓括號運算符( ) ⑦ 方括號運算符[ ] ⑧ 結構和記錄的專用運算符 · 、記錄字段名、MASK、WIDTH,匯編語言數(shù)據(jù)與表達式,43,①“ :” 用來臨時給地址表達式指定一個段屬性,自動生成段跨越 前綴 例:MO

49、V AX,ES:[BX] MOV BL,DS:[BP] 注意:CS和ES不能被段跨越,堆棧操作時SS也不能被跨越。 ②PTR 用來指明某個地址表達式的類型或距離屬性,或者使它們臨時兼有與原定義不同的類型屬性。 <類型> PTR <地址表達式>例: DAT DB 4,5,7 ADD BYTE P

50、TR [DI],4 ;指明目標操作數(shù)為字節(jié)類型 JMP DWORD PTR [BX] ;指明為段間轉移 MOV AX,WORD PTR DAT ;臨時修改DAT為字,(AX)=0504H,匯編語言數(shù)據(jù)與表達式,44,③THIS 將其后所指定的類型或距離屬性賦給當前的變量、標號和地址表達式,但不分配新的存儲單元,下一個分配的存儲單元的段和偏移地址就是它的段和偏移地

51、址.格式如下: THIS <類型>這種運算往往與EQU或=連用,為當前存儲單元定義一個指定類型的變量或標號,類型屬性可以識BYTE、WORD、DWORD、NEAR、FAR.例: GAMA EQU THIS BYTE BETA EQU THIS FAR不管GAMA原來是什么類型,從本語句開始,GAMA將成為字節(jié)變量,而不管BETA原來是什么距離屬性.從本

52、語句開始,BETA將成為FAR遠標號。 A EQU THIS BYTE B DD 12345678H C EQU WORD PTR B則第一條語句將緊跟在它后面的雙字變量定義為字節(jié)屬性,并命名為A;第三條語句將雙字變量B定義為字屬性并命名為C,供需要字類型變量時使用。,45,④HIGH/HIGHWORD和LOW/L

53、OWWORD運算符 分別用于從運算對象中分離出高字節(jié)/字和低字節(jié)/字。例如: K1 EQU 1234H MOV AL, LOW K1 ;(AL)=34H⑤SHORT 用于說明轉移指令的目標地址與本指令之間的字節(jié)距離在-128~127范圍內,應用例子見JMP段內短轉移指令。 ⑥圓括號運算符( ) 用于改變運算符的優(yōu)先

54、級別,()運算的優(yōu)先級別最高。 K1 = 10 OR 5 AND 1 ;K1=0BH K2 =(10 OR 5) AND 1 ;K1=0BH,46,⑦方括號運算符[ ] 該運算符可以是數(shù)組變量的下標或地址表達式,以區(qū)別操作數(shù)和操作數(shù)地址。例如: ALPHA DB 30H,31H,32H,33H,34H ;ALPHA為數(shù)組變量 MOV

溫馨提示

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

評論

0/150

提交評論