| A51匯編器的解釋one--看了后悔找我分類: C51和A51學(xué)習(xí) 2006-05-04 20:53 A51匯編器是運(yùn)行于IBM PC系列及其兼容機(jī)上的交叉匯編軟件,其主要功能是將MCS-51系列單片機(jī)匯編語言源程序翻譯成符合Intel目標(biāo)文件格式的可再定位的目標(biāo)代碼,經(jīng)過L51連接器的連接和裝配,產(chǎn)生可被DS51仿真器調(diào)試或其它任何一種與Intel 目標(biāo)文件格式兼容的仿真器使用的絕對(duì)目標(biāo)代碼.
   
 一:A51的符號(hào):在A51中可使用符號(hào)表示數(shù)值(EQU),地址和寄存器名,符號(hào)具有段類型,作用域,值域和可變性等屬性.
   
 符號(hào)的段屬性:指出符號(hào)所位于的地址空間.段類型有:
   
 NUMBER        無類型符號(hào)
   
 DATA          DATA段符號(hào)(可直接尋址的內(nèi)部RAM空間)
   
 IDATA         IDATA段符號(hào)(可間接尋址的內(nèi)部RAM空間)
   
 XDATA         XDATA段符號(hào)(外部數(shù)據(jù)存儲(chǔ)空間)
   
 BIT           BIT段符號(hào)(內(nèi)部RAM低地址區(qū)的可位尋址的空間)
   
 CODE          CODE段符號(hào)(程序存儲(chǔ)器空間)
   
 REGISTER      寄存器符號(hào)
   
 作用域:指出符號(hào)是外部的,局部的還是全局的.(PUBLIC,EXTRN關(guān)鍵字說明)
   
 二:標(biāo)號(hào):定義標(biāo)號(hào)時(shí),標(biāo)號(hào)名后必須接冒號(hào)”:”,以示區(qū)別,每行只能定義一個(gè)標(biāo)號(hào),標(biāo)號(hào)一經(jīng)定義,其值為當(dāng)前地址計(jì)數(shù)器的當(dāng)前值,因此標(biāo)號(hào)代表了指令和數(shù)據(jù)的地址,不能重復(fù)定義.
   
 三:特殊的匯編符號(hào):A51宏匯編語言定義了代表CPU寄存器的特殊符號(hào),這些是保留的關(guān)鍵字,AR0---AR7:表示當(dāng)前工作寄存器的R0—R7的絕對(duì)地址,它的值取決于指令所選擇的工作寄存器組.
   
 四:運(yùn)算符:有三種1):算術(shù)運(yùn)算符包括:+,-(正負(fù)號(hào)),加---+,減,乘,除,MOD(取模),()—括號(hào),改變運(yùn)算順序.2):二進(jìn)制運(yùn)算符號(hào):用來對(duì)二進(jìn)制數(shù)進(jìn)行按位取反,移位或邏輯運(yùn)算.包括:NOT(按位取反),HIGH(取右邊操作數(shù)的高8位,LOW(取右邊操作數(shù)的低8位)SHR(右移位),SHL(左移位),AND(邏輯與),OR(邏輯或),XOR(邏輯異或).3):關(guān)系運(yùn)算符:>=,<=,<>,=,<,>.
   
 所有運(yùn)算符的優(yōu)先級(jí)順序:()àNOT,HIGH,LOWà+,-(正負(fù)號(hào))à*,/,MODà+,-(加減)àSHR,SHLàAND,OR,XORà>=,<=,<>,>,<,=.
   
 數(shù)值表達(dá)式:數(shù)值表達(dá)式由運(yùn)算符和操作數(shù)組成,一個(gè)操作數(shù)又可以是表達(dá)式,與符號(hào)具有段屬性一樣,表達(dá)式也具有段類型屬性,表達(dá)式的類型依賴于操作數(shù)的類型.表達(dá)式的類型如下:BIT,NUMBER,CODE,DATA,IDATA,XDATA.大多數(shù)的表達(dá)式是無類型的,當(dāng)表達(dá)式中包含有段類型的操作數(shù)或者是子表達(dá)式時(shí),運(yùn)算結(jié)果的段類型遵循下面的原則:
   
 對(duì)于單目運(yùn)算符:(+/-/HIGH/LOW/NOT)表達(dá)式的結(jié)果與操作數(shù)具有相同的類型.
   
 對(duì)于所有的雙目運(yùn)算符(除+/-),表達(dá)式的結(jié)果均為無類型的結(jié)果.
   
 對(duì)加減運(yùn)算,只有當(dāng)其中的一個(gè)操作數(shù)具有段類型的時(shí)候,運(yùn)算結(jié)果才具有相同的段類型,如果兩個(gè)操作數(shù)具有段類型,即使他們的段類型一樣,結(jié)果也是無類型的(NUMBER).
   
 總結(jié):只有當(dāng)操作數(shù)加上或者是減去一個(gè)無類型時(shí),才可能產(chǎn)生一類型,其他所有的組合均產(chǎn)生無類型的表達(dá)式.
   
 
   
 A51提供了偽指令,可以利用這些偽指令在匯編程序中定義符號(hào),保留和初始化存儲(chǔ)空間,定位目標(biāo)代碼等功能,偽指令中除DB,DW外均不產(chǎn)生目標(biāo)代碼,但可以改變匯編器的狀態(tài),并將有關(guān)信息(如段定義)加到目標(biāo)文件中.
   
 偽指令分四類:
   
 1):定義符號(hào):SEGMENT,EQU,SET,DATA,IDATA,XDATA,BIT,CODE 
   
 2):保留和初始化存儲(chǔ)空間:DS,DB,DW,DBIT
   
 3):程序鏈接:PUBLIC,EXTRN,NAME
   
 4):匯編狀態(tài)控制和段選擇
   
 :ORG,END,RSEG,CSEG,DSEG,XSEG,ISEG,BSEG,USING
   
 一 :定義符號(hào)的偽指令
   
 1)SEGMENT
   
    格式:  段名符號(hào)  SEGMENT   段類型  [再定位類型]
   
 SEGMENT指令可聲明一個(gè)可再定位(區(qū)別于CSEG,DSEG,XSEG,BSEG,ISEG等 定義的在相對(duì)應(yīng)的空間固定地址定義的絕對(duì)段—在連接的過程中不允許重新定位)的段符號(hào)和一個(gè)可選的再定位類型,段符號(hào)可以用來定義段,L51連接器可將多個(gè)模塊內(nèi)的具有相同段名和再定位類型的幾個(gè)段合成為一個(gè)段.段類型說明了段所處的地址空間.
   
 如果是編寫的匯編程序要與C源程序接口,即被C源程序調(diào)用,則全部的匯編子程序所命名的定義的代碼段的段名必須是可用SEGMENT來定義的,而且名字的命名的方法也應(yīng)該參照C51編譯器產(chǎn)生的局部段的段名的轉(zhuǎn)換規(guī)則.段名的作用主要是在匯編的時(shí)候用RSEG來激活的,在連接定位的時(shí)候用到的.與段名相應(yīng)的是用于存儲(chǔ)和傳遞參數(shù)的別名,可以在匯編源程序中直接應(yīng)用局部段的別名,這個(gè)別名主要是在傳遞函數(shù)參數(shù)的時(shí)候用的.在匯編程序中要用PUBLIC 聲明被其他模塊引用的全局符號(hào).
   
 DATA           (可直接尋址的內(nèi)部RAM空間)
   
 IDATA          (可間接尋址的內(nèi)部RAM空間)
   
 XDATA         (外部數(shù)據(jù)存儲(chǔ)空間)
   
 BIT            (內(nèi)部RAM低地址區(qū)的可位尋址的空間)
   
 CODE          (程序存儲(chǔ)器空間)
   
 可選的再定位類型定義了L51連接時(shí)的定位方式,再定位類型:
   
 UNIT:定義一個(gè)可開始于任一單元的段對(duì)于BIT型的段,一個(gè)單元是一個(gè)位,
   
 其它所有的段一個(gè)單元是一個(gè)字節(jié).
   
 PAGE:定義一個(gè)起始地址必須是256的整數(shù)倍的段,段的絕對(duì)地址由L51自己計(jì)算,該類型只允許用于XDATA和CODE類型段.
   
 INPAGE:定義一個(gè)由L51連接后必須包含在256B的塊中,只適用于XDATA和CODE段.
   
 INBLOCK:定義一個(gè)L51連接后必須包含在2KB中的段,只適用于CODE段.
   
 OVERLAYABLE:定義一個(gè)可與其他段交疊的覆蓋段,其段名符號(hào)必須按C51或者PL/M51的規(guī)則命名.C51把局部數(shù)據(jù)段和局部位段定義成DT?FUNCTIONNAME?MODULENAME和BI?FUNCTIONNAME?MODULENAME這是在small模式下.其他的模式略有不同。
   
 BITADDRESSABLE:定義一個(gè)L51連接后位于可位尋址的區(qū),段長不能超過16B.
   
 2)       EQU
   
   格式:  符號(hào)名 EQU 表達(dá)式
   
         符號(hào)名 EQU  寄存器名
   
 EQU偽指令定義一表示數(shù)值或寄存器的符號(hào),該符號(hào)可用于表達(dá)式或助記符指令的操作數(shù),EQU指令定義的符號(hào)不能被改變或重新定義,其段類型取決于表達(dá)式中的操作數(shù)類型類型,無類型的EQU符號(hào)可用于任何表達(dá)式中.
   
    LIMIT  EQU  200
   
    VALUE  EQU  LIMIT-100+’A’
   
    COUNTER EQU  R5
   
 3)       SET
   
   格式: 符號(hào)名 SET 表達(dá)式
   
        符號(hào)名 SET 寄存器名
   
 SET指令的功能與EQU指令的功能一樣,區(qū)別是SET指令定義的符號(hào)可以再定義和改變.
   
 VALUE    EQU  200
   
 VALUE    SET   VALUE/2
   
 COUNTER  SET  R1
   
 TEMP     SET  COUNTER/2
   
 4)       BIT
   
   格式:  符號(hào)名 BIT 表達(dá)式
   
 BIT指令定義一表示位地址的符號(hào),該符號(hào)一經(jīng)定義便不能重新定義和改變.
   
 DATA_BSEG SEGMENT  BIT
   
     RSEG  DATA_BSEG
   
     CTRL  DS  1
   
     FLAG  BIT  CTRL.1
   
     FLAG2  BIT  FLAG+1
   
 5)       DATA  
   
    格式:   符號(hào)名 DATA  表達(dá)式 
   
     DATA指令定義一表示MCS-51內(nèi)部數(shù)據(jù)存儲(chǔ)器字節(jié)地址的符號(hào),表達(dá)式必須是一個(gè)絕對(duì)地址值或者是一個(gè)簡(jiǎn)單的再定位表達(dá)式(即數(shù)值確定的,且其值必須在0—255之間,類型必須是DATA或者是NUMBER類型)
   
 例如在匯編程序中:
   
    PORT   DATA  90H
   
    RESULT_L  DATA  40H
   
    RESULT_H  DATA  RESULT_L+1
   
 6) XDATA,IDATA,CODE 均是也和DATA一樣,都是定義一個(gè)代表相應(yīng)存儲(chǔ)空間單元的地址符號(hào),表達(dá)式也必須是相對(duì)應(yīng)的類型或者是NUMBER類型。
   
 二 初始化和保留指令
   
 1)DS
   
 格式:  [標(biāo)號(hào):] DS 表達(dá)式
   
 DS指令以字節(jié)為單位,在內(nèi)部或者外部地址空間中保留存儲(chǔ)空間,表達(dá)式中不能包含前向地址參考量,可為除BIT段的任何類型。該偽指令語句使當(dāng)前地址計(jì)數(shù)器加上表達(dá)式的值,需要注意的是地址計(jì)數(shù)器加上表達(dá)式結(jié)果的值不能超出地址空間的范圍。(無論是匯編器還是編譯器,對(duì)每一種不同類型的地址空間(DATA,CODE,PDATA,XDATA,BIT)都產(chǎn)生一個(gè)獨(dú)立的地址計(jì)數(shù)器,每匯編一條指令,計(jì)數(shù)器都會(huì)自動(dòng)增加,不過可以用ORG偽指令改變當(dāng)前段地址計(jì)數(shù)器,用ORG偽指令表達(dá)式的值作為當(dāng)前段地址計(jì)數(shù)器的初值,而當(dāng)前段的改變可以用RSEG偽指令來改變。
   
 RSEG ?DT?FUNCTION?MODULENAE----聲明當(dāng)前段為局部數(shù)據(jù)段
   
 FUNCTION?BYTE:-------------函數(shù)局部段的別名
   
 TIME:  DS  5
   
 2) DBIT 
   
    格式  [標(biāo)號(hào):]  DBIT  表達(dá)式
   
 以位為單位在可位尋址段內(nèi)保留存儲(chǔ)空間, 表達(dá)式中不能包含前向地址參考量或者是再定位的符號(hào)和外部符號(hào),該指令使當(dāng)前地址計(jì)數(shù)器增加表達(dá)式結(jié)果值,其增加量以位為單位.
   
 3) DB DW
   
    格式:  [標(biāo)號(hào)]:  DB/DW  表達(dá)式1[,表達(dá)式2,………]
   
 這兩個(gè)指令的作用相同,均是以字節(jié)或者是字初始化程序存儲(chǔ)空間,上面是保留存儲(chǔ)空間,存儲(chǔ)空間可以使RAM和ROM,而這兩個(gè)指令直接就是初始化程序存儲(chǔ)空間.
   
 Table: DB  “any key to continue!”
   
 Requst: DB  LOW(Table),HIGH(Table)
   | 
|  |