版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
怎樣運(yùn)轉(zhuǎn)?1.在開始菜單項(xiàng)選擇在它的圖標(biāo),或許直接運(yùn)轉(zhuǎn)Emu8086.EXE2.在"FILE"菜單中選擇"SAMPLE"3.點(diǎn)擊"CompileandEmulate"按紐(或許按快捷鍵F5)4.點(diǎn)擊"SingleStep"按紐(或許按快捷鍵F8),能夠查察代碼怎樣運(yùn)轉(zhuǎn).十進(jìn)制系統(tǒng)目前使用最多的是十進(jìn)制.十進(jìn)制系統(tǒng)有10個數(shù)字0,1,2,3,4,5,6,7,8,9利用這些數(shù)字能表示任何數(shù)值,比如754這些數(shù)字是由每一位數(shù)字乘以“基數(shù)”的冪累加而成的(上一個例子中基數(shù)是10由于十進(jìn)制中有十個數(shù)字)。地點(diǎn)對于每一個數(shù)字是很重要的。比如,你將上一個例子中的“7”放到結(jié)547尾:數(shù)值就成為:特別提示:任何數(shù)字的0次冪都是1,0的0次冪也是1二進(jìn)制計算機(jī)沒有人類聰慧(起碼此刻是這樣),制造一個只有開關(guān)或許稱為0,1兩種狀態(tài)的電子機(jī)器很簡單。計算機(jī)使用二進(jìn)制系統(tǒng),只有兩個數(shù)字
0,
1基地為
2每一位二進(jìn)制數(shù)稱作一位(BIT),4BIT節(jié)構(gòu)成一個字(WORD),
構(gòu)成一個半字節(jié)(兩個字構(gòu)成一個雙字
NIBBLE),8BIT(DOUBLEWORD
構(gòu)成一個字節(jié)(BYTE),兩個字)(極少使用):習(xí)慣上在一串二進(jìn)制后邊加上“二進(jìn)制10100101b表示十進(jìn)制的
這樣b,”,我們能夠知道165,計算方法以下:
101b
是二進(jìn)制表示十進(jìn)制的
5。十六進(jìn)制系統(tǒng)十六進(jìn)制系統(tǒng)使用16個數(shù)字0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F基底是16.十六進(jìn)制特別緊湊,便于閱讀
.將二進(jìn)制變換為十六進(jìn)制很簡單,
半字節(jié)(4bits)對應(yīng)一位十六進(jìn)制以下表DecimalBinaryHexadecimal(base10)(base2)(base16)000000100011200102300113401004501015601106701117810008910019101010A111011B121100C131101D141110E151111F習(xí)慣上我們在一個十六進(jìn)制數(shù)的后邊加上"H”,以便和其余進(jìn)制差別,這樣我們就知道5Fh是一個十六進(jìn)制數(shù)表示十進(jìn)制的95。習(xí)慣上,我們也在以字母開頭(從A到F)的十六進(jìn)制數(shù)前面加上”0"比如:0E120h.十六進(jìn)制1234h等于4660:十進(jìn)制到此外進(jìn)制的換算在換算中,將十進(jìn)制數(shù)不停除以目標(biāo)進(jìn)制的基底,每一次都要記錄下商和余數(shù),直到商0。余數(shù)用來表示結(jié)果.下邊是一個十進(jìn)制39(基底是10)到十六進(jìn)制(基底是16)的換算:結(jié)果為27H上例中所有的余數(shù)都小于10,不用使用字母.再舉一個更復(fù)雜的例子:十進(jìn)制43868換算為十六進(jìn)制:結(jié)果是0AB5Ch,使用上邊提到的表將大于9的數(shù)字代替成字母。運(yùn)用相同的原理,我們能夠換算為二進(jìn)制(用2作除數(shù)),或許是先換算成十六進(jìn)制,再用上邊的表換算成二進(jìn)制:于是,獲取二進(jìn)制:有符號數(shù)對于十六進(jìn)制數(shù)0FFh沒法確立它是正數(shù)仍是負(fù)數(shù),由于它能夠表示十進(jìn)制的"255”或許”-1"。8位能夠表示256個狀態(tài),于是,我們能夠假定前128個表示正數(shù)(從0到127),接下來的128個數(shù)(從128到256)表示負(fù)數(shù)。假如想表示”-5”,我們從256中減去5,即256-5=251。用這類復(fù)雜的方法表示一個負(fù)數(shù)有著數(shù)學(xué)依照的,數(shù)學(xué)上"-5”加上"5”等于0。當(dāng)我們將兩個8位的數(shù)字5和251相加時,結(jié)果超出255,溢出處理為0!128到256高位一直是1,這個能夠作為數(shù)字符號的標(biāo)記對于字(16位),16位有65536個狀態(tài),頭32768個狀態(tài)(從0到32767)用來表示正數(shù),下邊的32768個狀態(tài)(從32767到65535)表示負(fù)數(shù)Emu8086帶有數(shù)制變換工具,也能夠計算各樣數(shù)值表達(dá)式.選擇菜單Math項(xiàng):NumberConvertor(數(shù)制變換)能夠?qū)崿F(xiàn)隨意數(shù)制之間的變換。在文本框中填寫源數(shù)值,將自動變換到隨意的數(shù)制。能夠作8位或許16位變換.ExpressionEvaluator(表達(dá)式計算)能夠用來計算不一樣數(shù)制的計算以及從一個進(jìn)制到另一個進(jìn)制的轉(zhuǎn)換。輸入表達(dá)式,按下回車,結(jié)果就會以你選定的進(jìn)制表示。最長能夠進(jìn)行32位的計算。當(dāng)在Signed打鉤選中時(除了八進(jìn)制和雙字),最前面的一位將被認(rèn)作是符號位。這樣以來,0FFFFFFFFh將被以為是十進(jìn)制的-1。比如,你計算0FFFFh*10h+0FFFFh(8086CPU所能接見的最大內(nèi)存地點(diǎn)).假如你選中Signed和Word選項(xiàng),結(jié)果是—17(由于表達(dá)式被以為是(—1)*16+(-1))。假如想依照無符號數(shù)計算,請不要選擇Signed表達(dá)式為65535*16+65535計算結(jié)果將是1114095相同你能夠使用NumberConvertor將非十進(jìn)制換算為有符號的十進(jìn)制,而后依據(jù)十進(jìn)制計算。支持以下運(yùn)算:~not(invertsallbits).*multiply。/divide.modulus.+sum?!猻ubtract(andunary-).<〈shiftleft?!?gt;shiftright。&bitwiseAND。^bitwiseXOR.|bitwiseOR。二進(jìn)制一定有“b”作結(jié)尾,比如00011011b十六進(jìn)制一定有”h"作結(jié)尾,此外,當(dāng)?shù)匾晃皇亲帜笗r,最前面一定加上0,比如:0ABCDh八進(jìn)制一定有"o”作結(jié)尾,比如:77o什么是匯編語言?匯編語言是基層編程語言。為了學(xué)習(xí)這門語言,你需要對于計算機(jī)構(gòu)造有所認(rèn)識。計算機(jī)系統(tǒng)模型以下:系統(tǒng)總線算機(jī)的心臟
systembus(圖中黃色部分,大多半的運(yùn)算都是在CPU
)是將計算機(jī)各個部分連結(jié)到一同的零件。CPU是計中達(dá)成的。RAM是讀取而且寄存將要履行的程序的地方。CPU內(nèi)部通用寄存器8086CPU有8個通用寄存器,每一個寄存器都有自己的名稱:?AX累加寄存器accumulatorregister(分為AH/AL).?BX基址寄存器baseaddressregister(分為BH/BL)。?CX計數(shù)寄存器countregister(分為CH/CL)。?DX數(shù)據(jù)寄存器dataregister(分為DH/DL).SI源變址寄存器sourceindexregister.?DI目的變址寄存器destinationindexregister。?BP基址指針寄存器basepointer.?SP貨倉寄存器stackpointer。編程中,由程序員決定通用寄存器的詳細(xì)用途.寄存器的主要目的是保留數(shù)值(變量)。上邊提到的寄存器是16位的,意思是(二進(jìn)制),或許12345(十進(jìn)制形式).4個通用寄存器(AX,BX,CX,DX)在使用時分為兩個8位寄存器,比如假定AX=0011000000111001b,AH=00110000bAL=00111001b。當(dāng)你改正此中隨意8位值,整個16位寄存器的值相同改變。相同對于其余的3個寄存器,“H"表示高8位,“L”表示低8位.寄存器在CPU內(nèi)部,接見中它們速度遠(yuǎn)遠(yuǎn)超出內(nèi)存。由于,接見內(nèi)存需要經(jīng)過系統(tǒng)總線,所以時間要長一些。而接見寄存器中的數(shù)據(jù)幾乎不需要時間。于是,編程中,應(yīng)當(dāng)盡量在寄存器中保留數(shù)據(jù)。固然寄存器很小,而且這些寄存器都有詳細(xì)用途,但他們依舊是寄存計算中暫時數(shù)據(jù)的好地方。段寄存器CS代碼段寄存器,用來寄存目前正在運(yùn)轉(zhuǎn)的指令DS數(shù)據(jù)段寄存器,用來寄存目前運(yùn)轉(zhuǎn)程序所用的數(shù)據(jù)ES附帶段寄存器,由程序員決定用途SS貨倉段寄存器,指出貨倉所在地區(qū)只管允許在段寄存器中寄存任何數(shù)據(jù),可是這決不是一個好想法。段寄存器有著特別特別的目的--指出能夠接見內(nèi)存塊的地點(diǎn)。段寄存器與通用寄存器共同工作就能夠接見隨意的內(nèi)存地區(qū).比如,假如我們打算接見物理地點(diǎn)是12345h(十六進(jìn)制)的內(nèi)存單元,我們應(yīng)設(shè)置DS=1230hSI=0045h這樣以來,我們便能接見超出一個寄存器(16位)所能表示的內(nèi)存地點(diǎn)的范圍。CPU計算物理地點(diǎn)的方法是將段寄存器乘以10H在加上一個特定的通用寄存器。(1230h*10h+45h=12345h):這類,由兩個寄存器生成的地點(diǎn)被稱為有效地點(diǎn)(effectiveaddress)默認(rèn)下,BX,SI及DI與DS共同工作,BPSP與SS寄存器共同工作。其余的通用寄存器不可以形成有效地點(diǎn)!相同,只管BX能夠形成有效地點(diǎn),可是BHBL不可以!控制寄存IP指令指針寄存器instructionpointer、FlagsRegister狀態(tài)標(biāo)記寄存器IP一直同CS共同工作,指出目前履行的指令.FlagsRegister達(dá)成一次數(shù)學(xué)運(yùn)算后,由CPU自動改正,經(jīng)過它能夠獲取目前結(jié)果種類,也能夠作為跳轉(zhuǎn)語句條件。往常你沒法直接接見它們.尋址方式我們能夠經(jīng)過下邊的四個寄存器來尋址BX,SI,DI,BP.經(jīng)過計算[]符號中的值,我們能夠接見到不一樣內(nèi)存單元的值。詳細(xì)組合請看下表:[BX+SI][SI][BX+DI][DI][BP+SI]d16(variableoffsetonly)[BP+DI][BX]SI]+d8[BX+SI]+d16[DI]+d8[BX+DI]+d16[BP]+d8[BP+SI]+d16[BX]+d8[BP+DI]+d16
BX+SI]+d8BX+DI]+d8BP+SI]+d8[BP+DI]+d8[SI]+d16[DI]+d16[BP]+d16[BX]+d16d8-表示8位偏移量d16—表示16位偏移量偏移量能夠是一個立刻數(shù)或許是一個變量的偏移,或許兩者兼顧。這取決于編譯器怎樣計算獨(dú)自的立刻數(shù).偏移量能夠在[]符號里面或許外面,這不影響編譯器生成相同的機(jī)器碼。偏移量是一個有符號數(shù),能夠是正數(shù)或許負(fù)數(shù)。一般說來,8位或許16位,對于編譯后的結(jié)果是有影響的。比如,假定DS=100,BX=30,SI=70.以下尋址方式[BX+SI]+25計算物理地點(diǎn)為100*16+30+70+25=1725默認(rèn)下,DS寄存器應(yīng)用在除了BP寄存器以外的所有物理地點(diǎn)計算中,寄存器是和SS寄存器一同工作的.用過下邊的表,你能夠和輕松記著誰和誰是關(guān)系在一同使用的。上表中,你能夠從每一列中選擇一個或許忽視隨意一個列。比方,能夠看到,BX和BP一直不會選到一同
.SI
和
DI
不會選到一同。這是一個計算地點(diǎn)模式[
BX+5
]段寄存器(
CS,DS,
SS,ES)中數(shù)值被稱作
"段偏移”
。目的寄存器(
BX,
SI,
DI,BP)
中數(shù)值被稱作"偏移量
"比方,ds中數(shù)值為1234h,si中數(shù)值為7890h,能夠記作1234:7890物理地點(diǎn)為1234h10h+7890h=19BD0h在編譯過程中使用以下申明數(shù)據(jù)種類BYTEPTR-
表示字節(jié)
;
WORDPTR
—表示字(
2個字節(jié))比如:
BYTEPTR
[BX];按字節(jié)接見
;
WORDPTR[BX
];按字接見Emu8086允許使用以下更簡短的前綴b.-等價于上邊的BYTEPTR;w。-等價于上邊的WORDPTR有時,編譯器能夠自動計算出數(shù)據(jù)種類,
可是假如一個參加運(yùn)算的數(shù)是立刻數(shù),
這類方法就不行靠了。MOV
指令將第二個操作數(shù)(源)拷貝到第一個操作數(shù)(目的)指定位值通用寄存器或許內(nèi)存單元,目的寄存器能夠是通用寄存器或許內(nèi)存單元
,源操作數(shù)能夠是立刻數(shù),,源和目的一定是相同大小,要么都是字節(jié)要么都是字操作種類以下:MOVREG,memoryMOVmemory,REGMOVREG,REGMOVmemory,immediateMOVREG,immediateREG:AX,BX,CX,DX,AH,AL,BL,BH,CH,CL,DH,DL,DI,SI,BP,SP.memory:[BX],[BX+SI+7],變量,等等immediate:5,-24,3Fh,10001101b,等等.mov指令只支持以下段寄存器:MOVSREG,memoryMOVmemory,SREGMOVREG,SREGMOVSREG,REGSREG:DS,ES,SS,注意CS只好作操作源REG:AX,BX,CX,DX,AH,AL,BL,BH,CH,CL,DH,DL,DI,SI,BP,SP.memory:[BX],[BX+SI+7],variable,等等MOV指令不可以用來設(shè)置CS和IP寄存器的值。下邊是一個使用MOV指令的例子:#MAKE_COM#;表示,這個是一個com程序ORG100h;COM程序一定的MOVAX,0B800h;將ax設(shè)置為B800h。MOVDS,AX;將AX值拷貝到DS。MOVCL,’A’;將ASCII碼'A’的值傳遞到cl,這個值是41h。MOVCH,01011111b;將ch設(shè)置為二進(jìn)制的01011111bMOVBX,15Eh;將BX設(shè)置成15Eh.MOV[BX],CX;將CX放到bx指出的內(nèi)存單元B800:015ERET;返回操作系統(tǒng)你能夠?qū)⑸线叺某绦蛸N入Emu8086代碼編寫器,接下來按下[complieandemulate](或者按F5)模擬窗口將顯示這個程序已經(jīng)調(diào)入,點(diǎn)擊[singlestep]察看寄存器數(shù)值變化,你能夠猜到";"表示說明,編譯器忽視在”;”后邊的全部,程序結(jié),束可后以看到以下你窗口事實(shí)上,上邊程序是將字符直接寫入顯示內(nèi)存.經(jīng)過上邊的例子,你能夠發(fā)現(xiàn)MOV指令是特別實(shí)用的。變量變量是一個內(nèi)存地點(diǎn)。對于編程者來說,使用諸如名稱為“var1"這變樣量的保留數(shù)據(jù)遠(yuǎn)遠(yuǎn)比使用5a73:235b這樣的地點(diǎn)簡單的多.特別是當(dāng)你使用10個以上的變量的時侯。編譯器支持這兩種變量BYTE和WORD.(字節(jié)和字)申明變量的方法:nameDBvalue名稱DB值nameDWvalue名稱DW值DB
—
staysforDefineByte
。DW
—
staysforDefineWord
。name
-能夠是任何字母與數(shù)字構(gòu)成,可是一定由字母開頭
.能夠經(jīng)過不命名來申明一個沒出名稱的的變量(這個變量只有地點(diǎn),沒出名稱)value-能夠是任何數(shù)值支持三種進(jìn)制(十六進(jìn)制表示初始值沒有確立。
,二進(jìn)制和十進(jìn)制)
,你能夠使用”
?”符號你可能從第二章認(rèn)識到
,MOV
指令是將數(shù)值從源拷貝到目的。
讓我們再看一個
MOV
指令的例子#MAKE_COMORG100hMOVAL,var1
#MOVBX
,
var2RET;
stopstheprogram
。VAR1DB7var2DW1234h將上邊的代碼拷貝到emu8086源程序編寫器中,按下F5鍵編譯并在模擬器中履行。你會看到以下畫面從畫面能夠看出,反編譯后的代碼同源程序很相像,不一樣的是變量被詳細(xì)的內(nèi)存地點(diǎn)取代。當(dāng)編譯器生成機(jī)器代碼它會自動將變量名稱用該變量的廉價量取代。默認(rèn)狀況下,DS寄存器寄存段偏移(當(dāng)履行com文件的時侯,DS寄存器的值同CS寄存器(代碼段)的值相同)。內(nèi)存第一列是偏移(offset),第二列是一個十六進(jìn)制值(hexadecimalvalue),第三列是十進(jìn)制(decimalvalue),最后一列是ASCII字符。編譯器是非大小寫敏感的,所以“VAR1"同“var1"都是同一個變量。VAR1變量的偏移是0108h,物理地點(diǎn)是0b56:0108var2變量的偏移是0109h,物理地點(diǎn)是0b56:0109這個變量是字,它占用2字節(jié)。這里假定低字節(jié)寄存在低地點(diǎn),所以34h位于12h前面。你能夠看到,在RET指令后邊還有一些指令,這樣是由于反編譯工具沒法判斷數(shù)據(jù)從什么地方開始。相同,你能夠?qū)懗鲋苯邮褂肈B的程序。#MAKE_COM#ORG100hDB0A0hDB08hDB01hDB8BhDB1EhDB09hDB01hDB0C3hDB7DB34hDB12h將上邊的代碼拷貝到emu8086原代碼編寫器,按下F5鍵編譯,并在模擬器中運(yùn)轉(zhuǎn),你能夠看到相同的反匯編結(jié)果,獲取相同的功能.依據(jù)上邊,你能夠猜想,編譯器將源程序轉(zhuǎn)變?yōu)橐恍┳止?jié)的會合,這個會合被稱作機(jī)器代碼(machinecode),辦理器懂得他們,而且履行它們。ORG100是一個編譯指令(它告訴編譯器怎樣辦理源代碼)當(dāng)你使用變量的時侯,這條指令特別重要。它通知編譯器可履行程序?qū)⒈徽{(diào)入偏移量是100h(256字節(jié))的地點(diǎn),有了它,編譯器就能夠計算出所有變量的正確地點(diǎn),而后用這些地點(diǎn)(偏移量)來取代變量名稱.上邊的這些指令不會真實(shí)的編譯為任何機(jī)器代碼。為何可履行程序老是被裝入偏移量100h?操作系統(tǒng)在CS寄存器(代碼段)儲存著程序信息,比方命令行方式下的參數(shù)等等.只管上邊不過一個COM文件的例子,EXE文件調(diào)入在偏移量0000的地點(diǎn),他使用特定的段保留變量.我們在下邊會學(xué)習(xí)到對于EXE文件的知識。數(shù)組數(shù)組能夠看作是變量鏈。一個字符串是一個字節(jié)數(shù)組的例子,此中每一個字符都看作一個ASCII碼的值(0。.。。255)下邊是一些定義數(shù)組的例子aDB48h,65h,6Ch,6Ch,6Fh,00hbDB'Hello',0b是一個數(shù)組,當(dāng)編譯器發(fā)現(xiàn)引用了字符串值后,會自動將這些字符轉(zhuǎn)變?yōu)閷?yīng)的字節(jié).下面圖表表示的就是申明數(shù)組后在內(nèi)存中的散布:你能夠使用方括號做下標(biāo)直接接見到數(shù)組中的值,比如:MOVAL,a[3]相同,你還能夠使用隨意一個內(nèi)存索引寄存器BX,SI,DI,BP,比如:MOVSI,3MOVAL,a[SI]假如你想申明比較復(fù)雜的數(shù)組,你能夠使用DUP指令形式以下numberDUP(value(s))number-重復(fù)的數(shù)目(隨意常數(shù))value-將要復(fù)制的表達(dá)式比如:cDB5DUP(9)就相當(dāng)于以下定義:cDB9,9,9,9,9此外一個例子:dDB5DUP(1,2)等同于dDB1,2,1,2,1,2,1,2,1,2自然,假如需要寄存超出255或許小于-128的數(shù)值,你還能夠使用DW來取代DB??墒荄W不可以用于申明字符串。DUP命令睜開后不可以超出1020個字符(上一個例子中睜開以后是13個字符),假如需要申明請將它們分紅兩行(這樣,內(nèi)存中獲取的仍舊是一個大數(shù)組)。獲得變量地點(diǎn)LEA指令(LoadEffectiveAddress讀取有效地點(diǎn))或許OFFSET指令。OFFSET和LEA兩者都能夠獲取變量的偏移量.LEA在使用中更有效,這是由于它能返回索引變量的地點(diǎn)。獲得變量地點(diǎn)在好多狀況下是特別實(shí)用的,比如你打算向一個過程傳達(dá)參數(shù).注意:在編譯過程中使用以下申明數(shù)據(jù)種類BYTEPTR—表示字節(jié);WORDPTR-表示字(2個字節(jié))比如:BYTEPTR[BX];按字節(jié)接見;WORDPTR[BX];按字接見Emu8086允許使用以下更簡短的前綴b.-等價于上邊的BYTEPTR;w.-等價于上邊的WORDPTR有時,編譯器能夠自動計算出數(shù)據(jù)種類,可是假如一個參加運(yùn)算的數(shù)是立刻數(shù),這類方法就不行靠了。第一個例子:ORG100hMOVAL,VAR1;將變量var1的數(shù)值放入al以便檢查LEABX,VAR1;將var1的地點(diǎn)存入BX.MOVBYTEPTR[BX],44h;改正變量var1的內(nèi)容MOVAL,VAR1;將變量VAR1的數(shù)值放入AL以便檢查RETVAR1DB22hEND下邊是此外一個例子,用OFFSET指令取代LEA:ORG100hMOVAL,VAR1;將變量VAR1的值放入AL以便檢查。MOVBX,OFFSETVAR1;將變量VAR1的地點(diǎn)放入BX.MOVBYTEPTR[BX],44h;改正變量VAR1內(nèi)容MOVAL,VAR1;將變量VAR1的值放入AL以便檢查。RETVAR1DB22hEND上邊例子的功能相同。這些語句:LEABX,VAR1MOVBX,OFFSETVAR1都將生成相同的機(jī)器代碼:MOVBX,num,num是16位變量偏移請注意,只有這些寄存器能夠放入方括號中(作為內(nèi)存指針)BX,SI,DI,BP(請參照本教程前述章節(jié))常量常量同變量很相像,可是它向來存在。定義一個變量以后,它的值不會改變。使用EQU定義常量:nameequ<隨意表達(dá)式>比如:kEQU5MOVAX,k上邊的例子等同于以下代碼:MOVAX,5在程序履行過程中你能夠選擇模擬器”View”菜單下的”Variables"你能夠點(diǎn)一個變量而后設(shè)置Elements屬性為數(shù)組大小來查察數(shù)組。匯編語言對于數(shù)據(jù)種類其實(shí)不嚴(yán)格,這樣以來所有的變量都能夠被看作是數(shù)組。變量能夠顯示為以下進(jìn)制HEX-十六進(jìn)制hexadecimal(基底16)。BIN—二進(jìn)制(基底2).OCT-八進(jìn)制(基底8)。SIGNED-有符號十進(jìn)制(基底10)。UNSIGNED-無符號十進(jìn)制(基底10)。CHAR-ASCII碼(一共有256個符號,此中一些符號是不行見的).程序運(yùn)轉(zhuǎn)的時侯,你能夠經(jīng)過雙擊它來編寫變量值,或許選中以后點(diǎn)Edit按鈕。十六進(jìn)制數(shù)值以"h"結(jié)尾,二進(jìn)制以”b結(jié)”尾,八進(jìn)制以"o結(jié)”尾,十進(jìn)制沒有結(jié)尾。字符串用這樣的方式表示:’hellod'wor,0(結(jié)尾以0表示)數(shù)組依照以下輸入:1,2,3,4,5(數(shù)組能夠是一組字節(jié)或許字,這取決于你想以字節(jié)仍是字的方式編寫)表達(dá)式會自動計算,比如,輸入以下表達(dá)式5+2會自動計算為7。等等.。。。中止中止是一系列功能調(diào)用。這些功能調(diào)用使得編程更為簡單。比方,你想在打印機(jī)上輸出一個字符,你只需要簡單的調(diào)用中止,它將幫你達(dá)成所有的事情。此外還有控制磁盤和其余硬件工作的中止.我們將這些功能調(diào)用稱作軟件中止。不一樣的硬件相同能夠觸發(fā)中止,這些中止稱作硬件中止。這里,我們只介紹軟件中止(softwareinterrupts)。觸發(fā)一個軟件中止,需要使用INT指令,它的使用方式特別簡單:INTvalue上邊value的取值范圍是從0到255(或許0到0ffh),往常我們使用十六進(jìn)制。你或許猜想只有256此中止調(diào)用,可是這是不正確的。由于每一此中止都有子功能。在調(diào)用一此中止的子功能以前,需要設(shè)置AH寄存器.每一此中止最多能夠擁有256個子功能(于是,我們有256*256=65536個功能調(diào)用)。一般狀況下使用AH寄存器,可是一些狀況下可能使用此外的寄存器。往常,其余的寄存器是用來傳達(dá)數(shù)據(jù)和參數(shù)的。下邊的例子調(diào)用了INT10h中止0Eh子功能輸出字符串‘Hello'。這個!功能作用是在屏幕上顯示一個字符,而后光標(biāo)進(jìn)一,假如需要還滾屏.#MAKE_COM#;生成com文件的指令ORG100h;我們使用的這個子功能沒有返回值,;所以我們只用設(shè)置就能夠了.MOVAH,0Eh;選擇子功能int10h/0eh子功能,輸出放在;AL寄存器中的ASCII碼對應(yīng)的字符MOVAL,'H';ASCII碼:72INT10h;輸出MOVAL,'e’;ASCII碼:101INT10h;輸出MOVAL,’l’;ASCII碼:108INT10h;輸出MOVAL,’l';ASCII碼:108INT10h;輸出MOVAL,'o’;ASCII碼:111INT10h;輸出MOVAL,’!’;ASCII碼:33INT10h;輸出RET;返回操作系統(tǒng)將上述程序拷貝粘貼到Emu8086代碼編寫器,點(diǎn)擊[CompileandEmulate]按鈕,運(yùn)行!常用函數(shù)庫-emu8086.inc經(jīng)過引用一些常用函數(shù),能夠使你編程更為方便.在你的程序中使用其余文件中的函數(shù)的方法是INCLUDE后邊接上你要引用的文件名。編譯器會自動在你源程序所在的文件夾中查找你引用的文件,假如沒有找到,它將搜尋Inc文件夾。往常你沒法完整理解emu8086.inc(位于Inc文件夾)可是這沒相關(guān)系,你只用知道它能做什么就足夠了。要使用emu8086.inc中的函數(shù),你應(yīng)當(dāng)在你程序的開頭加上include'emu8086。inc'emu8086.inc定義了以下的宏:PUTCchar-將一個ascii字符輸出到光標(biāo)目前位值,只有一個參數(shù)的宏GOTOXYcol,row-設(shè)置目前光標(biāo)地點(diǎn),有兩個參數(shù)PRINTstring-輸出字符串,一個參數(shù)PRINTNstring-輸出字符串,一個參數(shù)。與print功能相同,不一樣在于輸出以后自動回車CURSOROFF-封閉文本光標(biāo)CURSORON-翻開文本光標(biāo)使用上述宏的方法是:在你需要的位值寫上宏名稱加上參數(shù)。比如:includeemu8086。incORG100hPRINT'HelloWorld!’GOTOXY10,5PUTC65;65-ASCII碼的'A’PUTC'B'RET;返回操作系統(tǒng)END;停止編譯器當(dāng)編譯器運(yùn)轉(zhuǎn)你的代碼時,它第一找到申明中的emu8086.inc文件,而后將代碼中的宏用實(shí)際的代碼代替掉。往常來說,宏都是比較小的代碼段,常常使用宏會使得你的可履行程序特別大(對于降低文件大小來說使用過程更好)emu8086.inc相同定義了以下過程:PRINT_STRING-在目前光標(biāo)地點(diǎn)輸出一個字符串字符串地點(diǎn)由DS:SI寄存器給出使用時,需要在END前面申明DEFINE_PRINT_STRING才能使用.PTHIS—在目前光標(biāo)地點(diǎn)輸出一個字符串(同PRINT_STRING)相同,不一樣之處在于它從貨倉接收字符串。字符串停止符應(yīng)在call以后定義。比如CALLPTHISdb’HelloWorld!’,0使用時,需要在END前面申明DEFINE_PTHIS。GET_STRING—從用戶輸入獲取一個字符串,輸入的字符串寫入DS:DI指出的緩沖,緩沖區(qū)的大小由DX設(shè)置?;剀囎鳛檩斎虢Y(jié)束。使用時,需要在END前面申明DEFINE_GET_STRING。CLEAR_SCREEN—清屏過程(滾過整個屏幕),而后將光標(biāo)設(shè)置在左上角.使用時,需要在END前面申明DEFINE_CLEAR_SCREEN。SCAN_NUM-獲得用戶從鍵盤輸入的多位有符號數(shù),并將輸入寄存在CX寄存器.使用時,需要在END前面申明DEFINE_SCAN_NUM。PRINT_NUM—輸出AX寄存器中的有符號數(shù)。使用時,需要在END前面申明DEFINE_PRINT_NUM以及DEFINE_PRINT_NUM_UNS.PRINT_NUM_UNS-輸出AX寄存器中的無符號數(shù)。使用時,需要在END前面申明DEFINE_PRINT_NUM_UNS。使用上述過程,一定在你源程序的底部(可是在END以前?。?!)申明這些函數(shù),使用CALL指令后邊接上過程名稱來調(diào)用.比如:include’emu8086。inc’ORG100hLEASI,msg1;要求輸入數(shù)字CALLprint_string;CALLscan_num;讀取數(shù)字放入cxMOVAX,CX;CX寄存數(shù)值拷貝到AX;輸入以下字符CALLpthisDB13,10,'Youhaveentered:',0CALLprint_num;輸出AX中的字符RET;返回操作系統(tǒng)msg1DB’Enterthenumber:'0,DEFINE_SCAN_NUMDEFINE_PRINT_STRINGDEFINE_PRINT_NUMDEFINE_PRINT_NUM_UNS;print_num函數(shù)要求的DEFINE_PTHISEND;結(jié)束第一,編譯器運(yùn)轉(zhuǎn)申明(對于宏不過睜開)。當(dāng)編譯器碰到CALL指令,它將用過程申明中的地點(diǎn)來代替過程名.程序在履行過程中碰到這個過程,便會直接跳轉(zhuǎn)到過程。這是特別有用的,比方,即便在你的代碼中履行100次一個過程,編譯后的可履行文件也不會所以而增大多少。這樣看起來很劃算,是否是?后邊你會學(xué)到更多的,此刻只需要認(rèn)識一點(diǎn)點(diǎn)基來源理。運(yùn)算與邏輯指令大多半運(yùn)算與邏輯指令影響辦理器的狀態(tài)標(biāo)記寄存器。從上圖能夠看到,這是狀態(tài)標(biāo)記寄存器是一個16位寄存器,每一位稱作一個標(biāo)記位,能夠取值1或許0。進(jìn)位標(biāo)記CarryFlag(CF)—出現(xiàn)無符號(unsignedoverflow)溢出該位設(shè)置成1。比如,計算255+1(結(jié)果高出0..。255).沒有溢出時該位為0。零標(biāo)記ZeroFlag(ZF)—當(dāng)結(jié)果為0時設(shè)置為1,結(jié)果不為0時設(shè)置為0.符號標(biāo)記SignFlag(SF)-結(jié)果為負(fù)置1,結(jié)果為正置為0。事實(shí)上該位對于結(jié)果特別重要。溢出標(biāo)記OverflowFlag(OF)—當(dāng)出現(xiàn)有符號數(shù)溢出設(shè)置為1.比如,計算100+50(結(jié)果高出-128-127的范圍)。奇偶標(biāo)記ParityFlag(PF)—當(dāng)結(jié)果操作數(shù)中1的個數(shù)為偶時置1,不然為0注意,如果結(jié)果是一個字,該標(biāo)記只指示低8位。協(xié)助進(jìn)位標(biāo)記AuxiliaryFlag(AF)-低4位向長進(jìn)位時置1,不然為0(記錄運(yùn)算時第3位(半個字節(jié))產(chǎn)生的進(jìn)位值。比如,履行加法指令時,最高有效位有進(jìn)位時置1,不然置0中止標(biāo)記InterruptenableFlag(IF)—當(dāng)cpu允許中止時為1,不然為0DirectionFlag(DF)-方向標(biāo)記,在串辦理指令中控制辦理信息的方向用。當(dāng)DF為1時,每次操作后使變址寄存器SI和DI減量,這樣就使串辦理從高地點(diǎn)向低地點(diǎn)方向辦理.當(dāng)DF為0時,則使SI和DI增量,使串辦理從低地點(diǎn)向高地點(diǎn)方向辦理。這里有3組指令。第一組:ADD,SUB,CMP,AND,TEST,OR,XOR支持以下操作數(shù):REG,memorymemory,REGREG,REGmemory,immediateREG,immediateREG(寄存器):AX,BX,CX,DX,AH,AL,BL,BH,CH,CL,DH,DL,DI,SI,BP,SP.memory(內(nèi)存):[BX],[BX+SI+7],變量,等等.。.immediate(立刻數(shù)):5,-24,3Fh,10001101b,等等。.。履行以后,結(jié)果常常寄存在第一個操作數(shù)中。CMP和TEST指令只影響標(biāo)記位,其實(shí)不返回數(shù)值(這兩條指令是用來在程序運(yùn)轉(zhuǎn)中判斷的)上述指令只影響以下標(biāo)記位:CF,ZF,SF,OF,PF,AF。ADD—將第二個操作數(shù)加至第一個操作數(shù)上SUB-從第一個操作數(shù)中減去第二個操作數(shù)CMP—從第一個操作數(shù)中減去第二個操作數(shù),但只影響標(biāo)記位。AND—兩個操作數(shù)各個位邏輯與運(yùn)算。運(yùn)算法比以下1AND1=11AND0=00AND1=00AND0=0只有當(dāng)兩個操作數(shù)都是1時,運(yùn)算結(jié)果才是1。TEST-和上邊的and操作相同,可是只影響標(biāo)記位。OR-兩個操作數(shù)各個位邏輯或運(yùn)算。運(yùn)算法比以下1OR1=11OR0=10OR1=10OR0=0假如操作數(shù)中有1那么結(jié)果必定是1。XOR-兩個操作數(shù)各個位邏輯異或運(yùn)算。運(yùn)算法比以下1XOR1=01XOR0=10XOR1=10XOR0=0當(dāng)兩個操作數(shù)不一樣時,結(jié)果為1。第二組:MUL,IMUL,DIV,IDIV支持以下操作數(shù):REGmemoryREG(寄存器):AX,BX,CX,DX,AH,AL,BL,BH,CH,CL,DH,DL,DI,SI,BP,SP.memory(內(nèi)存):[BX],[BX+SI+7],variable,etc。。.MULandIMUL指令只影響CF,OF標(biāo)記位。運(yùn)算后假如結(jié)果高出范圍,這些標(biāo)記地點(diǎn)1,假如沒有超出范圍,置0DIV和IDIV指令對于標(biāo)記位無影響MUL—無符號乘:當(dāng)操作數(shù)是字節(jié)時:AX=AL*操作數(shù).當(dāng)操作數(shù)是字時:(DXAX)=AX*操作數(shù)。IMUL—有符號乘法:當(dāng)操作數(shù)是字節(jié)時:AX=AL*操作數(shù).當(dāng)操作數(shù)是字時:(DXAX)=AX*操作數(shù).DIV-無符號除法:當(dāng)操作數(shù)是字節(jié)時:AL=AX/操作數(shù)AH=余數(shù)(取模后的余數(shù)).當(dāng)操作數(shù)是字時:AX=(DXAX)/操作數(shù)DX=余數(shù)(取模后的余數(shù))IDIV—有符號除法:當(dāng)操作數(shù)是字節(jié)時:AL=AX/操作數(shù)AH=余數(shù)(取模后的余數(shù))當(dāng)操作數(shù)是字時:AX=(DXAX)/操作數(shù)DX=余數(shù)(取模后的余數(shù)).第三組:INC,DEC,NOT,NEG支持以下操作數(shù):REGmemoryREG(寄存器):AX,BX,CX,DX,AH,AL,BL,BH,CH,CL,DH,DL,DI,SI,BP,SP.memory(內(nèi)存):[BX],[BX+SI+7],variable,etc。。.INC,DEC指令只影響以下標(biāo)記位:ZF,SF,OF,PF,AF。NOT指令不影響任何標(biāo)記位!NEGi指令只影響以下操作位:CF,ZF,SF,OF,PF,AF.NOT—對與操作數(shù)每一位取反NEG-對操作數(shù)取反實(shí)質(zhì)上它對每一位取反而后在最后一位加1.比如5會變?yōu)椋?,-2會變?yōu)?。(這里所說運(yùn)算應(yīng)當(dāng)是計算機(jī)內(nèi)部的補(bǔ)碼運(yùn)算)程序控制轉(zhuǎn)移對于編程來說控制程序走向是特別重要的事情,它是你的程序依據(jù)條件作出判斷,跳轉(zhuǎn)到相應(yīng)的位值.無條件跳轉(zhuǎn)控制程序轉(zhuǎn)向的最基本的指令是JMP.使用形式以下:JMPlabel在程序中申明/label/的方法很簡單,只需在它名字后邊加上“:",label能夠由任何字符混淆而成可是不可以由數(shù)字開頭,比如,下邊是3個合法的labellabel1:label2:a:label能夠在一條指令的前面申明,比如:x1:MOVAX,1x2:MOVAX,2下邊是一個JMP指令的例子:ORG100hMOVAX,5;將AX設(shè)置為5.MOVBX,2;將BX設(shè)置為2。JMPcalc;跳轉(zhuǎn)到'calc'.back:JMPstop;跳轉(zhuǎn)到'stop’。calc:ADDAX,BX;將BX加到AX.JMPback;返回'back’。stop:RET;返回操作系統(tǒng)END自然有更簡單的計算這兩個數(shù)字之和的方法,可是上邊是一個JMP指令的很好的例子.從例子中能夠看出,JMP能夠控制向前和向后。它能夠轉(zhuǎn)移到目前代碼段的隨意地點(diǎn)(65535字節(jié))。短條件轉(zhuǎn)移與JMP這一無條件轉(zhuǎn)移指令不一樣,還有一些有條件跳轉(zhuǎn)指令(只有在條件建立的時侯才跳轉(zhuǎn))。這些指令分為三組,第一組是只檢測獨(dú)自標(biāo)記位,第二組比較有符號數(shù),第三組比較無符號數(shù)。檢測獨(dú)自標(biāo)記位的轉(zhuǎn)移指令指令說明條件相反指令JZ,JE假如為0(相等),轉(zhuǎn)移。ZF=1JNZ,JNEJC
,
JB,
CF
=
JNC
,
JNB,假如進(jìn)位
(小于,
不大于等于),轉(zhuǎn)移JNAE
1
JAEJS假如是負(fù)數(shù),轉(zhuǎn)移SF=1JNSOF=JO假如溢出,轉(zhuǎn)移JNO1JPE,JP假如是偶數(shù),轉(zhuǎn)移PF=1JPOJNZ,JNE假如不為0(不相等),轉(zhuǎn)移ZF=0JZ,JEJNC
,
JNB,
假如沒有進(jìn)位(大于,
大于等于)
,
CF
=JC,
JB,JNAEJAE
轉(zhuǎn)移
0JNS假如不是負(fù)數(shù),轉(zhuǎn)移SF=0JSOF=JNO假如沒有溢出,轉(zhuǎn)移JO0JPO,JNP假如不是偶數(shù),轉(zhuǎn)移PF=0JPE,JP能夠看到一些指令功能相同,對,他們編譯以后生成相同機(jī)器碼所以很簡單理解為何你編譯JE指令而反編譯獲取的倒是JZ.使用不一樣的名稱是為了使程序更簡單理解。比較有符號數(shù)的轉(zhuǎn)移指令指令說明條件相反指令JNE,JE,JZ假如等于(=),假如為0,跳轉(zhuǎn)ZF=1JNZJNE,假如不等于(<>),假如不等于0,跳轉(zhuǎn)ZF=0JE,JZJNZZF=0假如大于
(>)假如不小于等于
(not
JNG
,JG,JNLE
和<=),
跳轉(zhuǎn)
JLESF=OFJL
,假如小與
JumpifLess
(〈)
假如不大
JNL
,SF
〈>OFJNGE
于等于
(not
〉=),跳轉(zhuǎn)
JGE假如大于等于
(〉=),假如不小于
(not
JNGE
,JGE,JNL
SF=OF<),跳轉(zhuǎn)
JLJLE
,假如小于等于
(〈=)
,假如不大于
ZF=1
或許
SFJNLE,JGJNG
(not>
),跳轉(zhuǎn)
〈>OF〉—符號表示不等于.比較無符號數(shù)轉(zhuǎn)移指令指令說明條件相反指令JE,JZ假如等于(=).,假如為0,跳轉(zhuǎn)ZF=1JNE,JNZJNE,JNZ假如不等于(<>),假如不為0,跳轉(zhuǎn)ZF=0JE,JZ假如大于(>),假如不小于等于(not<=),CF=0JA,JNBEJNA,JBE跳轉(zhuǎn)andZF=0JB,JNAE,假如小于(〈),假如不大于等于(not〉JNB,JAE,CF=1JC=),假如進(jìn)位,跳轉(zhuǎn)JNCJAE,JNB,假如大于等于(〉=),假如不小于(not〈),CF=0JNAE,JBJNC假如沒有進(jìn)位,跳轉(zhuǎn)CF=假如小于或許等于(<=),假如不大于JBE,JNA1orJNBE,JA(not〉),跳轉(zhuǎn)ZF=1一般來說,需要使用CMP指令來比較數(shù)值(該指令與SUB(減法)指令鄰近,只可是不保留結(jié)果,而只改正標(biāo)值位)上邊說法的意思是,比如:需要比較5和2,5-2=3結(jié)果不是0(0標(biāo)值位設(shè)置為0)另一個例子比較7和77-7=0結(jié)果為0!(0標(biāo)值位設(shè)置為1。JZ或許JE會轉(zhuǎn)移).下邊是一個CMP指令和條件轉(zhuǎn)移指令的例子:includeemu8086.incincludeemu8086。incORG100hMOVAL,25;設(shè)置AL為25.MOVBL,10;設(shè)置BL為10。CMPAL,BL;比較AL-BL.JEequal;假如AL=BL(ZF=1)跳轉(zhuǎn)PUTC’N';假如到這里,說明AL<>BL,JMPstop;打印’N’跳,轉(zhuǎn)到結(jié)束equal:;假如到這里PUTC’Y’;則AL=BL,打印'Y'。stop:RETEND請用用不一樣的數(shù)字試驗(yàn)取代上述AL和BL,點(diǎn)擊[FLAGS]鍵翻開標(biāo)記,使用[SingleStep]察看發(fā)生了什么,不要忘掉每一次改正以后從頭編譯運(yùn)轉(zhuǎn)(快捷鍵F5)。所有的條件轉(zhuǎn)移指令都有一個很大的限制,就是與JMP指令不一樣,他們只好向前跳轉(zhuǎn)127字節(jié)或許向后跳轉(zhuǎn)128字節(jié)(注意大多半指令編譯以后是3個或許更多字節(jié))我們能夠用如下小技巧解決這一問題:從上述表中找到一條相反條件的轉(zhuǎn)移指令,令其跳轉(zhuǎn)到label_x.用JMP指令跳轉(zhuǎn)到你想要的地方在JMP指令后邊定義label_x:label_x:—能夠是隨意合法標(biāo)號.下邊是一個例子:includeemu8086.incORG100hMOVAL,25;設(shè)置AL為25。MOVBL,10;設(shè)置BL為10.CMPAL,BL;比較AL—BL.JNEnot_equal;假如AL〈〉BL(ZF=0),轉(zhuǎn)移JMPequalnot_equal:;假定這里還有編譯以后超出127字節(jié)的程序PUTC'N';假如履行到這里,說明AL〈〉BL,JMPstop;打印’N’,轉(zhuǎn)移到程序結(jié)束。equal:;假如履行到這里,PUTC’Y’;說明AL=BL,打印'Y’。stop:RET;上述都要履行這一條END此外,能夠使用立刻數(shù)來取代標(biāo)號。立刻數(shù)前使用“$"編譯器將直接獲取偏移。比如:ORG100h無條件向前轉(zhuǎn)移;跳事后邊2字節(jié)JMP$2aDB3;1bytebDB4;1byte.
。JCC跳過7字節(jié):(JMP自己占用2字節(jié))MOVBL,9DECBL;2bytes。CMPBL,0;3bytes.JNE$—7RETEND貨倉貨倉是內(nèi)存頂用于保留暫時數(shù)據(jù)的一片地區(qū)。當(dāng)使用CALL指令時,貨倉用于保留過程的返回地點(diǎn),RET指令能夠從貨倉中獲得該地點(diǎn)并使程序返回到那邊.當(dāng)使用INT指令,發(fā)生的也與此近似。貨倉保留標(biāo)記寄存器,代碼段和偏移量。IRET指令用來從中止返回。我們相同能夠使用堆棧保留任何數(shù)據(jù).對于貨倉的操作只有兩條:PUSH—將16位數(shù)值壓入貨倉.POP-將16位數(shù)值從貨倉中彈出PUSH指令的使用方法:PUSHREGPUSHSREGPUSHmemoryPUSHimmediateREG(寄存器):AX,BX,CX,DX,DI,SI,BP,SP。SREG(段寄存器
):
DS,ES,SS,
CS.memory
(內(nèi)存):
[BX],
[BX+SI+7],16
位變量,
等等.。.immediate(立刻數(shù)):5,—24,3Fh,10001101b,等等。。.POP指令的使用方法:POPREGPOPSREGPOPmemoryREG(寄存器):AX,BX,CX,DX,DI,SI,BP,SP.SREG(段寄存器):DS,ES,SS,(除了CS).memory(內(nèi)存):[BX],[BX+SI+7],16位變量,等等。..注意:PUSHandPOP
都只操作
16位數(shù)據(jù)
!注意:在
8018
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版城市更新改造項(xiàng)目委托投標(biāo)協(xié)議范本3篇
- 2025年度車庫門節(jié)能改造與智能化升級合同4篇
- 2025版智慧社區(qū)門衛(wèi)智能化服務(wù)承包協(xié)議4篇
- 2025年度城市道路打蠟與防滑處理合同4篇
- 二零二五版墓園墓位租賃與續(xù)約合同3篇
- 2025年度木門定制加工及物流配送合同3篇
- 二零二五年度市政道路路面混凝土鋪設(shè)勞務(wù)合同范本4篇
- 2025年度食品代理銷售委托授權(quán)合同4篇
- 二零二四年度養(yǎng)老機(jī)構(gòu)委托委托高品質(zhì)物業(yè)管理服務(wù)合同3篇
- 2025年離婚房產(chǎn)分割與贍養(yǎng)費(fèi)支付合同3篇
- 2025年度版權(quán)授權(quán)協(xié)議:游戲角色形象設(shè)計與授權(quán)使用3篇
- 心肺復(fù)蘇課件2024
- 《城鎮(zhèn)燃?xì)忸I(lǐng)域重大隱患判定指導(dǎo)手冊》專題培訓(xùn)
- 湖南財政經(jīng)濟(jì)學(xué)院專升本管理學(xué)真題
- 全國身份證前六位、區(qū)號、郵編-編碼大全
- 2024-2025學(xué)年福建省廈門市第一中學(xué)高一(上)適應(yīng)性訓(xùn)練物理試卷(10月)(含答案)
- 《零售學(xué)第二版教學(xué)》課件
- 廣東省珠海市香洲區(qū)2023-2024學(xué)年四年級下學(xué)期期末數(shù)學(xué)試卷
- 房地產(chǎn)行業(yè)職業(yè)生涯規(guī)劃
- 江蘇省建筑與裝飾工程計價定額(2014)電子表格版
- MOOC 數(shù)字電路與系統(tǒng)-大連理工大學(xué) 中國大學(xué)慕課答案
評論
0/150
提交評論