国产精品一区二区x88av_日韩三级av高清片_亚洲日本久久_丝袜亚洲另类丝袜在线

浙江自考網(wǎng)

咨詢熱線

您現(xiàn)在的位置:浙江自考網(wǎng)>復(fù)習(xí)資料 > 正文
自考攻略

2023年4月浙江自考微型計(jì)算機(jī)原理及應(yīng)用復(fù)習(xí)資料:匯編語言的基本概念

時(shí)間:2023-02-03 14:24:39 作者:儲(chǔ)老師

自考助學(xué) 以下自考復(fù)習(xí)資料均由浙江自考網(wǎng)整理并發(fā)布,考生想要了解更多關(guān)于浙江自考報(bào)名、考試、成績(jī)查詢、畢業(yè)、歷年真題、常見問答等相關(guān)信息請(qǐng)關(guān)注浙江自考網(wǎng),獲取浙江自考更多信息。
一、匯編語言程序的格式
(一)基本概念
程序是為實(shí)現(xiàn)某一特定目的(例如對(duì)數(shù)據(jù)進(jìn)行某種處理)而編寫的一組指令有序集合。匯編語言程序就是用匯編語言編寫的源程序。匯編語言是一種面向機(jī)器的語言,它是與計(jì)算機(jī)硬件密切關(guān)連的,因而熟悉計(jì)算機(jī)硬件是匯編語言程序員必須具備的條件。與用高級(jí)語言編寫的程序相比較,匯編語言程序具有更高的效率,它的程序執(zhí)行時(shí)間短且占用內(nèi)存少,這在計(jì)算機(jī)實(shí)時(shí)控制和實(shí)時(shí)處理中是十分重要的,因而在實(shí)時(shí)領(lǐng)域得到廣泛應(yīng)用。用匯編語言編寫的源程序,必須由匯編程序(一種系統(tǒng)軟件)進(jìn)行匯編,將它轉(zhuǎn)換成用機(jī)器語言表示的目標(biāo)程序后,才能由CPU識(shí)別執(zhí)行。因此編制程序時(shí)必須遵循規(guī)定的格式和語法,這是本章討論的主要內(nèi)容之一。對(duì)于不同型號(hào)的CPU和不同版本的匯編程序,其匯編語言是不同的。對(duì)于同一系列的CPU,則是向上兼容的。本書是針對(duì)8086/8088CPU進(jìn)行討論的。
(二)匯編語言源程序的特點(diǎn)和格式
下面列舉了一個(gè)匯編語言程序,其功能是對(duì)10個(gè)字節(jié)數(shù)據(jù)a1 ~ a10求和。
DATASEGMENTAT 2000H
ARRAY DBA1,A2,A3,…,A10
COUNTEQU$-ARRAY
SUMDW?
DATA ENDS
STACK SEGMENT PARA STACK ‘STACK’
STAKDB100 DUP(?)
TOPEQULENGTH STAK
STACKENDS
CODESEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOVAX,DATA
MOVDS,AX
MOVAX,0
MOVDI,OFFSET SUM
MOVBX,OFFSET ARRAY
MOVCX,COUNT
LOP:ADDAL,[BX]
ADCAH,0
INCBX
LOOPLOP
MOV[DI],AX
MOVAH,4CH
INT21H
CODE ENDS
ENDSTART
此例明顯地示出了匯編語言程序的兩個(gè)組成特點(diǎn):分段結(jié)構(gòu)和浯句行。
1.分段結(jié)構(gòu)
在第二章中,我們已討論了8086/8088的程序分段,知道程序最多可由4段組成,并分別由段寄存器CS、DS、ES和SS的內(nèi)容作為段基值,每段所占內(nèi)存容量最大可達(dá)64KB。
上例程序共有3段,它們分別是數(shù)據(jù)段(段名DATA)、堆棧段(段名STACK)和代碼段(段名CODE),各段由命令SEGMENT開始,并由命令ENDS結(jié)束。
2.語句行
上例程序共有26行,每行1個(gè)語句,即共有26個(gè)語句行。匯編語言程序的語句有兩類:指令性語句和指示性語句。
(1)指令性語句。指令性語句是主要由指令構(gòu)成的語句,其格式為
[標(biāo)號(hào):] 操作碼[操作數(shù)] [;操作數(shù)] [;注釋];
其中操作碼和操作數(shù)是用助記符表示的指令的兩個(gè)部分,8086/8088的指令系統(tǒng)已在第三章中討論過,此處不再贅述。
其中帶方括號(hào)的三項(xiàng)(標(biāo)號(hào)操作數(shù)和注釋)是任意選用的項(xiàng),即根據(jù)具體編程需要該項(xiàng)可有或沒有,當(dāng)然在實(shí)際語句中該項(xiàng)的方括號(hào)是不寫出來的。標(biāo)號(hào)具有該語句指令所在內(nèi)存地址的屬性,通常在轉(zhuǎn)移指令中用作目的地址。注意,標(biāo)號(hào)必須用冒號(hào)“:”結(jié)尾,這是語法的規(guī)定。用分號(hào)“;”開始的注釋用來說明該語句在程序中的作用,以方便程序的閱讀和修改,這項(xiàng)也是任選的。
如上例的第18語句行
LOP:ADD AL,[BX]
其中指令是ADD AL,[BX],標(biāo)號(hào)是LOP。LOP在第21語句行指令LOOP LOP中是轉(zhuǎn)移的目的地址。又此語句中未用注釋項(xiàng)。
(2)指示性語句。指示性語句是主要由命令(亦稱偽指令)構(gòu)成的語句,是用來指示匯編程序進(jìn)行匯編操作的,其格式為:
[名字/變量] 命令[參數(shù)] [;注釋]
其中命令指示匯編程序進(jìn)行某種匯編操作,參數(shù)是有關(guān)的數(shù)據(jù),帶方括號(hào)的項(xiàng)是任選的。
如上例的第1語句行
DATA SEGMENT AT 2000H
其中命令SEGMENT指出這是一個(gè)段的開始,參數(shù)AT 2000H指定該段的段基值為2000H,而DATA則是該段的名字。
又如上例的第5語句行
DATAENDS
則表明了段名為DATA的段的結(jié)束。指示性語句的應(yīng)用使程序員編程時(shí)不需進(jìn)行很多計(jì)算,既方便又簡(jiǎn)化了編程工作。
二、常量、標(biāo)識(shí)符和表達(dá)式
常量、標(biāo)識(shí)符和表達(dá)式在匯編語言源程序中經(jīng)常用到,本節(jié)對(duì)它們分別作一介紹。
(一)常量
常量是具有一定數(shù)值的量,匯編語言程序中的常量有:數(shù)字常量、字符常量和符號(hào)常量:
1.?dāng)?shù)字常量
數(shù)字常量可用二進(jìn)制數(shù)、八進(jìn)制數(shù)、十進(jìn)制數(shù)或十六進(jìn)制數(shù)表示。所用的數(shù)制要用后綴示明:二進(jìn)制為B、八進(jìn)制為Q、十進(jìn)制為D、十六進(jìn)制為H。對(duì)于十進(jìn)制數(shù)可以用后綴D,也可以不用后綴。對(duì)于十六進(jìn)制數(shù),若最高位的數(shù)為A-F,須在它的前面加上數(shù)字0,以表明是數(shù)值數(shù)據(jù)。
例如:10100110B,246Q,166D,166,6AH,0A6H。
2.字符常量
字符常量用帶單引號(hào)的ASCII字符表示,它所代表的數(shù)值就是該字符的ASCII碼。例如:‘A’就是41H,‘1’就是31H等。
3.符號(hào)常量
為編程方便,程序員在編程時(shí)可將一個(gè)標(biāo)識(shí)符定義為一個(gè)符號(hào)常量,它具有一個(gè)設(shè)定的數(shù)值而可被引用。
例如符號(hào)常量定義語句ALLONE=llllllllB將ALLONE定義為11111111B。在程序中即可引用如MOV AL,ALLONE,此條指令和MOV AL,llllllllB是等效的。
(二)標(biāo)識(shí)符
標(biāo)識(shí)符是程序員在編程時(shí)建立的有特定意義的字符序列,標(biāo)識(shí)符可用作符號(hào)常量、名
字、變量和標(biāo)號(hào)等。
對(duì)于標(biāo)識(shí)符,有以下規(guī)定:
(1)組成標(biāo)識(shí)符的字符有:英文大寫字母A、B:…、Z;英文小寫字母a、b、…、z ,數(shù)字0、1、2、…、9;字符?、@、—。
(2)標(biāo)識(shí)符的有效長(zhǎng)度為不超過31個(gè)字符,若超過就忽略其超過部分。
(3)除數(shù)字以外,所有規(guī)定的字符都可作為標(biāo)識(shí)符的第一個(gè)字符。
(4)問號(hào)?不能單獨(dú)作為一個(gè)標(biāo)識(shí)符。
(5)不能把保留字用作標(biāo)識(shí)符。保留字包括:指令和命令的助記符,如MOV、SEGMENT等;寄存器名,如AX等;語句中的規(guī)定用詞,如PTR、LENGTH等。
(三)表達(dá)式
表達(dá)式由操作數(shù)和運(yùn)算苻組成。操作數(shù)可為常量、名字、變量和標(biāo)號(hào)等。運(yùn)算符包括
算術(shù)運(yùn)算符、邏輯運(yùn)算符等很多種,如表4-1所示。表中各運(yùn)算符是按運(yùn)算優(yōu)先級(jí)由高向低逐行排列的。
例如指令性語句:MOV CX,COUNT-1,其中COUNT-1為表達(dá)式,設(shè)符號(hào)常量COUNT已用COUNT=10定義,則匯編時(shí)將表達(dá)式匯編成9(注:COUNT-l=10-1=9),即將該指令按
MOV CX,9匯編成機(jī)器碼供程序運(yùn)行時(shí)由CPU執(zhí)行。
又如指令性語句:MOV AL,COUNT LT 20,其中COUWT LT 20為表達(dá)式,其中 LT為比較運(yùn)算符“小于”,設(shè)COUNT已定義為10,由于10<20,即表達(dá)式是成立的,
亦即表達(dá)式的規(guī)定條件是“真”(TRUE)。匯編時(shí)將該表達(dá)式匯編成0FFH即“真”(即全“1”),則將該指令按MOV AL,0FFH匯編成機(jī)器碼供程序運(yùn)行,若指令性語句為
MOV AL,COUNT GT 20,其中GT為表示“大于”的比較運(yùn)算符,則表達(dá)式是不成立的,即是“假”(False),匯編時(shí)就將該表達(dá)式匯編成00H。
表達(dá)式中的運(yùn)算操作按運(yùn)算符的優(yōu)先級(jí)別先高后低地依次進(jìn)行,對(duì)于相同優(yōu)先級(jí)則按從左到右的次序進(jìn)行運(yùn)算操作。
三、指示性語句
指示性語句的格式如下:
[名字/變量] 命令 [參數(shù)] [;注釋]
(一)程序開始和結(jié)束語句
程序開始和程序結(jié)束語句的命令有NAME、TITLE和END等。
1.應(yīng)用命令NAME的程序命名語句命令NAME用來給程序模塊命名,其格式為
NAME名字
其中名字是程序員按標(biāo)識(shí)符規(guī)定所取的程序模塊名,匯編后它就成為該程序模塊的名字了。
2.應(yīng)用命令TITLE的標(biāo)題命名語句
若所用匯編語言沒有NAME命令,則可用命令TITLE,其格式為
TITLE名字
則其中由程序員所取的名字在程序的每一頁作為標(biāo)題打印出來。
標(biāo)題的名字最多可有60個(gè)字符。若程序沒有使用NAME命令,就用標(biāo)題名字中的前面6個(gè)字符作為模塊名。注意:程序開始時(shí)不用NAME和TITLE命令的語句是允許的,此時(shí)可直接由段定義語句開始編寫源程序。
3.應(yīng)用命令END的程序結(jié)束語句
程序結(jié)束語句的格式為
END[標(biāo)號(hào)]
其中標(biāo)號(hào)是程序中第1句指令性語句(或第1條指令)的標(biāo)號(hào)。當(dāng)程序由多個(gè)模塊組成時(shí),只需在主程序中的結(jié)束語句中寫出標(biāo)號(hào),其它子程序模塊的結(jié)束語句只要寫出命令END即可。
(二)段定義語句
分段結(jié)構(gòu)是8086/8088的特點(diǎn),程序和存儲(chǔ)器都是按段來組織的。段定義語句用來定義一個(gè)段,命令有SEGMENT、ENDS、ASSUME和ORG等。
1.應(yīng)用命令SEGMENT和ENDS的段定義語句
其格式為
段名SEGMENT[參數(shù)]

