第四章-Pentium指令系統_第1頁
第四章-Pentium指令系統_第2頁
第四章-Pentium指令系統_第3頁
第四章-Pentium指令系統_第4頁
第四章-Pentium指令系統_第5頁
已閱讀5頁,還剩145頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第四章Pentium指令系統

與匯編語言編程第四章Pentium指令系統與匯編語言編程4.1概述4.2通用整數指令及應用4.3匯編語言程序概述

4.4常用偽指令語句

4.5匯編語言編程入門

4-24.1概述

Pentium的指令系統是在80X86系列指令系統的基礎上逐步發展而形成的,在代碼級具有向上兼容性。它增加了指令的種類,增強了一些指令的功能,提供了32位尋址方式和32位操作方式,并且包含全部浮點運算指令。Pentium指令的操作數可以是0~3個,根據尋址方式不同,可直接包含在指令中,也可存于寄存器或存儲器中。每條指令的長度因指令而異,平均指令長度為3.2字節。指令的操作數寬度可以是8位、16位、32位,尋址寬度可以是16位或32位。Pentium指令系統的突出特點是:功能強、靈活性高,給編譯程序和匯編語言程序的設計人提供了很寬的選擇余地。4-3Pentium指令格式字段1字段2字段3modr/m字段4s-i-b字段5displ字段6data1字節1字節寄存器/存儲器尋址方式說明符字段

主尋址字節,規定操作數的尋址方式,包括操作數的存放位置和存儲器中操作數EA的計算方法等比例-變址-基址字節,為第二尋址字節位移量字段,屬存儲器地址的一部分。位移量足夠小時,通常采用帶符號的8位整數,CPU自動將它擴展到16位或32位立即數字段8位立即數與16/32位操作數一起使用時,CPU自動將其擴展至符號相同的16/32位數。同理也可將16位立即數擴展至32位1~4字節1~2字節前綴Prefix操作碼OPcode0,1,2,4字節0,1,2,4字節規定指令的操作性質,包括操作數類型、操作數傳送方向、寄存器編碼或符號擴展等用于修改指令操作的某些屬性,有5類前綴:●段超越前綴●操作數寬度前綴●地址寬度前綴●重復前綴●總線鎖定前綴4.1概述4-4本節重點介紹最基本的整數指令。

Pentium指令分類整數指令--最常用部分浮點數指令操作系統型指令Pentium指令系統分為:4.1概述4-5Pentium的整數指令按功能分為:4.串操作類指令5.控制轉移類指令9.高級語言指令1.數據傳送類指令2.算術運算類指令3.邏輯運算與移位指令6.處理器控制類指令7.標志操作指令8.按條件設置字節指令4.2通用整數指令及應用4-64.2通用整數指令及應用4-71.數據傳送類指令數據傳送是計算機中最基本、最常用、最重要的一類操作。如:●各種初始化操作●取操作數●保存結果在實際程序中,它的使用頻率最高。這類指令尋址方式最豐富,除POPF外,均不影響標志寄存器的標志位。數據傳送指令主要包括:

通用數據傳送指令。如數值傳送指令(MOV)、裝入有效地址指令(LEA)、段裝入指令、交換類指令(XCHG和BSWAP)、查表轉換指令(XLAT)等。

堆棧指令。如PUSH類/POP類指令等。

數據類型變換指令。如數據寬度變換指令,帶符號數符號位擴展/無符號數位擴展指令等。

I/O指令。如IN類/OUT類指令等。

標志寄存器傳送指令4.2通用整數指令及應用4-8指令操作:(源操作數)→目的操作數

⑴傳送指令指令格式:MOV目的操作數,源操作數

尋址規定: REG/MEM/SREG,REGREG/MEM,SREG REG/SREG,MEMREG/MEM,IMMIMM8/16/32位立即數REG8/16/32位通用寄存器MEM8/16/32位存儲器SREG段寄存器4.2通用整數指令及應用4-9立即數通用寄存器(EAX、EBX、ECX、EDX、EBP、ESP、ESI、EDI)CS存儲器段寄存器(SS、DS、ES、FS、GS)MOV指令允許的傳送關系4.2通用整數指令及應用4-104.2通用整數指令及應用4-11使用說明:源操作數和目的操作數的類型必須一致。目的操作數不能為立即數。CS和(E)IP均不能用作指令的目的寄存器。段寄存器間不能直接傳送,也不能直接將立即數送給段寄存器。源操作數為立即數,而目的操作數類型不確定時,要給目的操作數加類型說明。源操作數和目的操作數不能同為存儲器操作數。4-12⑴MOVDX,BL⑵MOVDS,0100H錯。源、目的操作數不能同為存儲器尋址。⑶MOV[1200H],[SI]錯。源和目的操作數類型不一致。錯。立即數不能直接賦給段寄存器⑷MOVAX,[BX][BP]在16位基址加變址的尋址方式中,用作基址和變址的寄存器不能同為基址或變址寄存器

例4.1識別下列指令的正確性,對錯誤的指令,說明錯誤的原因。MOVAX,[SI]MOV[1200H],AX4.2通用整數指令及應用4-13

例4.1識別下列指令的正確性,對錯誤的指令,說明錯誤的原因。4.2通用整數指令及應用⑸MOV1020H,DS錯。目的操作數不能為立即數。⑹MOVCS,AX錯。目的操作數類型不確定錯。不能用傳送指令改變代碼段寄存器。(7)MOV[BX][DI],34HMOVWORDPTR

[BX][DI],34H4-14⑵交換指令操作:(目的操作數)(源操作數)格式:XCHG目的操作數,源操作數

REG/MEM, REG REG,MEM說明:

⑴基本用法同MOV指令;⑵當源或目的操作數為MEM操作數時,會自動激活LOCK信號,該特性常用于多機、多任務或多用戶系統中的臨界段(共享資源)訪問。4.2通用整數指令及應用4-15(3)擴展傳送指令操作:MOVSX是將源操作數中的8位或16位操作數帶符號等值擴展為16位或32位操作數,存于目的操作數中。格式:

MOVSX/MOVZX

目的操作數,源操作數

4.2通用整數指令及應用4-16說明:

XLAT是一條隱含尋址的指令。隱

含兩個操作數:DS:(E)BX存放表基址,AL

存放查表參數。使用前要給隱含操作數賦

初值。⑷查表指令

格式:

XLAT

