![]()
程序設(shè)計首先遇到的問題似是使用何種語言與機(jī)器對話,其次再把人們?yōu)榻鉀Q某問題的解題步驟(即程序)輸入機(jī)器內(nèi),最后啟動機(jī)器執(zhí)行,獲得結(jié)果。
用機(jī)器語言(即機(jī)器碼)直接編程序(目標(biāo)程序),不要翻譯,計算機(jī)可直接執(zhí)行。這樣程序最直接,執(zhí)行速度最快,但編程序難,修改難。匯編語言是用指令的助記符、符號地址、標(biāo)號等書寫的語言,用這種語言編寫的程序稱為匯編語言程序,源程序不能由機(jī)器直接執(zhí)行,要翻譯成機(jī)器語言組成的目標(biāo)程序,然后執(zhí)行目標(biāo)程序。
把匯編語言源程序翻譯成機(jī)器語言目標(biāo)程序的過程叫做匯編,完成匯編任務(wù)的程序叫做匯編程序。匯編程序除了能把緣程序翻譯成目標(biāo)程序外,還能對源程序進(jìn)行語法檢查,并指出錯誤(如非法格式,未定義符號等)。能按用戶要求自動分配存儲區(qū)(程序區(qū)、數(shù)據(jù)區(qū)、堆棧區(qū)),自動把各種進(jìn)制數(shù)轉(zhuǎn)換成二進(jìn)制數(shù),以及計算表達(dá)式值等。
用8086匯編語言編寫的源程序要由Intel公司提供的ASM86匯編程序翻譯成目標(biāo)程序,然后機(jī)器才能執(zhí)行。所以,源程序的書寫格式和要求,應(yīng)符合ASM86的語法規(guī)定。
![]()
掌握匯編語言程序設(shè)計的格式,語句行的構(gòu)成,熟練掌握幾個常用的偽指令,能區(qū)分BIOS中斷和DOS中斷。能自己獨(dú)立編寫匯編程序。
![]()
§1 編語言源程序的格式
§2 語句行的構(gòu)成
§3 偽指令(指示性語句)
§4 BIOS中斷和DOS中斷
§5 8086匯編語言程序設(shè)計
§6 實數(shù)運(yùn)算
§7 匯編程序(MASM)
§8 連接程序(LINK)
![]()
匯編語言程序設(shè)計的格式,各種偽指令(指示性語句)匯編語言程序的幾種結(jié)構(gòu)。
![]()
1、對初學(xué)者來說,按照順序?qū)W習(xí),并且掌握好該節(jié)的知識點,再接著下節(jié)的學(xué)習(xí),學(xué)后要及時鞏固。
?。病⒕帉懸恍┳约旱男〕绦騺碚莆毡菊碌闹R。
![]()
格式 語句行 偽指令 匯編 連接
![]()
1、《微型計算機(jī)技術(shù)及應(yīng)用》,戴梅萼等編著,第二版,清華大學(xué)出版社
2、《微型計算機(jī)原理》,季維法等編著,第一版,電子科技大學(xué)出版社
3、《微型計算機(jī)原理—常見題型解析及模擬題》,武自芳主編,西北工業(yè)大學(xué)出版社
4、《80X86/80X87匯編語言程序設(shè)計》,洪志全等編著,電子科技大學(xué)出版社
§4.1 編語言源程序的格式
用助記符編寫的程序,稱為"匯編語言源程序",匯編語言源程序(文件擴(kuò)展名ASM)需要翻譯為機(jī)器指令表示的目標(biāo)程序(文件擴(kuò)展名OBJ),這一翻譯過程稱為"匯編",一般使用稱為"匯編程序"的程序來進(jìn)行翻譯。典型的匯編程序如Microsoft MASM 5.0。 目標(biāo) 程序不能被操作系統(tǒng)裝入和執(zhí)行,為了讓操作系統(tǒng)裝入和執(zhí)行,必須把目標(biāo)程序連接為操作系統(tǒng)下的可執(zhí)行文件,如DOS、Windows下 的可執(zhí)行文件擴(kuò)展名為EXE或COM。連接過程一般使用連接程序Link.EXE來完成(如圖4-1所示)。

匯編語言指令與機(jī)器指令間有一一對應(yīng)關(guān)系,可以充分發(fā)揮CPU的性能。
另外,使用高級語言編寫的源程序,必須通過"編譯"、"連接"形成可執(zhí)行文件(如圖4-2所示)。