段名ENDS
其中段名為程序員編程時(shí)按標(biāo)識(shí)符規(guī)定為該段所取的名字,在匯編和連接時(shí)系統(tǒng)將給該段名的段分配一個(gè)具體的段基址。
命令SEGMENT和ENDS必須成對(duì)使用,它們前面的段名必須是一致的,SEGMENT語句和ENDS語句之間就是該段的內(nèi)容。
例如:DATA SEGMENT

DATAENDS
CODESEGMENT

CODEENDS.
此例共有兩段,段名分別為DATA和CODE,且顯然是特意這樣取名以表示第一段是數(shù)據(jù)段,而第二段是代碼段。
2.SEGMENT語句中的參數(shù)部分
SEGMENT語句中的參數(shù)共有三項(xiàng),語句的格式為
段名SEGMENT[定位類型] [組合類型] [‘類別’]
這三個(gè)參數(shù)用來設(shè)定該段在內(nèi)存中的位置,且都是任選項(xiàng)。
(1)定位類型(align-type)。定位類型用來指定該段段地址的邊界條件、定位類型有以下四種:
1)BYTE該段可從任何地址開始,即段地址 =
X X X X, X X X X, X X X X, X X X X, X X X X B,
其中X表示任意值,即1或0;
2)WORD該段必須從字的邊界開始,即段地址 =
X X X X, X X X X, X X X X, X X X X, X X X O B
3)PARA該段必須從節(jié)的邊界開始,即段地址 =
X X X X, X X X X, X X X X, X X X X ,0 0 0 0 B
4)PAGE該段必須從頁的邊界開始,即段地址 =
X X X X, X X X X, X X X X, 0 0 0 0, 0 0 0 0 B。
注意:當(dāng)定位類型缺省(即不寫)時(shí),隱含值為PARA。
(2)組合類型(combine-type)。在匯編和連接時(shí),當(dāng)該段與其他段組合在一起時(shí),組合類型用來設(shè)定該段與其它段的連接關(guān)系,組合類型有以下六種:
1)PUBLIC該段連接時(shí)將與其他同名段依次連接起來,其連接次序由連接程序確定;
2)COMMON該段連接時(shí)將與其他同名段有相同的段基址.即共享相同的存儲(chǔ)空間.亦即各段會(huì)產(chǎn)生覆蓋,但可節(jié)省內(nèi)存容量;
3)AT exp使段基值等于按表達(dá)式exp計(jì)算所得的16位數(shù)。必須指出,對(duì)于代碼段不能用ATexp來設(shè)定段基值;
4)STACK僅用于堆棧段,使同名段都從同一段基址開始:
5)MEMORY指定該段在同名段的最后,即該段在同名段中位于最高的地址空間,若連接時(shí)有幾個(gè)組合類型為MEMORY的段,則只有最前面(最先遇到)的段按組合類型 MEMORY處理,其他段均按組合類型PUBLIC處理;
6)NONE表示本段與其它段邏輯上不發(fā)生關(guān)系,各段都有自己的段基址。注意:當(dāng)組合類型缺省(即不寫)時(shí),隱含值為NONE。
(3)‘類別’(‘dass’)。類別必須用單引號(hào)括起來。在定位時(shí),連接程序?qū)⒏鞒绦蚰K中具有相同類別的邏輯段集中在一起,形成一個(gè)統(tǒng)一的物理段。
3.應(yīng)用命令ORG的偏移地址定位語句
程序中有時(shí)需要指定某一語句所在內(nèi)存單元在段內(nèi)的偏移地址,這可用ORG命令的語句來實(shí)現(xiàn),語句的格式為
ORGexp
其中表達(dá)式exp,可計(jì)算得出16位地址。此時(shí)ORG語句的下一個(gè)語句所在內(nèi)存單元在段內(nèi)的偏移地址就被指定為按表達(dá)式計(jì)算得出的16位地址。
例如:
ORG 1000H
MOVAL, BL
本例示明指令MOV AL,BL所在內(nèi)存單元在本段內(nèi)的偏移地址為1000H。
4.用命令A(yù)SSUME示明段寄存器內(nèi)容的語句
一個(gè)程序通常由很多段組成,對(duì)于某一代碼段,它所用到的數(shù)據(jù)段、附加段和堆棧段只是程序中的某幾個(gè)有關(guān)段,因此在代碼段開始時(shí)必須用ASSUME命令語句示明該代碼段所用到的段,以便進(jìn)行匯編。
ASSUME命令語句緊跟在SEGMENT命令語句之后,其格式為
ASSUMECS:段名1,DS:段名2,ES:段名3,SS:段名4
其中段名1、2、3和4分別為該代碼段所用到的作為代碼段、數(shù)據(jù)段、附加段和堆棧段的段的段名,亦即將這些段的段基值1、2、3和4作為段寄存器CS、DS、ESS5的內(nèi)容。
注意:在ASSUME語句中示明的段寄存器和相應(yīng)的段名是該代碼段中實(shí)際用到的,對(duì)于該代碼段中未用到的段寄存器及相應(yīng)的段名是不需示明的。
例如:CODESEGMENT
ASSUMECS:CODE,DS:DATA
CODEENDS
本例表明在段名為CODE的代碼段中,所用到的段寄存器為CS和DS,它們的內(nèi)容分別是CODE段和DATA段的段基值。
(三)過程定義語句
過程是程序的一部分,即子程序。過程可用程序中的CALL指令調(diào)用。當(dāng)過程中的指令執(zhí)行完后,用RET指令返回調(diào)用它的程序。
應(yīng)用命令PROC和ENDP的過程定義語句的格式為:
過程名PROC 類型