操作:

((EBX)+(AL))→AL((BX)+(AL))→AL4.2通用整數指令及應用4-17

例4.2內存中自TABLE開始的16個單元連續存放著自然數0到15的平方值(構成一個平方表),任給一整數M在XX單元中(該數為0≤M≤15),查表求M的平方值,并將結果存入YY單元中。解: LEABX,TABLE MOVAL,XX

XLAT

MOVYY,ALTABLE0+11+24+39+15225XX54.2通用整數指令及應用4-18⑸壓棧/彈棧指令格式:PUSH 源操作數

REG16/MEM16/IMM16 REG32/MEM32/IMM32操作:((E)SP)-2/4→(E)SP (源操作數)→(SS:(E)SP)●壓棧指令4.2通用整數指令及應用4-19格式:POP目的操作數

MEM16/MEM32/REG16/REG32操作:([SS:(E)SP])→目的操作數 ((E)SP)+2/4→(E)SP●彈棧指令4.2通用整數指令及應用4-20堆棧指令的操作數只能為字或雙字。PUSH和POP要成對出現,以保持堆棧平衡堆棧指令也隱含了一個目的/源操作數—堆棧。壓棧順序是先壓高字節后壓低字節,彈棧則是先彈低字節后彈高字節。●使用說明:4.2通用整數指令及應用

例4.3用堆棧指令實現將EAX的高16位送BX,低16位送CX。PUSHEAX;將EAX壓棧,先壓高16位,后壓低16位POPCX;彈出EAX的低16位送CXPOPBX;彈出EAX的高16位送BX解:4.2通用整數指令及應用4-214-22設(EAX)=12345678H,(SP)=0100H,執行上列指令時,堆棧變化下圖所示。…sp(0100H)(a)執行之前78H56H34H12H…0100Hsp(00FCH)(b)執行PUSHEAX4.2通用整數指令及應用4-2334H12H…0100Hsp(00FEH)(c)執行POPCX(CX)=5678H…sp(0100H)(d)執行POPBX(BX)=1234H

4.2通用整數指令及應用設(EAX)=12345678H,(SP)=0100H,執行上列指令時,堆棧變化下圖所示。4-24⑸地址傳送指令格式:

LEA目的操作數,源操作數功能:將源操作數的有效地址送指定的寄存器。說明:LEA指令的目的操作數只能是16位或32位通用寄存器,而源操作數只能是存儲器操作數 ●裝入有效地址指令LEA4.2通用整數指令及應用4-25例4.4在數據段中,有一如圖所示存儲形式的字數據區,若將BUF為偏移地址的存儲區的內容分別送到AX、BX和CX,則下程序段執行后各寄存器的內容是多少?LEASI,BUFMOVAX,BUFMOVBX,[SI]MOVCX,[SI+4]LEADI,[SI+6]M120010H780011H990012H610013H880014H190015H290016H390017H690018HBUF…4.2通用整數指令及應用4-26程序段執行后各寄存器的內容是:(SI)=0011H(AX)=9978H(BX)=9978H(CX)=2919H(DI)=0017H注意:通過上面的例子體會LEA指令和MOV指令功能的區別LEASI,BUF;

將存儲單元BUF的0011H有效地址送SI

MOVAX,BUF;取存儲單元BUF的內容送AX4.2通用整數指令及應用4-27格式:LDSLESLFS目的操作數,源操作數LGSLSS功能:將源操作數的有效地址送指定的寄存器。說明:LEA指令的目的操作數只能是16位或32位通用寄存器,而源操作數只能是存儲器操作數

裝入全地址指針指令4.2通用整數指令及應用

例4.580486工作在實地址方式時,(DS)=091DH,(BX)=0024H,有關存儲器的內容如圖所示。求指令LESDI,32H[BX]執行后的結果。DIES00F6H1E40H09226H段基址…操作碼操作碼32H00H存儲器…指令代碼段偏移量數據段位移量F6H00H40H1EH…0032HBX0024H+DS*16091D0H09226HLESDI,32H[BX]4.2通用整數指令及應用4-28?說明:I/O端口有兩種尋址方式

直接尋址,尋址范圍為0~255;

間接尋址,尋址范圍為0~216-1。●輸入指令?格式:IN累加器,端口AL/AX/EAX,IMM8AL/AX/EAX,DX?操作:AL/AX/EAX←(I/O端口)直接尋址:指令給出的立即數是I/O端口地址間接尋址:DX寄存器給出的是I/O端口地址4.2通用整數指令及應用4-29⑹輸入/輸出指令4-30●輸出指令格式:OUT端口, 累加器

IMM8,AL/AX/EAXDX,AL/AX/EAX操作:(AL/AX/EAX)→I/O端口4.2通用整數指令及應用4-31例4.6INAL,20H;從20H號端口輸入8位字節數據送到AL中INEAX,DX;從DX所指16位端口輸入32位雙字數據送到EAX中OUT80H,AL;把AL中的8位字節數據發送到80H號端口OUT0FFH,EAX;把EAX中的32位雙字數據發送到0FFH號端口OUTDX,AX;把AX中的16位字數據發送到DX所指端口4.2通用整數指令及應用

這類指令支持加、減、乘、除四種基本算術運算,其操作對象可以是字節、字、雙字的無符號和有符號的二進制整數;也可以是無符號的壓縮/非壓縮BCD碼數;還支持符號擴展指令和十進制調整指令。

它的操作結果一般會影響標志寄存器中的狀態標志位,如ZF、CF、SF、OF、AF、PF等。2.算術運算類指令

數據傳送類

算術運算類邏輯運算與移位類串操作類控制轉移類處理器控制4.2通用整數指令及應用4-32算術運算指令有:雙操作數指令,如加、減、比較等。單操作數指令,如增/減、整數變反、乘除法指令等。無操作數指令,如十進制運算調整和符號位擴展等。三操作數指令,如有符號整數乘法指令IMUL等。4.2通用整數指令及應用4-334-34(1)加法/減法類指令

操作:

ADD:(目的)+(源)→目的

SUB:(目的)-(源)→目的

ADC:(目的)+(源)+CF→目的

SBB:(目的)-(源)-CF→目的目的操作數,源操作數REG,REG/MEM/IMMMEM,REG/IMM

格式:

ADDSUB