為了用匯編程序(如MASM)把源程序翻譯為機(jī)器碼,用連接程序(如LINK)構(gòu)造可執(zhí)行文件(EXE或COM),源程序的編寫必須
滿足一定的語法格式。
匯編語言源程序的一種典型格式如下。
該程序在屏幕上顯示一字符串"This is a string"后回車換行。
DATA SEGMENT PARA PUBLIC 'DATA'
Message DB 'Hello,World!', 0DH, 0AH
DB '$'
DATA ENDS
STACK SEGMENT STACK 'STACK'
DW 100H DUP (0)
STACK ENDS
CODE SEGMENT PARA PUBLIC 'CODE'
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
ORG 100H
MAIN PROC FAR START:MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DX,OFFSET Message
MOV AH,09H
INT 21H
EXIT:MOV AX,4C00H
INT 21H
MAIN ENDP
CODE ENDS
END START
編寫該程序的過程如下:
(1) 用任何ASCII碼文本編輯程序,如QE.EXE,PE.EXE,WPS,EDIT等,錄入該程序 。
(2) 把錄入內(nèi)容存為一個文件,如TEST.ASM。(源程序文件)
(3) 用匯編程序MASM.EXE把TEST.ASM翻譯為目標(biāo)文件TEST.OBJ。其操作如下:(↙表示按回車鍵)
H:\961234>masm↙
Microsoft (R) Macro Assembler Version 5.00
Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.
Source filename [.ASM]: test↙ ;輸入源程序文件名(擴(kuò)展名可省略)
Object filename [test.OBJ]: ↙;缺省目標(biāo)文件名為TEST.OBJ
Source listing [NUL.LST]: ↙
Cross-reference [NUL.CRF]: ↙
51470 + 435154 Bytes symbol space free
0 Warning Errors ;0個警告錯誤
0 Severe Errors ;0個嚴(yán)重錯誤
如果匯編程序能夠翻譯源程序,報告"0個警告錯誤"、"0個嚴(yán)重錯誤",同時,生成目標(biāo)文件TEST.OBJ。
(4) 用連接程序LINK.EXE把目標(biāo)文件TEST.OBJ連接為可執(zhí)行文件TEST.EXE。其過程為:
H:961234>link↙
Microsoft (R) Overlay Linker Version 3.60 Copyright (C) Microsoft Corp 1983-1987. All rights reserved.
Object Modules [.OBJ]: test↙ 輸入目標(biāo)文件名(擴(kuò)展名可省略)
Run File [TEST.EXE]: ↙ 缺省可執(zhí)行文件名為TEST.EXE
List File [NUL.MAP]: ↙
Libraries [.LIB]: ↙
(5) 運(yùn)行可執(zhí)行文件TEST.EXE。
H:961234>test↙
屏幕上將顯示一串字符 Hello,World! 。
觀察上述源程序,可以發(fā)現(xiàn)其結(jié)構(gòu)特點:
1、源程序是分段的,由若干段組成
段的結(jié)構(gòu)為:
段名 SEGMENT 段屬性
語句行
┇
語句行
段名 ENDS
例如
程序中的段,按性質(zhì),可分為代碼段、數(shù)據(jù)段、堆棧段。(附加段也是數(shù)據(jù)段)。段的數(shù)量原則上不受限制,段的順序原則上可以任意,但一般把堆棧段和數(shù)據(jù)段放在代碼段的前面。
2、 語句行有兩種類型
(1) 指令性語句
標(biāo)號:助記符 操作數(shù) ; 注釋
如,EXIT: MOV AX,4C00H
匯編程序把指令性語句翻譯為機(jī)器碼,運(yùn)行可執(zhí)行文件(TEST.EXE)時,CPU將執(zhí)行這些機(jī)器碼。
(2) 偽指令語句(指示性語句)
名字 定義符 操作數(shù) ;注釋
如:DATA SEGMENT PARA PUBLIC 'DATA'
Message DB 'Hello,World!', 0DH, 0AH均是偽指令語句。
偽指令語句用于告訴匯編程序(MASM)和連接程序(LINK),如何翻譯源程序和連接目標(biāo)程序。偽指令語句不產(chǎn)
生機(jī)器碼。
兩種語句行中,有些部分不可缺少,有些部分可以省略。 其中,分號后面的注釋,僅供程序員閱讀或交流,匯編
程序(MASM)和連接程序(LINK)均不對注釋作任何處理。
3、 整個源程序以END語句結(jié)束
END START
END是一個偽指令,告訴匯編程序(MASM),需要翻譯的語句到此為止,停止翻譯。
END后的START,是一個語句的標(biāo)號,如START: MOV AX,DATA
用于通知連接程序(LINK),TEST.EXE程序的第一條被執(zhí)行指令的地址(稱為"啟動地址")。
注:END決不是告訴TEST.EXE程序結(jié)束運(yùn)行!。TEST.EXE程序由以下兩條指令結(jié)束運(yùn)行:
MOV AX,4C00H
INT 21H
§4.2 語句行的構(gòu)成
本節(jié)概述
語句行是由標(biāo)記及分隔符按照一定的規(guī)則組織起來,標(biāo)記是ASM 86源程序的最小的有意義的單位。
教學(xué)目標(biāo)
1、標(biāo)記的構(gòu)成
2、標(biāo)示符的構(gòu)成
3、掌握關(guān)鍵字
學(xué)習(xí)內(nèi)容
標(biāo)記(Tokens)
符號(Symbols)
表達(dá)式(Expressions)
語句(Statements)
重點難點
掌握標(biāo)記和標(biāo)示符的組成原則,關(guān)鍵字的使用。
學(xué)習(xí)方法
掌握標(biāo)記和標(biāo)示符的組成原則,關(guān)鍵字的使用。
關(guān)鍵字
標(biāo)記 符號 保留字 操作數(shù) 運(yùn)算符
參考資料
1、《微型計算機(jī)技術(shù)及應(yīng)用》,戴梅萼等編著,第二版,清華大學(xué)出版社
2、《微型計算機(jī)原理》,季維法等編著,第一版,電子科技大學(xué)出版社
3、《微型計算機(jī)原理—常見題型解析及模擬題》,武自芳主編,西北工業(yè)大學(xué)出版社
4、《80X86/80X87匯編語言程序設(shè)計》,洪志全等編著,電子科技大學(xué)出版社
§4.2.1標(biāo)記
標(biāo)記包含ASM 86的字符集、標(biāo)識符、保留字、界符、常數(shù)、注釋。
1、ASM 86的字符集
ASM 86中所使用的字符集僅是ASCII和EBCDIC字符集的子集。它由以下幾部分呢組成:
字母:包含有26個大寫英文字母:A,B,C,D,…,X,Y,Z;26個小寫英文字母:a,b,c,d,…,x,y,z。
數(shù)字:阿拉伯?dāng)?shù)字10個:0,1,2,3,4,5,6,7,8,9。
可打印的字符有:+,-,*,/,=,(,),[,],<,>,;,.,',,,-,:,?,@,$,,&
非打印字符有:空格,制表符,回車和換行。
若在源程序中包含任何不屬于上列字符集中的字符,匯編程序就把它們作為空格處理。雖然字符&是字符集中的一個字符,但緊跟在回車換行之后的字符&是代表一個連續(xù)行,所以,匯編程序也把它當(dāng)作空格來處理,當(dāng)然,在字符串或注釋中則除外。
2、標(biāo)識符(Identifiers)
標(biāo)識符是程序員自己建立起來的、有特定意義的字符序列,對匯編程序具有特定的符號意義。
標(biāo)識符用于標(biāo)識地址值。標(biāo)識符以字母開頭、由數(shù)字、下劃線構(gòu)成,不超過31個字符。
段名:標(biāo)識段的起始地址。
子程序名:標(biāo)識子程序的起始地址。
標(biāo)號:標(biāo)識指令的地址。
變量:標(biāo)識數(shù)據(jù)的地址。
3、 保留字(Reserved Words)
已有固定含義的符號。不能作為標(biāo)識符。
ASM 86中的保留子