RET
過程名ENDP
過程名是程序員編程時(shí)按標(biāo)識(shí)符規(guī)定取定的。類型表明該過程是供段內(nèi)調(diào)用,還是供段間調(diào)用,對(duì)于前者用NEAR表示,而后者則用FAR表示,當(dāng)類型項(xiàng)缺省(即不寫明)時(shí),隱含值為NEAR。
PROC和ENDP是成對(duì)使用的,兩語句之間就是該過程的內(nèi)容(程序),且用RET指令結(jié)尾以返回調(diào)用它的程序。
成對(duì)使用的命令PROC和ENDP的前面必須均寫明該過程名。
(四)數(shù)據(jù)定義語句
數(shù)據(jù)定義語句用來為數(shù)據(jù)分配存儲(chǔ)單元,例如在內(nèi)存中設(shè)置原始數(shù)據(jù)以及為存放結(jié)果數(shù)據(jù)而保留內(nèi)存單元等。數(shù)據(jù)段、附加段和堆棧段都是存放數(shù)據(jù)的,其中所用的語句主要是數(shù)據(jù)定義語句。數(shù)據(jù)定義的命令有DB、DW、DD、DQ和DT等,它們分別用來定義不同類型(長(zhǎng)度)的數(shù)據(jù)。
數(shù)據(jù)定義語句的格式為
[變量]命令參數(shù)1,參數(shù)2,… ,[;注釋]
其中變量是由程序員在編程時(shí)按標(biāo)識(shí)符規(guī)定取定的,如ARRAY、BUFFER、SUM等,一般都是按照數(shù)據(jù)的功用取名的。
其中命令的表示符號(hào)(助記符)及功能為
DB定義長(zhǎng)度為1字節(jié)(8位)的數(shù)據(jù)(字節(jié)數(shù)據(jù))。
DW定義長(zhǎng)度為1個(gè)Z字(16位)的數(shù)據(jù)(字?jǐn)?shù)據(jù))。
DD定義長(zhǎng)度為2個(gè)字(32位)的數(shù)據(jù)(雙字?jǐn)?shù)據(jù))。
DQ定義長(zhǎng)度為8字節(jié)(64位)的數(shù)據(jù)(8字節(jié)數(shù)據(jù))。
DT定義長(zhǎng)度為10字節(jié)(80位)的數(shù)據(jù)(10字節(jié)數(shù)據(jù))。
其中參數(shù)就是相應(yīng)內(nèi)存單元中的數(shù)據(jù),它可以是常數(shù)(可用各種規(guī)定的數(shù)制表示)、字符常數(shù)(用單引號(hào)括起來的ASCII字符)或符號(hào)常數(shù),當(dāng)它是保留以備存入有關(guān)數(shù)據(jù)時(shí)就以問號(hào)(?)表示。參數(shù)可以有多個(gè),相互間要用逗號(hào)(,)隔開,若連續(xù)多個(gè)數(shù)據(jù)是
重復(fù)的,就可應(yīng)用復(fù)制符DUP以簡(jiǎn)化書寫,DUP的用法為
復(fù)制次數(shù)DUP(數(shù)據(jù))
其中數(shù)據(jù)可以不只一個(gè),且數(shù)據(jù)還可有復(fù)制部分。
例1段名為DATA的段由以下語句組成
DATASEGMENT
DATA1DB20H
ARRAYDB12H,12,‘A’
SUMDB?
DATAENDS
設(shè)本段的段基值為2000H,則相應(yīng)內(nèi)存分配為內(nèi)存
地址內(nèi)容
段基值:偏移地址
2000H: 0000H20H
0001H12H
0002H0CH
0003H41H
0004H
其中第1個(gè)數(shù)據(jù)20H在該段的起點(diǎn),故相應(yīng)內(nèi)存單元的偏移地址為0000H,后面數(shù)據(jù)所在內(nèi)存單元的偏移地址依次類推。
其中所有內(nèi)存單元的段基值都是相同的(=2000H),其中內(nèi)容的數(shù)據(jù)都是以16進(jìn)制表示的(注:由匯編程序在匯編時(shí)進(jìn)行轉(zhuǎn)換)。
其中“?”表示保留,實(shí)際該內(nèi)存單元的內(nèi)容為隨機(jī)數(shù),但對(duì)本程序來說,目前是無效的。
例2DATA2DB2DUP(12H,34H,56H)
此時(shí)內(nèi)存分配為
注:未列出具體地址
例3DATA3DB‘ABCD’
其中參數(shù)部分‘ABCD’是‘A’,‘B’,‘C’,‘D’的簡(jiǎn)寫。
例4DATA4DW1234H,5678H,9AH,?
其內(nèi)存分配為
用DW定義的是字?jǐn)?shù)據(jù),每個(gè)數(shù)據(jù)分配2個(gè)內(nèi)存單元,如數(shù)據(jù)9AH實(shí)則上是009AH。
例5 DATA5DW‘AB’,‘CD’
其內(nèi)存分配為
注意:不能寫為DW‘CDAB’,因?yàn)閰R編語言語法規(guī)定除用DB定義的字符串常量外,單引號(hào)中ASCII字符的個(gè)數(shù)不得超過2個(gè),若只有1個(gè),例DW‘C’,就相當(dāng)于DW0043H。
例6 DATA6 DD 12345678H,‘AB’
其內(nèi)存分配為