ADCSBB加/減法指令4.2通用整數指令及應用4-35使用說明:源操作數和目的操作數可以是字節、字和雙字數據,但兩者的類型必須一致。源操作數可以為通用寄存器、存儲器或立即數,目的操作數可以為通用寄存器和存儲器。但兩者不能同為存儲器操作數。溢出標志OF是針對有符號數運算設置的,若是無符號數運算,結果是否“溢出”,則要看運算是否產生進位/借位來判斷,有進位/借位產生,則結果溢出。。4.2通用整數指令及應用4-36

加1/減1指令(INC/DEC)格式:INC/DEC目的操作數

REG/MEM操作:(目的操作數)+/-1→目的操作數應用:

CPU根據操作結果設置狀態標志OF、SF、ZF、AF和PF,但不影響進位/借位標志CF。4.2通用整數指令及應用4-37使用說明:操作數可以是8位、16位或32位的通用寄存器和存儲器。INC/DEC指令常用于調整地址指針和用作加法/減法計數器。INC/DEC指令與“ADD/SUB目的操作數,1”的功能基本相同,兩者區別在于ADD/SUB指令根據結果改變進位/借位標志CF,但INC/DEC指令不影響進位/借位標志CF。4.2通用整數指令及應用4-38例4.7求AX中存放的有符號數的絕對值。

4.2通用整數指令及應用程序如下: TESTAX,8000H;測試符號位 JZNEXT;SF=0,轉NEXT,正數不求補NEGAX;求補,AX值為原值的絕對值NEXT:HLT4-39整數變反指令(求補)格式:NEG目的操作數

REG/MEM操作:0-(目的操作數)→目的操作數應用:

常用于求負數的絕對值。

例4.8

兩個32位雙字數據X、Y定義如下,DW是匯編語言偽指令,為每個數據項分配兩個字節存儲單元(稱為字),請編寫計算X=X-Y的程序段(低位在前)。4.2通用整數指令及應用XDW9999H,9678H;X=96789999HYDW1111H,1F11H;Y=1F111111H4-40比較指令格式:CMP目的操作數,源操作數

REG,REG/MEM/IMM MEM,REG/IMMCMP與SUB指令都執行減法操作,但前者不因操作結果改變目標操作數值,而后者改變。操作:(目的操作數)-(源操作數),根據操作結果修改狀態標志,但不改變目標操作數值。4.2通用整數指令及應用乘法指令分為有符號數和無符號數乘法指令(IMUL/MUL)。

無符號數乘法指令只有單操作數格式一種;

有符號數乘法指令則有單操作數、雙操作數和三操作數三種格式。4-41(2)乘法指令4.2通用整數指令及應用4-42◆單操作數乘法指令格式:MUL/IMUL源操作數

REG/MEM操作:MUL和IMUL分別為有符號數和無符號數乘法指令,兩種指令除操作數類型不同外,操作完全相同:字:(AX)×(源操作數)→DX:AX雙字:(EAX)×(源操作數)→EDX:EAX字節:(AL)×(源操作數)→AX源操作數4.2通用整數指令及應用4-43單操作數乘法指令的被乘數是隱含的(在AL/AX/EAX中),而結果長度一定是被乘數/乘數的二倍(在AX/DX:AX/EDX:EAX中)。源操作數不能為立即數。源操作數為存儲器操作數,且類型不能確定時,要顯式說明操作數類型。乘法指令使用說明:4.2通用整數指令及應用4-44要根據是有符號數還是無符號數,分別選用IMUL或MUL指令指令執行影響CF和OF標志,若指令執行后,結果的高一半是有效數值位,則CF=OF=1,否則CF=OF=0。乘法指令使用說明:4.2通用整數指令及應用4-45(3)除法指令格式:DIV∕IDIV源操作數 REG/MEM操作:按源操作數類型:字節:(AX)/(源),商存于AL中,余數存于AH字:(DX:AX)/(源),商存于AX中,余數存于DX雙字: (EDX:EAX)/(源),商在EAX中,余數在EDX4.2通用整數指令及應用例4.9編程實現無符號字節數NUMX除以無符號字節數NUMY,要求商存入REZULT,將余數存入地址ADDI。程序如下:MOVAL,NUMX;將地址NUMX內的字節數據,取出傳送給;AL寄存器MOVAH,0;擴展無符號的被除數為字數據DIVNUMY;用寄存器AX中的數據除以NUMYMOVREZULT,AL;將商存入REZULTMOVADDI,AH;將余數存入ADDI4.2通用整數指令及應用4-464-47說明:除法指令的被除數是隱含的,且長度一定是除數的二倍(在AX/DX:AX/EDX:EAX中)。所以,使用除法指令常要擴展被除數長度。擴展時無符號數一般用:MOVZXAX,ALMOVDX,0MOVEDX,0有符號數一般用:CBW/CWD/CDQ4.2通用整數指令及應用(3)數據寬度變換指令格式:CBW/CWD/CWDE/CDQ功能:用于將源操作數的寬度加倍,又稱為符號位擴展指令CBW;AL帶符號擴展→AXCWD;AX帶符號擴展→DX:AXCWDE;AX帶符號擴展→EAXCDQ;EAX帶符號擴展→EDX:EAX4.2通用整數指令及應用4-49使用說明:CBW指令將AL中的8位有符號數帶符號擴展為16位放入AX中。AH中各位取與AL中數的符號位相同的值,即對負數進行1擴展,正數進行0擴展。CWD指令將AX中的16位有符號數帶符號擴展為32位,擴展后的高16位存放在DX中,各位值與AX中符號位相同,AX值不變。CWDE指令將AX中的16位有符號數帶符號擴展為32位存放在EAX中,高16位與原符號位值相同。4.2通用整數指令及應用4-50使用說明:CDQ指令將EAX中的32位有符號數帶符號擴展為64位數,擴展后的高32位存放在EDX中,且都與原符號位值相同。數據寬度變換指令對標志位無影響。該類指令常在有符號數除法運算中,用于擴展被除數的位數。4.2通用整數指令及應用4-51例4.10將例4.9中的被除數和除數都看作是有符號字節數,則要完成相同的功能,該如何修改程序。4.2通用整數指令及應用改動有兩點,一個是使用有符號數的除法指令,另一個是被除數長度擴展應用CBW。程序如下:MOVAL,NUMX;將地址NUMX內的字節數據,取出傳;送給AL寄存器CBW;擴展有符號的被除數為字數據IDIVNUMY;用寄存器AX中的數據除以NUMYMOVREZULT,AL;將商存入REZULTMOVADDI,AH;將余數存入ADDI4-52