4、 界符(Delimiters)
界符是一些特殊的字符,利用它們可以表明某個標(biāo)記的結(jié)束,它本身也有一定的意義,這一點與分隔符不同,因為分隔符只表示標(biāo)記的結(jié)束。若有了界符那就不一定需要分隔符。但是適當(dāng)?shù)厥褂靡恍┓指舴墒钩绦蚋菀桌斫?。ASM 86中的界符有:
, ; : . + - * / = ? - @ & $ ' ' < > ( ) [ ]
主要是起分隔作用。
如,指令"MOV AX,100"中的逗號,起分隔操作數(shù)的作用。
5、 常數(shù)(Constants)
在匯編時,已經(jīng)確定的值,且在程序運(yùn)行期間不會變化。
(1) 數(shù)值常量
數(shù)字常量又可用二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制數(shù)來表示。二進(jìn)制常量是以字母B結(jié)尾的由一串0和1組成的序列。二進(jìn)制常量,00001111B等。
八進(jìn)制常量是以字母Q(或字母O)結(jié)尾的若干數(shù)字(0,1,2,3,4,5,6,7)組成的序列。如255Q,403O等。
十進(jìn)制常量是以字母D(也可略寫)結(jié)尾的若干個數(shù)字(0,1,2,3,4,5,6,7,8,9)組成的序列。如123,或123D 。
十六進(jìn)制常量是以字母H結(jié)尾的若干字母或數(shù)字(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F(xiàn))組成的序列。如12FFH,0FFFFH。
(2) 字符串常量
字符串常量是由包含在單引號內(nèi)的1至2個ASCII字符構(gòu)成的。匯編程序把它們表示成一個字節(jié)序列,一個字節(jié)對應(yīng)一個字符,把引號中的字符翻譯成ASCII碼。例如A等價于41H。在可以使用單字節(jié)立即數(shù)的地方,就可以使用單個字符組成的字符串常量;在可以使用字立即數(shù)的地方就可以使用兩個字符組成的字符串常量。只有字初始化存儲器時,才可以使用多于兩個字符的字符串常量。
如,'A', 'Hello'
6、 注釋(Comments)
語句行中,分號后面的部分為注釋,注釋僅供程序員閱讀或交流,匯編程序(MASM)和連接程序(LINK)均不對注釋作任何處理。
§4.2.2 符號(Symbols)
在匯編語言源程序中,為了使程序更具有普遍性,也便于程序的修改,用戶常用符號來代替存儲單元、數(shù)據(jù)、表達(dá)式等。符號是一種標(biāo)識符,它要符合標(biāo)識符的組成規(guī)定。在實際使用中的符號可以分成五類:寄存器、變量、標(biāo)號、數(shù)、其他符號。每個符號都具有一定的屬性,以允許匯編程序使用它來代表所需的信息。
1、 寄存器(Registers)
寄存器代表一個操作數(shù),寄存器的類型是隱含在寄存器名中。寄存器的類型可以確定寄存器是一個字節(jié)寄存器還是字寄存器(兩個字節(jié))。
2、 變量(Variable)
存放在存儲單元的操作數(shù)是變量,因為它們的值是可以改變的。在程序中出現(xiàn)的存儲單元地址的符號,即是他們的名字,通常是用存儲器初始化命令定義的。
變量是表示存儲單元地址的符號,其值可以改變。 變量有三個屬性:
(1) 段地址值(Segment)。
(2) 地址偏移量值(Offset)。
(3) 類型(Type):字節(jié)(Byte)、字(Word)、雙字(Double Word) 。
3、標(biāo)號(Label)
標(biāo)號是某條指令所存放單元的符號地址,它是轉(zhuǎn)移指令或調(diào)用指令的目的操作數(shù)。對于匯編程序來說,標(biāo)號與變量是類似的,都是存儲單元的符號地址。只是標(biāo)號對應(yīng)的存儲單元中存放的是指令,而變量所對應(yīng)的存儲單元中存放的是數(shù)據(jù) 。所以,標(biāo)號也有三種屬性:段值、偏移量、類型。
標(biāo)號的類型與變量不同,它的類型是NEAR或是FAR。NEAR類型是指轉(zhuǎn)移到此標(biāo)號所指的語句,或調(diào)用子程序或過程時,只需改變IP值,而不改變CS值。即轉(zhuǎn)移指令或調(diào)用指令與此標(biāo)號所指的語句或過程在同一程序段內(nèi)。FAR類型是指轉(zhuǎn)移到標(biāo)號所指的語句或調(diào)用的子程序或過程,不僅要改變IP值,而且要改變CS值,即段交叉轉(zhuǎn)移或調(diào)用。若沒有對標(biāo)號進(jìn)行類型說明,就默認(rèn)為NEAR類型。
4、數(shù)
在匯編語言源程序中的常數(shù)也常用符號的形式來表示,這樣就更具有通用性和便于修改。
5、其他符號
除了上述符號以外,匯編語言中還常出現(xiàn)一些其他符號,常作為偽指令名字。例如:
SEGMENT與ENDS(定義一個段)
CODEMACRO與ENDM(定義一個宏指令)。
§4.2.3 表達(dá)式(Expressions)
匯編語言中的表達(dá)式由操作數(shù)和運(yùn)算符組成,在匯編時,由匯編程序(MASM)計算,獲得一個值。
1、操作數(shù)
可以是寄存器名、數(shù)字常數(shù)、字符串常量或是一個存儲器操作數(shù)。
(1)常量操作數(shù)
數(shù)字操作數(shù)可以是常量或表示常量的標(biāo)識符(符號)。常量操作數(shù)的允許范圍是從-65535~+65535。
常數(shù)操作數(shù)的值可以是負(fù)的,但常量絕對不能是負(fù)的。常量前加上負(fù)號(一個運(yùn)算符),以表示一個負(fù)的操作數(shù),不能把負(fù)號作為常量的一部分,負(fù)號本身是一個運(yùn)算符。
(2)存儲器操作數(shù)
存儲器操作數(shù)通常是標(biāo)識符,具體說。可分為標(biāo)號和變量兩種。標(biāo)號是可執(zhí)行的指令語句的符號地址,通常作為轉(zhuǎn)移指令或調(diào)用的目標(biāo)操作數(shù)。變量通常是指存放在一些存儲單元的值,這些值在程序運(yùn)行的過程中是可以改變的。作為存儲器操作數(shù)的標(biāo)號和變量都有三種屬性:段值、偏移量、類型。
2、運(yùn)算符有
(1)算術(shù)運(yùn)算符
算術(shù)運(yùn)算符有:+(加)、-(減)、*(乘)、/(除)、MOD(除法取余數(shù))。算術(shù)運(yùn)算符總是應(yīng)用與數(shù)字操作數(shù),結(jié)果也是數(shù)字的。當(dāng)算術(shù)運(yùn)算符應(yīng)用在存儲器地址運(yùn)算,就要注意這種運(yùn)算是否有意義。例如在同一程序段內(nèi)的兩個存儲器地址差(相減),是表示兩個存儲單元之間的數(shù)字距離,即它們地址偏移量之差,這是有意義的。對存儲器地址操作數(shù)的另一個唯一有意義的算術(shù)運(yùn)算是加或減一個數(shù)字量。但是兩個存儲器地址相乘積是沒有意義的。
(2)邏輯運(yùn)算符
邏輯運(yùn)算符有AND、OR、NOT、XOR。邏輯運(yùn)算的操作數(shù)只能是數(shù)字的,而且結(jié)果也是數(shù)字的。存儲器地址操作數(shù)不能進(jìn)行邏輯運(yùn)算。
這里要指出。AND。OR,NOT,XOR也是8086指令的助記符。但是,作為ASM 86的運(yùn)算符是在程序編譯時計算的,而作為指令助記符,,則在程序執(zhí)行時計算的。
(3)關(guān)系運(yùn)算符
關(guān)系運(yùn)算符有EQ(等于)、NE(不等于)、LT(小于)、 GT(大于)、LE(小于或等于)、GE(大于或等于)。
關(guān)系運(yùn)算符的兩個操作數(shù),或者都是數(shù)字的,或者同是一段的存儲器地址。結(jié)果始終是一個數(shù)字值。若關(guān)系是假,則結(jié)果為0;若關(guān)系是真,則結(jié)果是0FFFFH。
(4)分析運(yùn)算符
分析運(yùn)算符有SEG、OFFSET、TYPE、LENGTH、SIZE。分析運(yùn)算符可以把存儲器操作數(shù)分解為它的組成部分。
(5)合成運(yùn)算符
合成運(yùn)算符PTR、THIS。合成運(yùn)算符可以由已存在的存儲器操作數(shù)生成一個段值與偏移量相同,而類型不同的新的存儲器操作數(shù)。
§4.2.4 語句(Statements)
一個匯編語言的源程序是由一條條語句組成的,而這些語句可分成兩類:指令性語句和指示性語句。指令性語句,匯編程序把它們翻譯成機(jī)器代碼,這些代碼命令8086執(zhí)行某些操作。指示性語句(偽指令),匯編程序不能把它們翻譯成機(jī)器代碼,而是指示、引導(dǎo)匯編程序在匯編時做一些操作。
1、指令性語句
標(biāo)號:助記符 操作數(shù) ; 注釋
2、偽指令語句(指示性語句)
名字 定義符 操作數(shù) ;注釋
在指令性語句的標(biāo)號后面跟有冒號(:),而在指示性語句的名字后面沒有冒號,這就是這兩種語句在格式上的主要區(qū)別。
一個標(biāo)號與一條指令的地址符號名相聯(lián)系,標(biāo)號可以作為JMP指令和CALL指令的目標(biāo)操作數(shù)。指示性語句中的名字與指令的地址毫無關(guān)系,絕不能轉(zhuǎn)向它。在指令性語句中的標(biāo)號是任選的;而在指示性語句中的名字,可能是強(qiáng)制的、任選的或禁止的,這取決于實際命令。語句中的注釋是為了便于程序閱讀,它們總是可以任選的,為了便于識別,必須在注釋之前加上分號(;)。
所謂指令性語句,實際上就是在前面介紹過的8086指令。