例7STAKDB100 DUP(?);保留100個(gè)字節(jié)內(nèi)存單元作為堆棧區(qū)
(五)符號(hào)定義語句
符號(hào)定義語句的命令有EQU、= 和PURGE
1.應(yīng)用命令EQU和PURGE的符號(hào)定義語句
應(yīng)用EQU命令的語句的格式為
名字EQUexp
其中名字是程序員取定的,表達(dá)式exp可以計(jì)算得出一個(gè)具體的數(shù)值。這實(shí)際上就是給名字賦值,在程序中就可引用這個(gè)名字來表示表達(dá)式的實(shí)際計(jì)算值。
若需對(duì)已賦值的名字撤消原賦值并賦以新值。則需先用PURGE命令語句撤消原賦值,再用EQU命令語句賦新值。PURGE命令語句的格式為
PURGE名字
其中名字可不只一個(gè),即可同時(shí)撤消幾個(gè)已賦值。
例如:COUNT EQU20;給COUNT賦值為20

MOVAL,COUNT;即MOV AL,20

PURGECOUNT;撤消原賦值
COUNTEQU10;給COUNT賦新值為10

MOVBL,COUNT;即MOV BL,10

2.應(yīng)用命令=的符號(hào)常量定義語句,其格式為
名字 = exp
命令 = 的功能與EQU類似,唯一的差別是命令;可隨時(shí)對(duì)名字(符號(hào)常量)賦新值,而不必使用PURGE命令。
如上例,可寫為
COUNT=20

MOV AL,COUNT

COUNT=10

MOV BL,COUNT