MOVAX,a①;a×b在CX:BX中②③MOVAX,c④;c在DX:AX中⑤;a×b+c在DX:AX中⑥⑦;(a×b+c)/a,商存入S⑧IMULbMOVCX,DXMOVBX,AXCWDADDAX,BXADCDX,CXIDIVaMOVS,AX

例4.11

下列程序段完成S=(a×b+c)/a的運算,其中變量a、b、c和S均為帶符號的字數據,結果的商存入S,余數則不計,填空完成下列程序。4.2通用整數指令及應用4-53(4)BCD調整指令

格式:AAA∕AAS∕AAM∕AAD∕DAA∕DAS功能:AAA/AAS:

未組合BCD加法/減法調整指令,隱含操作數為AL。AAM:

未組合BCD乘法調整指令,隱含操作數AX、AH、AL。將AX中乘積調整為兩個未組合BCD數存于AH和AL。DAA/DAS:

組合BCD加法/減法調整指令,隱含操作數為AL。AAD:調整除法運算前AX中的被除數內容。操作:(AH)×10+(AL)→AX4.2通用整數指令及應用◆BCD調整指令說明:DAA/DAS、AAA/AAS隱含的操作寄存器是AL,所以BCD碼加法/減法只能用累加器AL為目的操作數的加法/減法指令,且加法/減法指令后要跟調整指令。多字節、字和雙字BCD加法/減法只能用帶進位/借位的字節加法/減法指令實現。ASCII碼數的運算與非壓縮BCD碼數的運算基本相同,但要保持結果仍為ASCII碼,則需轉換。4.2通用整數指令及應用4-54◆BCD調整指令說明:AAM隱含的操作寄存器是AX,要跟在MUL指令之后AAD指令的功能不是將除法后的結果調整為BCD碼,而是在除法前將AX保存的兩位非壓縮BCD數調整為二進制數。該指令要放在DIV指令之前。4.2通用整數指令及應用4-554-56例4.12解:MOVAL,BYTEPTRXADDAL,BYTEPTRY;低位相加

DAA;BCD碼調整MOVBYTEPTRX,AL;保存低位結果MOVAL,BYTEPTRX[1];取字變量的高字節ADCAL,BYTEPTRY[1];高位相加

DAAMOVBYTEPTRX[1],AL兩個4位壓縮BCD碼定義如下:

XDW9F11H

YDW19F9H

請編寫計算X+Y的程序段。4.2通用整數指令及應用功能:分別按位進行邏輯“與”、“或”、“異或”、“測試”和“非”。◆格式:AND

OR

XOR

TEST 目標操作數,源操作數

REG,REG/MEM/IMMMEM,REG/IMM

NOT目標操作數

REG/MEM4-573.邏輯運算與移位指令⑴邏輯運算指令4.2通用整數指令及應用4-58使用說明:②編程時要根據操作合理選用指令,一般:

●對某些二進制位‘清零’用邏輯‘與’指令AND;●對某些二進制位‘置位’用邏輯‘或’指令OR;●對某些二進制位‘求反’用邏輯‘異或’指令

XOR,全部位‘求反’用邏輯‘非’指令NOT。①邏輯運算指令除NOT指令外,都影響標志寄存器的狀態標志位,且邏輯運算后進位標志CF一定為0,所以邏輯運算指令常用于清0和清進位。4.2通用整數指令及應用③AND指令與TEST指令的相同之處是都執行按位“與”操作,兩者執行后對標志寄存器中狀態標志位的影響相同,不同之處是前者改變目標操作數的值,而后者并不改變目標操作數的值。所以TEST指令與CMP指令的用法類似,用于產生按位測試的條件碼。4-594.2通用整數指令及應用使用說明:4-60例4.13IBMPC打印機狀態口為210H,D7位為打印機“忙”狀態標志,D0=0表示打印機忙,CPU要等待,否則允許打印輸出。編寫判斷打印機狀態的程序段程序段如下:MOVDX,210H;取打印機狀態口BUSY:INAL,DX;讀打印機狀態TESTAL,01H;測試忙狀態D0,產生狀態標志JZBUSY;D0=0,表示打印機忙,等待;打印4.2通用整數指令及應用4-61⑵移位指令

移位指令包括:算術移位指令(SAL/SAR)邏輯移位指令(SHL/SHR)循環移位指令(ROR/ROL/RCR/RCL)雙精度移位指令(SHLD/SHRD)4.2通用整數指令及應用4-62使用說明:移位指令的源操作數采用立即數尋址時,8086指令只能為1,80486則為8位,實際使用低5位。移位指令常用于二進制數的倍乘和倍除,即算術/邏輯移n位,相當于把二進制數乘以或除以2n。4.2通用整數指令及應用4-63要注意算術右移(SAR)與邏輯右移(SHR)的區別:

前者在符號位和數值位依次右移的同時,用符號

位充填符號位,而后者用0充填符號位。所以,有符號和無符號數倍乘用SHL/SAL均可,但倍除時,有符號數用SAR和無符號數用SHR。移位指令也常用于循環控制,如邏輯尺控制循環。4.2通用整數指令及應用使用說明:

例4.14試編寫用移位和加法指令完成如下計算的程序段:(EAX)×9/4解:

(EAX)×9/4=[(EAX)×8+(EAX)]/4MOVEBX,EAX;保存EAXSAL/SHLEAX,3;(EAX)×8→EAXADD EAX,EBX;(EAX)×8+(EAX)→EAXSAR/SHR

EAX,2;(EAX)×9/4→EAX4.2通用整數指令及應用4-644.串操作指令串傳送指令MOVSB/MOVSW/MOVSD串裝入指令LODSB/LODSW/LODSD串存儲指令STOSB/STOSW/STOSD串比較指令CMPSB/CMPSW/CMPSD串掃描指令SCASB/SCASW/SCASD串輸入指令INSB/INSW/INSD串輸出指令OUTSB/OUTSW/OUTSD串操作指令是指用于對存儲器中字節串、字串和雙字串進行操作的指令,包括:

數據傳送類算術運算類邏輯運算與移位類串操作類控制轉移類處理器控制4.2通用整數指令及應用4-654-66串操作約定:●用DS:(E)SI尋址源串,允許段超越;●用ES:(E)DI尋址目的串,但ES段不能超越;●由DF標志位決定(E)SI,(E)DI指針增減:

DF=0,遞增;DF=1,遞減;●由串長度決定指針增/減量大小;●帶重復前綴時,用(E)CX作重復計數器。4.2通用整數指令及應用⑴串傳送指令

格式:

MOVSB/MOVSW/MOVSDMOVS 目的串,源串

MEM,MEM操作:將DS:[(E)SI]所指的源串中的一個字節、字或雙字傳送到ES:[(E)DI]指的目的串中,然后,按DF指示和操作數長度修改(E)SI,(E)DI指針,即:[ES:(E)DI]←([DS:(E)SI])(E)SI←((E)SI)±1/2/4;修改源指針(E)DI←((E)DI)±1/2/4;修改目的指針4.2通用整數指令及應用4-67說明:應用:用于數據塊傳送該指令允許加重復前綴REP。即:

REPMOVSB/MOVSW/MOVSD此時,由(E)CX控制串傳送指令MOVS的執行次數。相當于指令序列:AGAIN:MOVSB/MOVSW/MOVSDLOOPAGAIN4.2通用整數指令及應用4-684-69例4.15欲將數據段中自FIRST開始的100個雙字數據搬移到附加段中以SECOND開始的數據區中,用基本串傳送指令實現,程序如下:LEAESI,FIRSTLEAEDI,SECONDMOVECX,100CLDDONE:MOVSD;或MOVSSECOND,FIRSTLOOPDONE4.2通用整數指令及應用4-70可用帶重復前綴的串傳送指令實現,程序如下: LEAESI,FIRST LEAEDI,SECOND MOVECX,100 CLD REPMOVSD4.2通用整數指令及應用格式:

LODSB/LODSW/LODSDLODS 源串

MEM說明:

允許加重復前綴REP。操作:

([DS:(E)SI])→AL/AX/EAX

按DF指示和操作數長度修改(E)SI指針應用:用于取數據塊中元素值(2)串裝入指令4.2通用整數指令及應用4-714-72(3)串存儲器指令

格式:

STOSB/STOSW/STOSD STOS 目的串

MEM

說明:允許加重復前綴REP。操作:

AL/AX/EAX→([ES:(E)DI])

按DF指示和操作數長度修改(E)DI指針應用:用于數據塊初始化。LODS和STOS結合常用于數據塊傳送。4.2通用整數指令及應用4-73(4)串掃描指令

格式:

SCASB/SCASW/SCASD SCAS 目的串

MEM 操作:(AL/AX/EAX)-([ES:(E)DI]),影響標志,但

不改變目的串內容。按DF指示和操作數長度修改(E)DI指針。4.2通用整數指令及應用說明:允許加重復前綴REPE或REPNE。掃描次數由(E)CX指定。重復條件:

REPE:IF((E)CX)≠0ANDZF=1THEN重復串掃描

REPNE:IF((E)CX)≠0ANDZF=0THEN重復串掃描應用:用于在串數據中查找關鍵字。4.2通用整數指令及應用4-744-75(5)串比較指令格式:

CMPSB/CMPSW/CMPSDCMPS 源串,目的串

MEM ,MEM說明:允許加重復前綴REPE或REPNE。操作:([DS:(E)SI])-([ES:(E)DI]),影響標

志,但不改變源串和目的串內容。按DF指示和

操作數長度修改(E)DI、(E)SI指針應用:常用于比較兩個串數據是否匹配。4.2通用整數指令及應用包括以下5種指令:無條件轉移指令(JMP)過程調用/返回指令(CALL/RET)條件轉移指令(JCC)

循環控制指令(LOOP)中斷指令(INT)無條件向目標地址轉移,可分為段內、段間轉移,段內、段間轉移又可分別分為直接和間接轉移。實現子程序調用或返回,也可歸入無條件轉移指令中。根據指令執行后標志寄存器的狀態進行轉移,通常和CMP或TEST指令組合使用。控制循環程序的循環,實質上也是條件轉移指令,在CX(ECX)中預置循環次數。產生一個由8位立即數指定中斷號的軟中斷和處理溢出中斷。這類指令的共同特點是可改變程序的正常執行順序,使之轉移。而改變程序的執行順序,本質上就是要改變CS:(E)IP的內容這類指令對標志位無影響。5.控制轉移指令

數據傳送類算術運算類邏輯運算與移位類串操作類控制轉移類處理器控制4.2通用整數指令及應用4-764-77直接轉移間接轉移控制轉移指令使用說明:(1)按目標地址的尋址方式,轉移可分為:4.2通用整數指令及應用直接轉移

此時,指令中直接給出轉移的目標地址。又分為:

◆直接短(SHORT)轉移

◆段內(NEAR)直接轉移

◆段間(FAR)直接轉移

段內直接短轉移和段內直接轉移又稱為相對轉移。即轉移的目標地址為當時的(E)IP地址加上一8位位移量(短轉移)、16位位移量(16位尋址)或32位位移量(32位尋址),即: ((E)IP)+DISP→(E)IP4.2通用整數指令及應用4-784-79?間接轉移●寄存器間接轉移。僅有段內轉移。●存儲器間接轉移。分段內和段間轉移。

此時,指令中給出的寄存器或存儲單元中間接存放著轉移的目標地址。又分為:4.2通用整數指令及應用(2)8086/8088的條件轉移指令都為短轉移,80386/80486則推廣到段內轉移。

(3)CALL指令與JMP指令的不同之處:CALL指令執行時,增加了保存斷點地址進棧的操作。(4)循環指令只能是短轉移。

4.2通用整數指令及應用4-804-81

例4.17

指令JMPNEARPTRPROG在程序代碼段中的偏移地址為2013H(這是該指令第一字節的偏移地址),組成該指令的三字節機器碼為E9H、12H、34H(其中E9H為操作碼)。該指令執行后,程序將轉去何處?4.2通用整數指令及應用

