日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費(fèi)注冊]

當(dāng)前位置:電子發(fā)燒友網(wǎng) > 圖書頻道 > 電子 > 《微計算機(jī)原理》 > 第4章 匯編語言程序設(shè)計

第1節(jié) 編語言源程序的格式

 


  程序設(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指令。

?
肃宁县| 孟连| 澳门| 隆回县| 东台市| 山东| 白玉县| 苏州市| 西峡县| 东乌珠穆沁旗| 金堂县| 车险| 五莲县| 会昌县| 唐山市| 阜城县| 隆回县| 广德县| 泰安市| 且末县| 敦煌市| 竹溪县| 宜昌市| 江津市| 彭泽县| 方正县| 阿城市| 神木县| 武邑县| 永丰县| 锡林郭勒盟| 嘉义市| 永济市| 长海县| 全南县| 临安市| 祥云县| 宝丰县| 新巴尔虎右旗| 师宗县| 宁陕县|