(六)名字和變量
1.名字
前面已討論過的名字有文件名、標(biāo)題名、段名、過程名和符號(hào)常量等,它們都是程序員編程時(shí)按標(biāo)識(shí)符規(guī)定來命名的,其中有些名字可在編程時(shí)引用,以方便編程。
(1)段名。段名是在源程序的段定義語句中命名取定的,如段定義語句
DATASEGMENT, 段名為 DATA。
源程序在進(jìn)行匯編連接時(shí),系統(tǒng)分配給該段一個(gè)段基值,設(shè)為2000H。這時(shí)段名
DATA就可作為段基值2000H被引用。
例如:給段寄存器賦值的指令序列為
MOVAX,DATA;相當(dāng)于MOV AX,2000H
MOVDS,AX;將段基值賦給段寄存器
(2)過程名。過程名是在源程序的過程定義語句中命名的。如過程定義語句
SORTPROC NEAR,過程名為SORT。
匯編連接源程序時(shí),系統(tǒng)分配給過程一個(gè)地址,即該過程第一條指令所在內(nèi)存單元的地址,亦即該過程的入口地址,這也就是調(diào)用該過程的CAl厶指令中的目的地址。過程名在匯編語言程序中可作為調(diào)用指令的目的地址使用,例如指令CALL SORT,其中 SORT就表示過程名為SORT的過程的入口地址,執(zhí)行該指令就是轉(zhuǎn)移到過程SORT,運(yùn)行。
(3)符號(hào)常量。符號(hào)常量是在源程序的符號(hào)常量定義浯句中命名取定的,如符號(hào)常量定義語句COUNT EQU 20將數(shù)值20賦給COUNT。COUNT就可在指令中作為常量20
被引用,如MOV AL,COUNT就相當(dāng)于MOV AL,20。
例1部分程序內(nèi)容為
DATASEGMENT
ARRAYDB10H,24H,5AH,0C7H,98H,‘ABCDE’
COUNTEQU$-ARRAY
MAXDB?
DATAENDS
其中第3語句行為給符號(hào)常量COUNT賦值的語句,句中表達(dá)式為$-ARRAY,其計(jì)算值就是賦給COUNT的常量數(shù)值。下面先討論表達(dá)式中$和ARRAY的含義及具體值,然后由表達(dá)式計(jì)算出賦給COUNT的具體數(shù)值。如本小節(jié)(四)所討論,變量ARRAY所在語句中的第一個(gè)數(shù)據(jù)10H所在內(nèi)存單元的偏移地址為0000H,也就是該數(shù)組的起始地址,后續(xù)數(shù)據(jù)依次存在后續(xù)偏移地址的內(nèi)存單元中,最后一個(gè)數(shù)據(jù)‘E’所在內(nèi)存單元的偏移地址為0009H。變量ARRAY所在語句的起始偏移地址為0000H,這就是變量 ARRAY的偏移地址屬性(注:變量的屬性將在下面詳細(xì)討論)。由于ARRAY語句的末 地址為0009H,故下一語句行(COUNT語句行)所在的偏移地址就是000AH,此語句中的 $ 就是該行(當(dāng)前行)的偏移地址,即000AH。故表達(dá)式可計(jì)算得出為
$-ARRAY=000AH-0000H=000AH=10
因而賦給符號(hào)常量COUNT的值為10,COUNT的英文含義為計(jì)數(shù),它實(shí)際上表示的是ARRAY數(shù)組的數(shù)據(jù)元素個(gè)數(shù),即10十字節(jié)數(shù)據(jù)。在程序中用MOVCX,COUNT 指令來設(shè)置計(jì)數(shù)器CX的初值,然后就可用對(duì)CX進(jìn)行減一計(jì)數(shù)的方法來控制對(duì)10個(gè)數(shù)據(jù)的處理。
例2部分程序內(nèi)容為
STACKSEGMENT
STAKDB100 DUP(?);保留100個(gè)內(nèi)存單元(字節(jié))作堆棧區(qū)
TOPEQU$—STAK;給TOP賦值為100
STACKENDS
CODESEGMENT