解:該指令執行過程如下:5428H3412H位移量程序轉移到當前代碼段中偏移地址為5428H的單元執行E9H12H34H存儲器指令代碼段2013HIP5428H+IP2016H2016H4.2通用整數指令及應用4-824.3匯編語言程序概述4.3.2偽指令語句源程序結構4.3.3匯編語言語句格式4.3.1匯編語言程序的特點4-834.3匯編語言程序概述4.3.1匯編語言程序的特點匯編語言是一種介于機器語言和高級語言之間的、采用助記符表示的程序設計語言,它既不像機器語言那樣直接使用計算機所能理解和識別的二進制代碼,也不像高級語言那樣直接面對用戶。實質上仍然是一種面向機器的語言。匯編語言用助記符來表示指令的功能,用標號或符號代表地址、常量或變量。用匯編語言編寫的程序要比與其等效的高級語言生成的目標代碼精簡得多,占內存少,執行速度快。但用匯編語言編寫和調試程序的周期較長,程序設計的技巧性強,對程序員的要求高,既要熟悉計算機的指令系統也要熟悉計算機的硬件結構。4-84用匯編語言編寫的源程序稱為匯編語言源程序,在提交計算機執行之前也需要翻譯成機器指令(目標程序),這個過程叫匯編。完成匯編的程序則稱為匯編程序(Assembler)。匯編程序無法區分源程序中的符號是數據還是地址,也無法識別數據的類型,還搞不清源程序的分段情況等。匯編語言為了解決這些問題,專門設置了偽指令和算符。匯編時,偽指令和算符只為匯編程序將符號指令翻譯成機器指令提供輔助說明信息,它們并不生成對應的機器指令代碼,匯編工作結束后他們就不存在了。4.3匯編語言程序概述4-854.3.2匯編語言源程序結構80X86/Pentium系列MPU匯編語言都是以邏輯段為基礎,按段的概念來組織代碼和數據的。因此,源程序結構與邏輯段的定義方法密切相關,而宏匯編語言MASM5.0以上的版本中,邏輯段既可用完整段定義,又可用簡化段定義。4.3匯編語言程序概述4-861.標準的單模塊源程序框架[.586] DATASEGMENT[USE16/USE32] ;定義數據段

;數據定義偽指令序列 DATAENDS

STACKSEGMENT[USE16/USE32]STACK ;定義堆棧段

;數據定義偽指令序列 STACKENDS

CODESEGMENT[USE16/USE32] ;定義代碼段 ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA

START:MOVAX,DATA ;取數據段基址 MOVDS,AX ;建立DS的可尋址性 MOVES,AX ;建立ES段的可尋址性

;核心程序段 MOVAH,4CH ;返回DOS操作系統 INT21H CODEENDS

ENDSTART⑴一個源程序由若干邏輯段組成。一般一個源程序具有數據段、附加數據段、堆棧段和代碼段;但只有代碼段是必不可少的。

⑵采用完整段定義時,對程序中定義的邏輯段,要說明邏輯段與段寄存器的尋址關系。ASSUMECS:CODE,SS:STACK,DS:DATA,ES:DATA⑶對數據段(有時還有堆棧段),程序中要包含初始化段寄存器的語句。MOVAX,DATAMOVDS,AXMOVES,AX程序中要包含返回DOS的語句。MOVAH,4CHINT21H⑸源程序(模塊)以END偽指令結束

ENDSTART4.3匯編語言程序概述4-874.3.3匯編語言語句格式1.語句種類●指令語句是可執行語句,由硬件(CPU)完成其功能,匯編時產生目標代碼。●偽指令語句

不可執行語句,其功能由相應軟件完成,不產生目標代碼。●宏指令語句

用戶定義的新指令,匯編時產生相應的目標代碼。

4.3匯編語言程序概述4-88指令語句:[標號:]助記符[操作數][;注釋]偽指令語句:[名字]定義符[操作數][;注釋]●標號和名字——分別是給指令單元和偽指令起的符號名稱,統稱為標識符。(注意組成的語法規則)●助記符和定義符——分別用于規定指令語句的操作性質和偽指令語句的偽操作功能,統稱操作符。2.語句格式4.3匯編語言程序概述4-89●操作數

操作數允許有多個,這時各操作數之間要用逗號“,”隔開。偽指令語句中操作數的格式和含義則隨偽操作命令不同而不同,有時是常量或數值表達式,有時是一般意義的符號

(如變量名、標號名、常數符號等),有時是具有特殊意義的符號(如指令助記符、寄存器名等)。

指令語句中的操作數提供該指令的操作對象,并說明要處理的數據存放在什么位置以及如何訪問它,它可以是常量操作數、寄存器操作數、存儲器操作數和表達式。4.3匯編語言程序概述4-904.4.1方式選擇偽指令4.4.2邏輯段定義偽指令4.4.3數據定義偽指令4.4.4模塊定義偽指令4.4.5過程與宏定義偽指令4.4常用偽指令語句4.4常用偽指令語句4-914.4.1方式選擇偽指令方式選擇偽指令用于通知匯編程序,當前的源程序指令是哪一種CPU指令,經過匯編鏈接之后生成的目標程序在哪一種CPU機型上運行。不屬于選定CPU的指令均為非法指令。所以,方式選擇偽指令本質上也就是指令集選擇偽指令。通常,方式選擇偽指令放在程序的頭部,作為源程序的第一條語句。缺省時默認8086指令集。4.4常用偽指令語句4-924.4.2邏輯段定義偽指令1.完整段定義偽指令80X86/Pentium系列微處理器匯編語言有兩種邏輯段定義方法:完整段和簡化段定義采用完整段定義偽指令可具體控制匯編程序(MASM)和鏈接程序(LINK)在內存中組織代碼和數據的方式。主要包括段定義語句和段寄存器說明語句。

4.4常用偽指令語句4-934.4常用偽指令語句3.3.2邏輯段定義偽指令格式:段名SEGMENT[定位類型][,組合類型][,字長選擇][,‘類別’]段體 ;由指令、偽指令和宏指令語句組成段名ENDS

⑴段定義語句

說明:

(1)SEGMENT/ENDS是一對段定義語句,一個邏輯段從SEGMENT語句開始,到ENDS語句結束。(2)段名是用戶定義的段的標識符,用于指明段的基址。(3)4個可選參數用于為源程序的匯編、連接提供必要的信息,特別是模塊化程序,各個模塊如何定位,彼此之間如何連接,將較多地涉及到定位類型和組合類型的選擇。指定段起點的邊界類型:BYTE(字節)WORD(字)DWORD(雙字)PARA(節)PAGE(頁)