MOVAX,STACK;將段基值STACK賦給段寄存器SS
MOVSS,AX
MOVSP,TOP;設(shè)置堆棧指針
此時(shí),內(nèi)存中堆棧段的分配如下:
2.變量
(1)變量的定義和屬性。如前所述,變量是數(shù)據(jù)定義語句中的一項(xiàng),它是由程序員在編程時(shí)按照標(biāo)識(shí)符規(guī)定取定的。
當(dāng)在數(shù)據(jù)定義語句的第一項(xiàng)對(duì)變量命名后,該變量就是已定義了的,已定義的變量具有下列五種屬性:
1)段屬性
表示格式:SEG變量
它表示變量所在段的段基值。
2)偏移地址屬性
表示格式: OFFSET變量
它表示變量所在處的偏移地址。
3)類型屬性
表示格式: TYPE變量
它表示變量所在內(nèi)存數(shù)據(jù)的類型。數(shù)據(jù)類型有字節(jié)、字、雙字、8字節(jié)和10字節(jié),是在該語句中用命令DB、DW、DD、DQ和DT予以定義的。對(duì)于不同的數(shù)據(jù)類型,變量的類型屬性具有如下不同的值:
字節(jié)數(shù)據(jù)時(shí),TYPE=1
宇數(shù)據(jù)時(shí),TYPE=2
雙字?jǐn)?shù)據(jù)時(shí),TYPE=4
8字節(jié)數(shù)據(jù)時(shí), TYPE=8
10字節(jié)數(shù)據(jù)時(shí),TYPE=10
4)長(zhǎng)度屬性
表示格式: LENGTH 變量
它表示變量所在數(shù)組的數(shù)據(jù)元素個(gè)數(shù)。
需注意,只有當(dāng)數(shù)據(jù)用復(fù)制符 DUP 定義時(shí),LENGTH才等于數(shù)組的元素個(gè)數(shù),否則
LENGTH就等于1。
5)規(guī)模屬性、
表示格式:SIZE變量
它表示變量所在數(shù)組的字節(jié)總數(shù),且
SIZE:LENGTH*TYPE。
同以上LENGTH的情況,只有當(dāng)數(shù)據(jù)用復(fù)制符DUP定義時(shí),LENGTH才等于數(shù)組的元素個(gè)數(shù),否則LENGTH就等于1。
這些屬性,程序員編程時(shí)均可引用,從而方便編程。
例如:部分程序內(nèi)容為
DATASEGMENT
BUFlDBNI,N2,N3,…,N10;N1~N10為10個(gè)字節(jié)數(shù)據(jù)
BUF2DB10 DUP(0)
BUF3DW10 DUP(?)
DATAENDS
設(shè)該段的段基值為2000H,則
SEG BUF1=2000H
OFFSET BUF1=0000H
TYPE BUF1=1
LENGTH BUF1=1
SIZEBUF1=1
SEGBUF2=2000H
OFFSETBUF2=000AH
TYPEBUF2=1
LENGTH BUF2=10
SIZEBUF2=10
SEGBUF3=2000H
OFFSETBUF3=0014H
TYPE BUF3=2
LENGTHBUF3=10
SIZE BUF3=20
這些屬性在程序中的應(yīng)用舉例
MOV AX,SEG BUFl;設(shè)置段寄存器DS
MOV DS,AX
MOVSI,OFFSET BUFl ;設(shè)置地址指針SI
MOV CX,LENGTH BUF2;設(shè)置計(jì)數(shù)器CX
MOV BL,SIZEBUF3;設(shè)置計(jì)數(shù)器BL
MOV AL,BUF1;從內(nèi)存取數(shù)據(jù)到寄存器AL。此指令是指令
;MOV AL,OFFSET BUFl]的簡(jiǎn)便寫法,是匯編程序能接受的。
;本指令的功能是將數(shù)據(jù)N1送到寄存器AL,
MOV AH,BUFl+2;這是MOVAH,[OFFSETBUFl+2]的簡(jiǎn)便寫法,指令的功能是將
;數(shù)據(jù)N3送到寄存器AH
(2)屬性運(yùn)算符。如前所述,定義了的變量具有一定的屬性。對(duì)變量屬性的引用可方便程序員的編程工作。但變量的類型屬性有時(shí)會(huì)限制它的應(yīng)用。
設(shè)數(shù)據(jù)定義語句為:
BUFWDW1234H,5678H
其中變量BUFW的類型屬性為字,編程時(shí)可很方便地用指令:
MOV AX,BUFW
將字?jǐn)?shù)據(jù)1234H傳送到寄存器AX。但若要傳送字節(jié)數(shù)據(jù)就有問題了,因?yàn)橹噶頜OVAL,BUFW是非法的,所以非法是由于指令中的兩個(gè)操作數(shù)AL(字節(jié)數(shù)據(jù))和BUFW(字?jǐn)?shù)據(jù))的類型不同,這樣的指令是不能匯編和執(zhí)行的。為了解決這個(gè)問題,匯編語言提供了屬性運(yùn)算符PTR、THIS和LABEL:
1)類型(重新)指定運(yùn)算符PTR
格式:類型PTR exp
其中類型可以是BYTE、WORD、DWORD、NEAR和FAR(注:前三個(gè)是變量的類型屬性,后兩個(gè)是標(biāo)號(hào)的類型屬性);exp是表達(dá)式,是存儲(chǔ)器操作段,當(dāng)為變量重新指定類型時(shí)exp就是變量名。
運(yùn)算符PIR的作用是仍按后面的表達(dá)式去尋址,不管它原來有無類型或是那一種類型,PTR定義后,就按PIR前面類型項(xiàng)指定的類型看待,實(shí)際上,PTR是給后面的存儲(chǔ)器操作數(shù)賦予新的前面的數(shù)據(jù)類型(注:對(duì)于標(biāo)號(hào)則為地址類型)。運(yùn)算符PTR的應(yīng)用如下:
a.重新指定變量類型
BUFWDW1234H,5678H
下列指令均為合法的
MOV AX,BUFW;AX ← 1234H
MOVAL,BYTE PTRBUFW;AL ← 34H
b.指定內(nèi)存操作數(shù)的類型,下列指令
INC[BX]非法的,因?yàn)榛穼ぶ返膬?nèi)存操作數(shù)的類型未示明,無法進(jìn)行匯編和執(zhí)行。
用PTR指定類型后,指令就是合法的了,如
INC BYTE PTR[BX]
INC WORD PTR[BX]
c.用EQU和PTR定義一個(gè)新的變量
BUFWDW1234H,5678H
BUFBEQUBYTE PTR BUFW
這使新變量BUFB具有和變量BUFW相同的段屬性、偏移地址屬性,但兩者類型不
同,BUFW類型屬性為字,而BUFB類型屬性為字節(jié)。 此時(shí),下列指令就是合法的。
MOVAX,BUFW;AX ← 1234H
MOVAL,BUFB;AL ← 34H
2)屬性指定運(yùn)算符THIS ,格式:
THIS類型
類似于上節(jié)PTR運(yùn)算符的應(yīng)用。THIS和EQU一起用來定義一個(gè)新變量,它與原變量具有相同的段屬性和偏移地址屬性,但類型屬性不同。
例如:BUFBEQU THISBYTE
BUFWDW1234H,5678H
這樣,BUFB和BUFW具有相同的段屬性和偏移地址屬性,但BUFB的類型屬性是字節(jié),此時(shí)下列指令都是合法的。
MOV AX,BUFW;AX ← 1234H
MOVAL,BUFB;AL ← 34H
注意,BUFB語句和BUFW語句必須是緊鄰的,且BUFB語句在BLN語句的前
面。
3)命令LABEL
格式: 變量/標(biāo)號(hào)LABEL類型
命令LABEL用來定義其語句中的變量(或標(biāo)號(hào))的類型屬性為語句中設(shè)定的類型, 此時(shí)變量(或標(biāo)號(hào))的段屬性和偏移地址屬性是由該語句的位置確定的。
例如:BUFBLABEL BYTE
BUFW DW1234H,5678H
則下列指令是合法的
MOVAX,BUFW;AX← 1234H
MOVAL,BUFB;AL ← 34H
注意,BUFB語句和BUFW語句必須是緊鄰的,且BUFB語句在BUFW語句的前面。
四、指令性語句
指令性語句由指令組成。指令性語句是構(gòu)成代碼段的基礎(chǔ)。指令性語句只是在代碼段中才有,在數(shù)據(jù)段、附加段和堆棧段中是沒有指令性語句的。程序運(yùn)行時(shí),CPU執(zhí)行指令性浯句中的指令,而指示性語句在程序運(yùn)行時(shí),是不由CPU執(zhí)行的,指示性語句是用來指示匯編程序進(jìn)行匯編操作的。
指令性語句的格式為
[標(biāo)號(hào)]操作碼[操作數(shù)] [;注釋]
其中操作碼和操作數(shù)就是指令,本書第三章已討論了8086/8088指令系統(tǒng),此處不再贅述。
本節(jié)將對(duì)標(biāo)號(hào)和操作數(shù)進(jìn)行討論。
(一)標(biāo)號(hào)
標(biāo)號(hào)是程序員編程時(shí)按標(biāo)識(shí)符規(guī)定取定的,并常常具有它在程序中的作用的含義,如
NEXT、AGAIN等,并且標(biāo)號(hào)一定要用冒號(hào)(:)結(jié)尾。
在指令性語句中寫上標(biāo)號(hào)后,就定義了該標(biāo)號(hào),定義了的標(biāo)號(hào)具有下列三種屬性。
1段屬性
表示格式:SEG標(biāo)號(hào)
它表示標(biāo)號(hào)所在段的段基址。
2.偏移地址屬性
表示格式:OFFSET標(biāo)號(hào)
它表示標(biāo)號(hào)所在位置的偏移地址,即該語句的指令的第一字節(jié)所在內(nèi)存單元的偏移地址。
3.類型屬性
表示格式:TYPE標(biāo)號(hào)
標(biāo)號(hào)通常用作轉(zhuǎn)移指令的目的操作數(shù),即轉(zhuǎn)移去的目的地址。我們知道,轉(zhuǎn)移有NEAR(近轉(zhuǎn)移,即段內(nèi)轉(zhuǎn)移)和FAR(遠(yuǎn)轉(zhuǎn)移,即段間轉(zhuǎn)移)兩種,NEAR和FAR是轉(zhuǎn)移的兩種類型,因而也就是標(biāo)號(hào)的類型。類型為NEAR的標(biāo)號(hào)供段內(nèi)轉(zhuǎn)移用,而類型為FAR的標(biāo)號(hào)則供段間轉(zhuǎn)移用。
標(biāo)號(hào)的類型屬性和標(biāo)號(hào)的類型有關(guān):
NEAR時(shí),TYPE = -1
FAR時(shí),TYPE = -2
其中的-1和-2投有真正的物理意義,只是以這樣的具體數(shù)值表示而已(注:由于要和變量的類型屬性清楚地區(qū)別,所以用的是負(fù)值)。
指令性語句中的標(biāo)號(hào),其類型一般都是NEAR。為了適應(yīng)段間調(diào)用的需要,要把它的類型改換成FAR。與前面變量改變類型相類似,標(biāo)號(hào)類型的改變可應(yīng)用運(yùn)算符PTR、THIS和LABEL,可以是重新指定類型,也可以定義一個(gè)新標(biāo)號(hào)。
設(shè)程序中標(biāo)號(hào)為METER,其類型為NEAR。若定義一個(gè)新變量KILOMT,其類型為FAR,而KILOMT的段屬性和偏移地址屬性則是和METER的相同。這樣,段內(nèi)轉(zhuǎn)移時(shí)用METER作為目的操作數(shù),而段間轉(zhuǎn)移時(shí)則用KILOMT作為目的操作數(shù),兩個(gè)標(biāo)號(hào)表示的目的地址是同一個(gè),即均轉(zhuǎn)移到程序中標(biāo)號(hào)為METER處。具體方法如下。
(1)用PTR重新指定類型:
段內(nèi)轉(zhuǎn)移用指令
JMP METER
段間轉(zhuǎn)移用指令
JMPFARPTR METER
(2)用EQU和PTR定義新標(biāo)號(hào)KILOMT
METER:┅
KILOMTEQU FAR PTRMETER
(3)用EQU和THIS定義新標(biāo)號(hào)KILOMT
KILOMT EQU THISFAR
METER:┅
(4)用LABEL定義新標(biāo)號(hào)KILOMT
KILOMTLABELFAR
METER:┅
這四種方法和前面變量改變類型的方法是一樣的,這里不贅述。
(二)操作數(shù)
指令中的操作數(shù)可按尋址方式表示,尋址方式在前面第三章中已討論,此處不再贅述。操作數(shù)也可以用段名、符號(hào)常量、變量、屬性、過程名和標(biāo)號(hào)來表示,如下例所示
MOVAX,DATA;DATA是段名,立即尋址方式
MOVCX,COUNT;COUNT是符號(hào)常量,立即尋址方式
MOV BL,BUFFER;BUFFER是變量,直接尋址方式
MOVSI,OFFSET ARRAY;OFFSETARRAY是屬性,立即尋址方式
CALL SBRT1;SBRT1是過程名。直接尋址方式
JMPDONE;DONE是標(biāo)號(hào),直接尋址方式
LOOP AGAIN;AGAIN是標(biāo)號(hào),直接尋址方式
五、宏指令
程序員用匯編語言編程時(shí),對(duì)于程序中多次重復(fù)使用的指令序列(即很小的程序段),可定義一條宏指令,編寫程序時(shí)就用這條宏指令代替該指令序列,從而簡(jiǎn)化書寫工作:
(一)宏定義、宏名字、宏調(diào)用和宏展開
宏定義就是定義宏指令,宏定義的命令是MACRO和ENDM。宏定義的格式為
宏名字MACRO[形式參數(shù)]

ENDM
其中宏名字是宏指令的名字,是程序員按標(biāo)識(shí)符規(guī)定取定的。命令MACR0和 ENDM之間的指令序列就是該宏指令的內(nèi)容,稱為宏體。帶方括號(hào)的形式參數(shù)是任選項(xiàng),當(dāng)無形式參數(shù)時(shí)就無該項(xiàng),當(dāng)有多個(gè)形式叁數(shù)時(shí)相互間由逗號(hào)隔開。形式參數(shù)亦稱啞參數(shù)、啞元或變?cè)呛牦w中有關(guān)指令的操作碼、操作數(shù)或它們的一部分。形式參數(shù)是沒有物理童義的,只有用實(shí)參數(shù)代替形式參數(shù)后,相應(yīng)的指令才有實(shí)際意義。
在程序中應(yīng)用宏指令稱為宏調(diào)用,宏調(diào)用的格式是:
宏名字[實(shí)參數(shù)]
其中實(shí)參數(shù)是與宏定義中的形式參數(shù)一一對(duì)應(yīng)的。
匯編時(shí),匯編程序用已由實(shí)參數(shù)取代形式參數(shù)的宏體取代程序中的宏指令,稱為宏展開,此時(shí)程序中已全部是可執(zhí)行的指令序列了。
例1無形式參數(shù)的宏指令
宏定義SAVEREG MACRO
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSHDI
ENDM
宏指令名為SAVEREG,功能是有關(guān)寄存器內(nèi)容進(jìn)棧保護(hù)現(xiàn)場(chǎng)。
宏調(diào)用
程序