定位類型告訴鏈接程序本段與其它模塊中同名段的組合連接關系:PUBLIC連接到同一個物理段中STACK連接到同一個物理堆棧段中,并給SS:ESP賦值COMMON產生一個覆蓋段。MEMORYAT表達式

組合類型定義段中使用的偏移地址和寄存器的字長USE16──表示該段字長為16位USE32──表示該段字長為32位字長選擇4-94⑵段寄存器說明語句

格式:ASSUME段寄存器:段名[,段寄存器:段名,…]功能:說明源程序中定義的段由那個段寄存器去尋址。說明:

⑴CS只能用于包含有程序的段,反之含有程序的段也只能以CS作為段寄存器。SS也一樣,只能與堆棧段對應。⑵CS所對應的段名必須在該語句之前有定義。⑶該語句是說明性語句。4.4常用偽指令語句4-95簡化段有利于實現匯編語言程序模塊與Microsoft高級語言程序模塊的連接,它可以由操作系統自動安排段序,自動保證名字定義的一致性。但是命令文件(.COM)的編程不能使用簡化段定義。⑴段次序語句(DOSSEG)⑵內存模式語句(.MODEL)⑶段語句

簡化段定義有三種語句:2.簡化段定義偽指令

4.4常用偽指令語句4-964-974.4常用偽指令語句

使用簡化段定義的獨立匯編語言源程序框架:

DOSSEG .MODELSMALL .STACK[長度] .DATA

…;數據語句 .CODE啟動標號:MOVAX,@DATA;或MOVAX,DGROUP MOVDS,AX

…;可執行語句 MOVAH,4CH;返回DOS INT21H END啟動標號段語句.CODE.DATA.STACKDOSSEG段次序語句:規定各邏輯段在內存的順序按DOS段次序約定排列。

.MODELSMALL內存模式語句:用于指定數據和代碼允許使用的長度。4.4.3數據定義偽指令格式:賦值語句:符號名EQU表達式功能:都是用符號名代替表達式的值。但賦值語句定義的符號名不能重新定義,而等號語句允許。1.符號定義偽指令等號語句:符號名=表達式

4.4常用偽指令語句4-98

賦值語句與等號語句舉例。賦值語句: XEQU50 YEQUX+10 COUNTEQU$-ARRY 等號語句: CON=5 BASE=200H

BASE=BASE+10H ;重新定義BASE4.4常用偽指令語句4-992.數據定義偽指令偽指令格式:DBDWDDDFDQDT數據項[,數據項,…,數據項][變量名]功能:是為數據項或項表分配存儲空間,給它們賦初值,并用一個符號名(稱為變量)與之相聯系。8位(字節)16位(字)32位(雙字)48位(長字)64位(四字)80位(十字節)

4.4常用偽指令語句4-100使用說明:⑴給變量賦初值可以是賦確定的值,也可以是賦不確定的值(用“?”表示),還可以是用DUP運算符建立的多次拷貝。

4.4常用偽指令語句4-101

⑵使用SEG、OFFSET、TYPE、LENGTH和SIZE運算符求變量的各種屬性時,特別要注意:對LENGTH運算符,如果變量是用重復數據操作符DUP說明的,則返回外層DUP給定的值;如果沒有DUP說明,則返回值總是1。對SIZE運算符有:SIZE=TYPE×LENGTH⑶操作符“$”是取地址計數器的當前值,常用于表達式定義數組長度。使用說明:4.4常用偽指令語句4-102

⑷使用DB、DW、DD定義串數據(用‘’定義的字符串)時,允許定義的串長度不同,字符的存放順序也不相同:DB是從左至右順序為每個字符分配一個字節單元;DW是從左至右順序為每2個字符分配一個字單元,且前面的字符在高字節,串長度不能超過2;DD是從左至右順序為每4個字符分配一個雙字單元,也是按前面的字符在高字節順序存放,串長度不能超過4。4.4.5過程與宏定義偽指令過程定義偽指令宏定義偽指令宏和過程的比較4.4常用偽指令語句4-103格式:過程名PROC[屬性]

;過程體 [RET]

RET

過程名ENDP

說明:②過程允許嵌套調用,還可以遞歸調用。③過程與邏輯段也可以相互嵌套,但決不允許過程與段交叉覆蓋。過程又稱為子程序。它是一段必須通過CALL指令調用才能執行的程序段,執行完后通過一條RET指令返回原調用處。過程需先定義才能調用。

①過程體中必須至少包含一條RET指令,這是過程的出口。但也允許過程有多條RET指令,即過程有多個出口。1.過程定義偽指令4.4常用偽指令語句4-104宏定義格式:宏名MACRO[形式參數表]

;宏體 ENDM

說明:宏定義的宏名必須唯一,稱為宏指令。宏指令一經定義就可以在源程序的任何地方調用。相當于由用戶給匯編程序提供了一個新的操作碼。

宏調用格式:宏名[實際參數表]宏的概念與過程很相似,也是用一個宏名字來代替源程序中經常要用到的一個程序模塊。2.宏定義偽指令

4.4常用偽指令語句4-105使用宏定義和宏調用時要注意兩個問題:對帶參數的宏指令,宏調用時實際參數與形式參數的類型要一致,以免產生無效調用。宏調用是用宏體中定義的指令序列替換宏指令,所以宏體內的標號要用LOCAL偽指令說明為局部標號,以免多次調用宏時,發生標號重復定義錯誤。LOCAL偽指令格式:

LOCAL標號1[,標號2,…]4.4常用偽指令語句4-106解:宏定義如下:

MOVEMACROSARY,DARY

LOCALLP MOVSI,0 MOVCX,100LP:MOVAL,SARY[SI] MOVDARY[SI],AL INCSI LOOPLP ENDM例4.18

定義宏MOVE,其功能是將一個有100個字節元素的數組搬移到另一個數據區。進行宏調用:MOVEFIRST,SECOND宏展開如下: MOVSI,0MOVCX,100??0000:MOVAL,FIRST[SI] MOVSECOND[SI],AL INCSI LOOP??00004.4常用偽指令語句4-1073.宏和過程的比較