SAVEREG

SAVEREG
宏展開
程序

PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI

PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
匯編程序再將此宏展開后的程序轉(zhuǎn)換成機(jī)器碼生成目標(biāo)程序,
例2帶有形式參數(shù)的宏指令
宏定義MULTIPLY MACRO OPRl,ORR2,RESULT
PUSHAX
MOVAL,OPRl
1MULOPR2
MOVRESULT,AX
POPAX
ENDM
其中有三個(gè)形式參數(shù)OPRl、OPR2和RESULT,它們都是宏體指令中的操作數(shù)。
宏調(diào)用程序
MULTIPLY CL,VAR,XYZ[BX];實(shí)參數(shù)CL是寄存器,VAR是變量,
XYZ[BX]是基址尋址的內(nèi)存操作數(shù),
MULTIPLY 240,BL,SAVE;實(shí)參數(shù)240是立即數(shù),BL是寄存器,
SAVE是變量
宏展開程序
PUSHAX
MOVAL,CL
IMULVAR
MOVXYZ[BX],AX
POPAX

PUSH AX
MOV AL,240
IMULBL
MOV SAVE,AX
POP AX

匯編程序?qū)⒋撕暾归_后的程序轉(zhuǎn)換成機(jī)器碼生成目標(biāo)程序。
(二)宏指令與子程序的差別
如上所述,宏指令是將一段程序(指令序列)用一條宏指令來代替,以簡(jiǎn)化書寫源程序。子程序(過程)也有類似的功能,但兩者是有差別的,具體如下:
(1)宏指令簡(jiǎn)化了源程序的書寫。但在匯編時(shí),匯編程序?qū)曛噶畹膮R編處理是將宏指
令的宏體(即程序段)原原本本地插入到宏指令調(diào)用處,然后轉(zhuǎn)換成機(jī)器碼生成目標(biāo)程序。因此,宏指令雖簡(jiǎn)化了源程序,但并沒有簡(jiǎn)化目標(biāo)程序,有多少次宏調(diào)用,在目標(biāo)程序中就有同樣多次數(shù)的目標(biāo)代碼插入。所以宏指令不節(jié)省目標(biāo)程序需占用的內(nèi)存單元。
子程序(過程)在執(zhí)行時(shí)是由CPU用調(diào)用(CALL)來處理的。若在一個(gè)源程序中多次調(diào)用同一個(gè)子程序,則在目標(biāo)程序中,主程序中只有調(diào)用(CALL)指令的目標(biāo)代碼,CALL指令的目標(biāo)代碼只有幾個(gè)字節(jié),該目標(biāo)代碼出現(xiàn)的次數(shù)就是調(diào)用次數(shù)。而子程序的目標(biāo)代碼在整個(gè)目標(biāo)程序中只出現(xiàn)一次,所以相應(yīng)地其目標(biāo)程序就占用較少的內(nèi)存單元,即可節(jié)省內(nèi)存單元。
(2)采用子程序方式時(shí),每調(diào)用一次就需執(zhí)行一次CALL和RET指令,而宏指令方式時(shí),并無此兩條指令。因此,使用宏指令時(shí)的程序執(zhí)行時(shí)間比子程序時(shí)的程序執(zhí)行時(shí)間要短一,即宏指令時(shí)程序執(zhí)行速度快。
由上可知,宏指令和子程序各有特點(diǎn),宏指令執(zhí)行速度快而子程序占用內(nèi)存少。一般,對(duì)于程序段較長(zhǎng)的情況,采用子程序可節(jié)省很多內(nèi)存而對(duì)執(zhí)行速度影響不大;對(duì)于程序段較短的情況,采用宏指令可加快速度而對(duì)增加占用內(nèi)存容量影響不大,尤其對(duì)于程序段較短而形式參數(shù)較多的情況,宏指令就更能顯示其突出的優(yōu)點(diǎn)了。

聲明:

(一)由于考試政策等各方面情況的不斷調(diào)整與變化,本網(wǎng)站所提供的考試信息僅供參考,請(qǐng)以權(quán)威部門公布的正式信息為準(zhǔn)。

(二)本網(wǎng)站在文章內(nèi)容來源出處標(biāo)注為其他平臺(tái)的稿件均為轉(zhuǎn)載稿,免費(fèi)轉(zhuǎn)載出于非商業(yè)性學(xué)習(xí)目的,版權(quán)歸原作者所有。如您對(duì)內(nèi)容、版權(quán)等問題存在異議請(qǐng)與本站聯(lián)系,我們會(huì)及時(shí)進(jìn)行處理解決。

報(bào)名提醒

【考試時(shí)間:4月12-13日】

浙江自考服務(wù)中心

  • 微信公眾號(hào)
  • 考生交流群
  • 微信公眾號(hào) 掃一掃加關(guān)注微信公眾號(hào)

    與考生自由互動(dòng)、并且能直接與專業(yè)老師進(jìn)行交流解答。

  • 考生交流群 掃一掃加入微信交流群

    與考生自由互動(dòng)、并且能直接與專業(yè)老師進(jìn)行交流解答。

主站蜘蛛池模板: 和田县| 白水县| 钦州市| 北票市| 龙南县| 宁明县| 榕江县| 察哈| 浮山县| 赤峰市| 翁源县| 宣武区| 定襄县| 沁水县| 滁州市| 安岳县| 江华| 乡宁县| 张家港市| 芒康县| 蓬溪县| 察雅县| 天峨县| 清水县| 武宣县| 怀远县| 江孜县| 石棉县| 仲巴县| 新化县| 阜宁县| 和静县| 澄江县| 巨野县| 固安县| 福建省| 丰城市| 绥阳县| 永康市| 阳春市| 丽江市|

關(guān)注公眾號(hào)

回復(fù)“免費(fèi)資料”領(lǐng)取復(fù)習(xí)資料

微信公眾號(hào)

微信公眾號(hào)

微信公眾號(hào)

微信交流群

<<點(diǎn)擊收起

在線咨詢

在線咨詢

APP

APP
下載

man
聯(lián)系
微信
wxlogo
掃描
二維碼
反饋建議
反饋
建議
回到頂部
回到
頂部
app
微信客服
 微信公眾號(hào)