宏和過程都可簡化源程序的書寫,因而也減少了程序出錯的可能性。但兩者使用上也有區別:(1)宏操作可以直接傳遞和接收參數,而過程不能直接帶參數。當過程之間需要傳遞參數時,必須通過堆棧、寄存器或存儲器來進行,編程比宏要復雜。所以,宏匯編適合于代碼較短,傳送參數較多的子功能段使用,子程序適合于代碼較長,調用比較頻繁的子功能段使用。(3)引入宏操作并不會在執行目標代碼時增加額外的時間開銷,但過程調用由于要保護和恢復現場及斷點,因此會延長目標程序的執行時間。(2)子程序不管被調用多少次它都只被匯編一次,即有唯一的一段目標代碼;而宏指令則調用多少次就匯編多少次,每次調用都要在程序中展開并保留宏體中的每一行。4.4常用偽指令語句4-1084.5匯編語言編程入門4.5.1匯編語言程序的開發過程4.5.2基本結構程序設計4.5.3子程序設計與調用4.5.4DOS/BIOS功能調用4-1094.5.1匯編語言程序的開發過程

與其它程序設計語言一樣,匯編語言程序的開發過程可歸結為:就需求分析、模塊劃分和算法確定等工作而言,各種程序設計語言是類似的,均可按軟件工程的方法進行,但編程和調試則因程序設計語言而異。

需求分析根據需求和規模等因素劃分模塊確定各功能模塊的求解算法、并定義所需的數據結構進行編程和調試4.5匯編語言編程入門4-110對匯編語言而言,根據數據結構和算法進行編碼到形成可用程序的過程如下:

需求分析、數據結構和算法匯編語言源程序文件*.ASM目標代碼程序文件*.OBJ可執行程序文件*.EXE可用程序連接編輯匯編調試4.5匯編語言編程入門4-1114.5.2基本結構程序設計程序的基本結構形式有三種:●順序結構●分支結構●循環結構理論上,三種基本結構是完備的,即任何功能的程序都可由順序、分支和循環三種結構實現。4.5匯編語言編程入門4-1121.順序程序設計●在實際應用中,純粹用順序結構編寫的完整程序很少見,但是在程序段中它卻是大量的存在。所以掌握它是編寫復雜應用程序的基礎。——順序程序又稱直線程序。●其特點是順序執行的,無分支,無循環,也無轉移,只作直線運行。4.5匯編語言編程入門4-1132.分支程序設計在許多實際問題中,往往需要根據不同的情況和給定的條件做出不同的處理。要設計這樣的程序,必須事先把各種可能出現的情況及處理方法都編寫在程序中,以后計算機運行程序時,可自動根據運行的結果做出判斷,有條件地選擇執行不同的程序段,按這種要求編寫的程序稱為分支程序。4.5匯編語言編程入門4-114分支1條件結束開始YN分支2(b)完全分支結構分支程序條件結束開始YN(a)不完全分支結構分支1結束開始條件ii=1i=n分支2分支n…i=2(c)多分支結構分支程序的結構有三種形式:

IF條件THEN分支程序IF條件THEN分支1ELSE分支24.5匯編語言編程入門4-115⑴利用比較與條件轉移指令實現分支

程序如下:

DATA SEGMENT

VAR1DB10HVAR2DB09HABUFDB?BBUFDB?DATA ENDS4.5匯編語言編程入門4-116例19已知兩個整數字節變量VAR1和VAR2,試編寫完成下列操作的程序:(1)若兩個數中只有一個是奇數,則將奇數存入ABUF單元,偶數存入BBUF單元。(2)若兩個數均為奇數,則兩數分別加1,并存回原變量處。(3)若兩個數均為偶數,則兩變量不變。

CODE SEGMENT ASSUMECS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOVAL,ABUFMOVBL,BBUFXORAL,BLTESTAL,01H;測試是否為同類JZSAME;是同類,轉CLASSTESEBL,01H;不是同類,測試B是否為偶數JZEXIT;B是偶數,滿足要求(1),轉EXITXCHGBL,ABUF;B不是偶數,按要求(1),交換兩數MOVBBUF,BLJMPEXIT;轉EXITSAME:TESTBL,01H;同類時,測試B是否為偶數JZEXIT;B是偶數,滿足要求(3),轉EXITINCABUF;B不是偶數,按要求(2),兩數加1 CODE ENDS END START4.5匯編語言編程入門4-117⑵利用跳轉表實現分支

——適于多分支結構。有三種跳轉表:

BASE

關鍵字0ADR0

M

(c)根據關鍵字分支關鍵字nADRn關鍵字1ADR1+3+3nBASEJMP

JMPM

(b)根據表內指令分支JMP+3n+3BASEADR0

M

(b)根據表內地址分支ADRnADR1+2n+24.5匯編語言編程入門4-118使用跳轉表實現分支時,要特別注意表內地址分支和表內指令分支兩種結構跳轉表的定義方法和正確的尋址方式。表內地址分支在數據段定義跳轉表,用存儲器間接尋址;表內指令分支在代碼段定義跳轉表,用寄存器間接尋址。4.5匯編語言編程入門4-119解:這是一個多分支結構程序,適合于用跳轉表實現。假設用表內地址分支實現,此時,跳轉表在數據段定義,轉移要用存儲器間接尋址的跳轉指令。程序如下:

例4.20設某控制程序可完成8種產品的加工,每種加工程序對應一個數字(1~8)。現要求根據輸入的值去加工相應產品。假設8種加工程序段與主程序在同一代碼段中。4.5匯編語言編程入門4-120例4.20表內地址分支程序

.486DATASEGMENT‘DATA’DISPDB‘Errorrepeatinput’DB0AH,0DH,‘$’

BASEDDSBR1,SBR2,SBR3,SBR4DDSBR5,SBR6,SBR7,SBR8DATAENDSCODESEGMENT‘CODE’ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;輸入數字序號INT21HCMPAL,‘1’JBERRCMPAL,‘8’JAERRSUBAL,‘1’

ANDEAX,0000000FH

JMPBASE[EAX*4]SBR1:…

SBR2:…

SBR8:…

ERR:CMPAL,‘E’JZEXITMOVDX,OFFSETDISPMOVAH,09HINT21HJMPINPUTEXIT:MOVAH,4CHINT21HCODEENDSENDSTART此題也可用表內指令分支實現。這時,跳轉表要在代碼段定義,轉移則要用寄存器間接尋址的跳轉指令。程序如下:4.5匯編語言編程入門4-121

.486DATASEGMENTUSE16‘DATA’DISPDB‘Errorrepeatinput’DB0AH,0DH,‘$’DATAENDSCODESEGMENTUSE16‘CODE’ASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXINPUT:MOVAH,1;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論