彙編

彙編

彙編大多是指彙編語言,彙編程式。把彙編語言翻譯成機器語言的過程稱為彙編。在彙編語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進制碼,就把機器語言變成了彙編語言。於是彙編語言亦稱為符號語言。用彙編語言編寫的程式,機器不能直接識別,要由一種程式將彙編語言翻譯成機器語言,這種起翻譯作用的程式叫彙編程式,彙編程式是系統軟體中語言處理的系統軟體。

基本信息

詞語解釋

huìbiān
1.動詞,把資料或文章等編輯在一起
2.名詞,編輯在一起的資料文獻
3.名詞,一種計算機語言

彙編彙編

彙編簡介

彙編語言(AssemblyLanguage)是面向機器的程式設計語言。
彙編語言比機器語言易於讀寫、易於調試和修改,同時也具有機器語言執行速度快,占記憶體空間少等優點,但在編寫複雜程式時具有明顯的局限性,彙編語言依賴於具體的機型,不能通用,也不能在不同機型之間移植。
常說彙編語言過時,是低級語言,並不是說彙編語言要被丟棄,相反,彙編語言仍然是程式設計師必須了解的語言,甚至在某些行業與領域,彙編是必不可少的,非它不可適用。只是,現在計算機最大的領域為IT軟體,也是我們常說的Windows編程,在熟練的程式設計師手裡,使用彙編語言編寫的程式,運行效率和性能比用其它語言寫的程式優秀數倍,但是代價是需要更長的時間來最佳化,如果對計算機原理及編程基礎不紮實,實在是得不償失,加上高級語言的優秀與跨平台,一個公司不可能讓一個團隊使用彙編語言來編寫所有的東西,因為這要花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,只要最終結果不比彙編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。
但是,至今為止,還沒有程式設計師敢斷定彙編語言是不需要學的。一個不懂彙編語言的程式設計師,只是三流的程式設計師,這是大部分人的共識;同時,技術彙編語言(AssemblyLanguage)是面向機器的程式設計語言,精湛的彙編程式設計師,已經脫離軟體開發,擠身於工業電子編程中。一個電子工程師,主要的開發語言就是彙編,c語言使用只占極少部分,而電子開發工程師更是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高。對比起來,一般電子工程師待遇是程式設計師的十倍以上,這種情況是因為學習彙編的人雖然也不少,但是真正能學到精通的卻不多,它難學,難用,適用範圍小,雖然簡單,但是過於靈活,學過彙編的人學習高級語言很容易,簡從繁易,繁從簡難。
總之,彙編語言是程式設計師的必修語言。
目前國內較好的彙編網站是“AoGo彙編小站”。其站長aogo,就是一個在工業方面有所成就的工程師,有意者可多參考。
其次就是羅雲彬的彙編站點:這個大概是國內建站時間最長的彙編站點,其編寫的《Windows環境下32位彙編語言程式設計》一書。是站長十幾年的經驗的集合,不妨看看。
熟悉指令,可以嘗試破解,加強興趣,參考看雪學院,國內最好的破解組織,其中看雪與眾高手打造的破解書《加密解密完全方案》非常有名。彙編語言是一種低級的程式語言可直接控制硬體。

現狀

隨著現代軟體系統越來越龐大複雜,大量經過了封裝的高級語言如C/C++,Pascal/ObjectPascal也應運而生。這些新的語言使得程式設計師在開發過程中能夠更簡單,更有效率,使軟體開發人員得以應付快速的軟體開發的要求。而彙編語言由於其複雜性使得其適用領域逐步減小。但這並不意味著彙編已無用武之地。由於彙編更接近機器語言,能夠直接對硬體進行操作,生成的程式與其他的語言相比具有更高的運行速度,占用更小的記憶體,因此在一些對於時效性要求很高的程式、許多大型程式的核心模組以及工業控制方面大量套用。
此外,雖然有眾多程式語言可供選擇,但彙編依然是各大學計算機科學類專業學生的必修課,以讓學生深入了解計算機的運行原理。

編譯環境

彙編彙編
彙編的調試環境總的來說比較少,也很少有非常好的編譯器。reallychenchi設計的輕鬆彙編是一款非常適合初學者的彙編編譯器。輕鬆彙編是一個彙編語言集成開發環境,主要面向彙編語言初學者,也可以用它進行開發。除了普通的編輯功能以外,它還可以自動整理格式、高亮顯示和編譯、連結、調試彙編程式,非常方便實用。
輕鬆彙編的最大特點是可以格式整理,就像VC6.0一樣,可以設定斷點調試,省卻了使用者的不少工作。它可以在Win98/2k/XP下運行,是一款很優秀的軟體。

常用命令

彙編彙編
MOV指令為雙運算元指令,兩個運算元中必須有一個是暫存器。
MOVDST,SRC//Byte/Word
執行操作:dst=src
1、目的數可以是通用暫存器,存儲單元和段暫存器(但不允許用CS段暫存器)。
2、立即數不能直接送段暫存器。
3、不允許在兩個存儲單元直接傳送數據。
4、不允許在兩個段暫存器間直接傳送信息。

PUSH入棧指令及POP出棧指令:堆疊操作是以"後進先出"的方式進行數據操作。

入棧的運算元除不允許用立即數外,可以為通用暫存器,段暫存器(全部)和存儲器。入棧時高位位元組先入棧,低位位元組後入棧。

出棧運算元除不允許用立即數和CS段暫存器外,可以為通用暫存器,段暫存器和存儲器。執行POPSS指令後,堆疊區在存儲區的位置要改變。執行POPSP指令後,棧頂的位置要改變。

XCHG(eXCHanG)交換指令:將兩運算元值交換。
XCHGOPR1,OPR2//Byte/Word
執行操作:Tmp=OPR1OPR1=OPR2OPR2=Tmp
1、必須有一個運算元是在暫存器中
2、不能與段暫存器交換數據
3、存儲器與存儲器之間不能交換數據。

換碼指令

彙編彙編
把一種代碼轉換為另一種代碼。
XLAT(OPR可選)//Byte
執行操作:AL=(BXAL)
指令執行時只使用預先已存入BX中的表格首地址,執行後,AL中內容則是所要轉換的代碼

LEA(LoadEffectiveAddress)有效地址傳送暫存器指令
LEAREG,SRC//指令把源運算元SRC的有效地址送到指定的暫存器中。
執行操作:REG=EAsrc
註:SRC只能是各種定址方式的存儲器運算元,REG只能是16位暫存器
MOVBX,OFFSETOPER_ONE等價於LEABX,OPER_ONE
MOVSP,[BX]//將BX間接定址的相繼的二個存儲單元的內容送入SP中
LEASP,[BX]//將BX的內容作為存儲器有效地址送入SP中

LDS(LoadDSwithpointer)指針送暫存器和DS指令
LDSREG,SRC//常指定SI暫存器。
執行操作:REG=(SRC),DS=(SRC2)//將SRC指出的前二個存儲單元的內容送入指令中指定的暫存器中,後二個存儲單元送入DS段暫存器中。

LES(LoadESwithpointer)指針送暫存器和ES指令
LESREG,SRC//常指定DI暫存器
執行操作:REG=(SRC),ES=(SRC2)//與LDS大致相同,不同之處是將ES代替DS而已。

LAHF(LoadAHwithFlags)標誌位送AH指令
LAHF//將PSW暫存器中的低8位的狀態標誌(條件碼)送入AH的相應位,SF送D7位,ZF送D6位。
執行操作:AH=PSW的低位位元組。

SAHF(StoreAHintoFlags)AH送標誌暫存器指令
SAHF//將AH暫存器的相應位送到PSW暫存器的低8位的相應位,AH的D7位送SF,D6位送ZF。
執行操作:PSW的低位位元組=AH。

PUSHF(PUSHtheFlags)標誌進棧指令
PUSHF//將標誌暫存器的值壓入堆疊頂部,同時棧指針SP值減2
執行操作:SP=SP-1,(SP)=PSW的高8位,SP=SP-1,(SP)=PSW的低8位

POPF(POPtheFlags)標誌出棧指令
POPF//與PUSHF相反,從堆疊的頂部彈出兩個位元組送到PSW暫存器中,同時堆疊指針值加2
執行操作:PSW低8位=(SP),SP=SP1,PSW高8位=(SP),SP=SP1

輸入輸出指令(IN,OUT):只限於使用累加器AX或AL與外部設備的連線埠傳送信息。
IN(INput)輸入指令:信息從I/O通過累加器傳送到CPU
INAL,PORT//直接的位元組輸入,PORT是外設連線埠編號(即連線埠地址),只能取00H~0FFH共256個連線埠地址。
INAX,PORT//直接的字輸入,AX存儲連續兩個連線埠地址PORT1,PORT
INAL,DX//間接的位元組輸入,連線埠地址範圍可通過DX設定為0000H~0FFFFH共65536個連線埠地址
INAX,DX//間接的字輸入
OUT(OUTput)輸出指令:信息從CPU通過累加器傳送到I/O
outport,AL//直接的位元組輸出,PORT規定與IN指令相同。
OUTPORT,AX
OUTDX,AL//間接的位元組輸出
OUTDX,AX
MOVAL,05HOUT27H,AL//將位元組05H傳送到地址27H的連線埠

加法指令

彙編彙編
ADDDST,SRC//Byte/Word
執行操作:dst=dstsrc
1、兩個存儲器運算元不能通過ADD指令直接相加,即DST和SRC必須有一個是通用暫存器運算元
2、段暫存器不能作為SRC和DST。
3、影響標誌位AuxiliaryCrrayFlag,CarryFlag,OverflowFlag,ParityFlag,SignFlag和ZeroFlag,如下所示:
CF根據最高有效位是否有進(借)位設定的:有進(借)位時CF=1,無進(借)位時CF=0。
OF根據運算元的符號及其變化來設定的:若兩個運算元的符號相同,而結果的符號與之相反時OF=1,否則為0。
ZF根據結果來設定:不等於0時ZF=0,等於0時ZF=1
SF根據結果的最高位來設定:最高位為0,則SF=0。
AF根據相加時D3是否向D4進(借)位來設定:有進(借)位時AF=1,無進(借)位時AF=0
PF根據結果的1的個數時否為奇數來設定:1的個數為奇數時PF=0,為偶數時PF=1

ADC(ADdwithCarry)帶進位加法指令
ADCDST,SRC//Byte/Word
執行操作:dst=dstsrcCF//與ADD不同之處是還要加上進位標誌位的值。

INC(INCreament)加1指令
INCOPR//Byte/Word
執行操作:OPR=OPR1
1、OPR可以是暫存器和存儲器運算元,但不能是立即數和段暫存器
2、影響標誌位OF,SF,ZF,PF和AF,不影響CF

減法指令

彙編彙編
SUB(SUBtract)不帶借位的減法指令
SUBDST,SRC//Byte/Word
執行操作:dst=dst-src
1、DSTSRC定址方式及規定與ADD相同。
2、影響全部標誌位。

SBB(SuBtractwithBorrow)帶借位減法指令
SBBDST,SRC//Byte/Word
執行操作:dst=dst-src-CF

DEC(decrement)減1指令
DECOPR//Byte/Word
執行操作:OPR=OPR-1//除CF標誌位,其餘標誌位都受影響。

NEG(NEGate)求補指令
NEGOPR
執行操作:opr=0-opr//將運算元按位求反後末位加1。

CMP(CoMPare)比較指令
CMPOPR1,OPR2
執行操作:OPR1-OPR2//與SUB指令一樣執行運算,但不保存結果。
比較情況無符號數有符號數
A=BZF=1ZF=1
A>BCF=0&&ZF=0SF^OF=0&&ZF=0
A=BCF=0||ZF=1SF^OF=0||ZF=1
AAX=AL*src//位元組運算時目的運算元用AL,乘積放在AX中
Word=>DX=AX*src//字運算時目的運算元用AX,DX存放乘積的高位字,AX放乘積的低位字
1、目的數必須是累加器AX或AL,指令中不需寫出
2、源運算元SRC可以是通用暫存器和各種定址方式的存儲器運算元,而絕對不允許是立即數或段暫存器。

IMUL(sIgnedMULtiple)有符號數乘法指令
IMULSRC//與MUL指令相同,但必須是帶符號數

DIV(unsignedDIVide)無符號數除法指令
DIVSRC//Byte/Word其中:SRC的規定同乘法指令MUL
執行操作:Byte=>AX/src//位元組運算時目的運算元在AX中,結果的商在AL中,餘數中AH中
Word=>DX,AX/src//字運算時目的運算元在DX高位字和AX低位字中,結果的商在AX中,餘數在DX中
存儲器運算元必須指明數據類型:BYTEPTRsrc或WORDPTRsrc

IDIV(sIgnedDIVied)有符號數除法指令
IDIVSRC//Byte/Word與DIV指令相同,但必須是帶符號數

CBW(ConvertBytetoWord)位元組轉換為字指令
CBW執行操作:AL中的符號位(D7)擴展到8位AH中,若AL中的D7=0,則AH=00H,若AL中的D7=1,則AH=FFH。

CWD(ConvertWordtoDoubleword)字轉換為雙字指令
CWD執行操作:AX中的符號位(D15)擴展到16位DX中,若AX中的D15=0,則DX=0000H,若AX中的D15=1,則DX=FFFFH

調整指令

彙編彙編
十進制調整指令
當計算機進行計算時,必須先把十進制數轉換為二進制數,再進行二進制數運算,最後將結果又轉換為十進制數輸出。在計算機中,可用4位二進制數表示一位十進制數,這種代碼稱為BCD(BinaryCodedDecimal)。BCD碼又稱8421碼,在PC機中,BCD碼可用壓縮的BCD碼和非壓縮的BCD碼兩種格式表示。

壓縮的BCD碼用4位二進制數表示一個十制數,整個十進數形式為一個順序的以4位為一組的數串。非壓縮的BCD碼以8位為一組表示一個十進制數,8位中的低4位表示8421的BCD碼,而高4位則沒有意義。

壓縮的BCD碼調整指令
DAA(DecimalAdjustforAddition)加法的十進制調整指令
DAA執行操作:執行之前必須先執行ADD或ADC指令,加法指令必須把兩個壓縮的BCD碼相加,並把結果存話在AL暫存器中。

DAS(DecimalAdjustforSubtraction)減法的十進制調整指令
DAS執行操作:執行之前必須先執行SUB或SBB指令,減法指令必須把兩個壓縮的BCD碼相減,並氫結果存放在AL暫存器中。

非壓縮的BCD碼調整指令
AAA(ASCIIAdjustforAddition)加法的ASCII調整指令
AAA
執行操作:執行之前必須先執行ADD或ADC指令,加法指令必須把兩個非壓縮的BCD碼相加,並把結果存話在AL暫存器中。

AAS(ASCIIAdjustforSubtraction)減法的ASCII調整指令
AAS執行操作:執行之前必須先執行SUB或SBB指令,減法指令必須把兩個非壓縮的BCD碼相減,並氫結果存放在AL暫存器中。

彙編彙編
MOVS(MOVeString)串傳送指令
MOVB//位元組串傳送DF=0,SI=SI1,DI=DI1;DF=1,SI=SI-1,DI=DI-1
MOVW//字串傳送DF=0,SI=SI2,DI=DI2;DF=1,SI=SI-2,DI=DI-2
執行操作:[DI]=[SI],將位於DS段的由SI所指出的存儲單元的位元組或字傳送到位於ES段的由DI所指出的存儲單元,再修改SI和DI,從而指向下一個元素。
在執行該指令之前,必須預置SI和DI的初值,用STD或CLD設定DF值。
MOVSDST,SRC//同上,不常用,DST和SRC只是用來用類型檢查,並不允許使用其它定址方式來確定運算元。
1、目的串必須在附加段中,即必須是ES:[DI]
2、源串允許使用段跨越前綴來修飾,但偏移地址必須是[SI]。

stos(STOreintoString)存入串指令
STOSDST
STOSB//存放位元組串(DI)=AL
STOSW//存放字串(DI)=AX
執行品作:把AL或AX中的內容存放由DI指定的附加段的位元組或字單元中,並根據DF值修改及數據類型修改DI的內容。

1、在執行該指令之前,必須把要存入的數據預先存入AX或AL中,必須預置DI的初值。
2、DI所指向的存儲單元只能在附加段中,即必須是ES:[DI]

LODS(LOaDfromString)從串取指令
LODSSRC
LODSB//從位元組串取AL=(SI)
LODSW//從字串取AX=(SI±1)(SI)
執行操作:把由SI指定的數據段中位元組或字單元的內容送入AL或AX中,並根據DF值及數據類型修改SI的內容。
1、在執行該指令之前,要取的數據必須在存儲器中預先定義(用DB或DW),必須預置SI的初值。
2、源串允許使用段超越前綴來改變數據存儲的段區。

REP(REPeat)重複操作前綴
REPStringPrimitive//其中:StringPrimitive可為MOVS,STOS或LODS指令
執行操作:使REP前綴後的串指令重複執行,每執行一次CX=CX-1,直至CX=0時退出REP。

方向標誌

彙編彙編
CLD(CLearDirectionflag)清除方向標誌指令
CLD
執行操作:令DF=0,其後[SI],[DI]執行增量操作

STD(SeTDirectionflag)設定方向標誌指令
STD
執行操作:令DF=1,其後[SI],[DI]執行減量操作

cmps(CompareString)串比較指令
CMPSSRC,DST
CMPSB//位元組串比較(SI)-(DI)
CMPSW//字串比較(SI1)(SI)-(DI1)(DI)
執行操作:把由SI指向的數據段中的一個位元組或字與由DI指向的附加段中的一個位元組或字相減,不保留結果,只根據結果置標誌位。

SCAS(SCAnString)串掃描指令
SCASDST
SCASB
SCASW
執行操作:把AX或AL的內容與由DI指向的在附加段中的一個位元組或字相減,不保留結果,根據結果置標誌位。

AND,OR,XOR和TEST都是雙位元組操作指令,運算元的定址方式的規定與算術運算指令相同。
NOT是單位元組操作指令,不允許使用立即數。
邏輯運算均是按位進行操作,真值表如下:
AND(位與&)OR(位或|)XOR(位異或^)
1&1=11|1=11^1=0
1&0=01|0=11^0=1
0&1=00|1=10^1=1
0&0=00|0=00^0=0
A:邏輯運算指令
AND(and)邏輯與指令
ANDDST,SRC//Byte/Word
執行操作:dst=dst&src
1、AND指令執行後,將使CF=0,OF=0,AF位無定義,指令執行結果影響SF,ZF和PF標誌位。
2、AND指令典型用法A:用於禁止某些位,即使某些位為0。
禁止AL的高4位:即將高4位和0000B相與,低4位和1111B相與
MOVAL,39H//AL=00111001B[39H]
ADDAL,0FH//AL=00001001B[09H]即00111001B[39H]&00001111B[0FH]=00001001B[09H]
3、AND指令典型用法B:取出某一位的值(見TEST)

邏輯指令

彙編彙編
邏輯或指令ORDST,SRC//Byte/Word
執行操作:dst=dst|src
1、OR指令執行後,將使CF=0,OF=0,AF位無定義,指令執行結果影響SF,ZF和PF標誌位。
2、常用於將某些位置1。
將AL的第5位置1:
MOVAL,4AH//AL=01001010B[4AH]
ORAL,10H//AL=01011010B[5AH]即01001010B[4AH]|00010000B[10H]=01011010B[5AH]
XOR(eXclusiveOR)邏輯異或指令
XORDST,SRC//Byte/Word
執行操作:dst=dst^src
1、XOR指令常用於使某個運算元清零,同時使CF=0,清除進位標誌。
2、XOR指令使某些位維持不變則與'0'相異或,若要使某些位取反則與'1'相異或。
將AL的高4位維持不變,低4位取反:
MOVAL,B8H//AL=10111000B[B8H]
XORAL,0FH//AL=10110111B[B7H]即10111000B[B8H]^00001111[0FH]=10110111B[B7H]
測試某一個運算元是否與另一確定運算元相等:
XORAX,042EH
JZ//如果AX==042EH,則ZF=TRUE(1),執行JZ。。。
NOT(not)邏輯非指令
NOTOPR//Byte/Word
執行操作:opr=~opr//~01100101[65H]=10011010[9AH]
1、運算元不能使用立即數或段暫存器運算元,可使用通用暫存器和各種方式定址的存儲器運算元。
2、NOT指令不影響任何標誌位。
將AL各位取反:
MOVAL,65H//AL=01100101B[65H]
NOTAL//AL=10011010B[9AH]即~01100101B[65H]=10011010B[9AH]

TEST指令

彙編彙編
TESTOPR1,OPR2//Byte/Word
執行操作:opr1&opr2
1、兩個運算元相與的結果不保存,結果影響標誌位PF,SF和ZF,使CF=0,OF=0,而AF位無定義。
2、TEST指令常用於在不改變原有的運算元的情況下,檢測某一位或某幾位的條件是否滿足。只要令用來測試的運算元對應檢測位為1,其餘位為0,相與後判斷零標誌ZF值的真假。
檢測某位是否為1:
令用來測試的運算元對應檢測位為1,其餘位為0,TEST指令後,若該位為1則JNZ。
TESTAL,000000001B//測試AL最低位是否為1:令用來測試的運算元對應檢測位為1,其餘位為0,執行TEST指令JNZTHER //最低位若為1,則ZF=FALSE(0),執行JNZTHER,否則執行下一條指令。
或者:先對運算元求反,令用來測試的運算元對應檢測位為1,其餘位為0,TEST指令後,若該位為1則JZ。
MOVDL,AL//將AL傳送到DL,主要是不要影響AL的值。以下測試AL的b2位是否為1
NOTDL//先對運算元求反
TEST00000100B//令用來測試的運算元對應檢測位為1,其餘位為0,執行TEST指令
JZTHER//若AL的b2位為1,則ZF=TRUE(1),執行JZTHER

B:移位指令[所有的移位指令都影響標誌位CF、OF、PF、SF和ZF。AF無定義。]
非循環邏輯移位:把運算元看成無符數來進行移位。
SHL(SHiftlogicalLeft)邏輯左移指令
SHLOPR,CNT//Byte/Word
執行操作:使OPR左移CNT位,並使最低CNT位為全0。
1、OPR運算元不能使用立即數或段暫存器運算元,可使用通用暫存器和各種方式定址的存儲器運算元。
2、移位次數由CNT決定。每次將OPR的最高位移出並移到CF,最低位補0。
MOVCL,7//若移位多次,先預置移位次數CL
SHLDX,CL//CNT可取1或CL暫存器運算元
SHR(SHiftlogicalRight)邏輯右移指令
SHROPR,CNT//Byte/Word
同SHL,每次將OPR的最低位D0移出並移到CF。最高位補0。
非循環算術移位:將運算元看成有符號數來進行移位。
SAL(ShiftArithmeticLeft)算術左移指令
SALOPR,CNT//Byte/Word
SAL指令與SHL指令完全相同
SAR(ShiftArithmeticRight)算術右移指令
SAROPR,CNT//Byte/Word
SAR指令每次移位時,將最高位移入次高位的同時最高位值不變,最低位D0移出並移到CF。

循環移位

彙編彙編
ROL(ROtateLeft)循環左移指令
ROLOPR,CNT//Byte/Word
每次移位時,最高位移出並同時移到CF和最低位D0
ROR(ROtateRight)循環右移指令
ROROPR,CNT//Byte/Word
每次移位時,最低位D0移出並同時移到CF和最高位。
帶進位循環移位指令
RCL(RotateLeftthroughCarry)帶進位循環左移指令
RCLOPR,CNT//Byte/Word
RCR(RotateRightthroughCarry)帶進位循環右移指令
RCROPR,CNT//Byte/Word

處理器控制指令
CLC(CLearCarry)進位位置0指令
CLC//執行操作後,CF=0
CMC(CoMplementCarry)進位位求反指令
CMC//執行操作後,CF=!CF
STC(SeTCarry)進位位置1指令
STC//執行操作後,CF=1
NOP(NoOperetion)無操作指令
NOP//此指令不執行任何操作,其機器碼占一個位元組單元
HLT(HaLT)停機指令
HLT執行操作後,使機器暫停工作,使處理器CPU處於停機狀態,以等待一次外部中斷到來,中斷結束後,程式繼續執行,CPU繼續工作。

轉移指令

彙編彙編
JMP(JuMP)無條件轉移指令
名稱格式執行操作
段內直接短跳轉JMPSHORTOPRIP=IP8位偏移量
段內直接近轉移JMPNEARPTROPRIP=IP16位偏移量
段內間接轉移JMPWORDPTROPRIP=(EA)
段間直接轉移JMPFARPTROPRIP=OPR偏移地址,CS=OPR段地址
段間間接轉移JMPDWORDPTROPRIP=(EA),CS=(EA2)
1、無條件轉移到指定的地址去執行從該地址開始的指令。
2、段內轉移是指在同一代碼段的範圍內進行轉移,只需改變IP暫存器內容。
3、段間轉移則要轉移到另一個代碼段執行程式,此時要改變IP暫存器和CS段暫存器的內容。
條件轉移指令:根據上一條指令所設定的條件碼(標誌位)來判斷測試條件。
根據五個標誌位:ZF、SF、OF、PF、CF的兩種狀態(0FALSE或1TRUE)產生10種測試條件。
NameFlagFlag==TRUE[1]Flag==FALSE[0]
ZeroFalgZFJZOPR//結果為零轉移JNZOPR//結果不為零轉移
SignFalgSFJSOPR//結果為負轉移JNSOPR//結果為正轉移
OverflowFlagOFJOOPR//溢出轉移JNOOPR//不溢出轉移
ParityFlagPFJPOPR//結果為偶轉移JNPOPR//結果為奇轉移
CarryFlagCFJCOPR//有進位轉移JNCOPR//無進位轉移
兩個數比較:
情況指令滿足條件指令滿足條件
ABJACF==0&&ZF==0JGSF^OF==0&&ZF==0
測試CX轉移指令
JCXZOPR//CX==0時轉移

LOOP(LOOP)循環指令
LOOPOPR測試條件:CX≠0//OPR在程式中實際是個標號
LOOPZOPR測試條件:ZF==1&&CX≠0
LOOPNZOPR測試條件:ZF==0&&CX≠0
執行操作:先執行CX=CX-1,再檢測上面的測試條件,如滿足則IP=IP符號擴展的D8,不滿足則退出循環。
過程調用及返回指令

CALL(CALL)過程調用指令
CALLDST//DST在程式中實際是子程式標號
執行操作:先將過程的返回地址(即CALL的下一條指令的首地址)存入堆疊,然後轉移到過程入口地址執行子程式。
調用方式格式斷點保護入棧情況過程入口地址
段內直接CALLNEARPTRPR1(SP-1)(SP-2)←IP,CS不進棧CS值保持不變,IP←DST
段內間接CALLWORDPTR(EA)(SP-1)(SP-2)←IP,CS不進棧CS值保持不變,IP←(EA)
段間直接CALLFARPTRPR1(SP-1)(SP-2)←CS,(SP-3)(SP-4)←IPIP←DST偏移地址,CS←DST段地址
段間間接CALLDWORDPTR(EA)(SP-1)(SP-2)←CS,(SP-3)(SP-4)←IPIP←(EA),CS←(EA2)
註:為了表明是段內調用,可使用NEARPTR屬性操作符作說明。

RET(RETurn)子程式返回指令
RET
RETEXP//帶立即數返回
子程式返回指令RET放在子程式末尾,它使子程式在執行完全部任務後返回主程式繼續執行被打斷後的程式。返回地址在子程式調用時入棧保存的斷點地址-IP或IP和CS。

相關教材

《80x86彙編語言基礎教程》

基本信息
教材名稱:《80X86彙編語言基礎教程》
ISBN編號:9787111253822
出版時間:2009-3-1
出版社:機械工業出版社
頁數:213
版次印次:1
作者:(美)德特默(Detmer,R.C.) 著,鄭紅,陳麗瓊 譯
開本:16開
裝幀:平裝
印數:1
內容簡介
學會一門具體的彙編語言對理解計算機體系結構是非常有益的,然而,許多關於計算機組成和體系結構的教材對這方面的知識介紹得不多。《80x86彙編語言基礎教程(附光碟)》主要針對Intel80x86體系結構介紹彙編語言知識,因此既是計算機組成和體系結構課程的很好的補充教材,同時也適合作為單獨的彙編語言課程教材。通過《80x86彙編語言基礎教程(附光碟)》的學習,學生能夠使用微軟的MASM彙編器來編譯32位的平面存儲模式程式,並在微軟的Windbg調試器控制下跟蹤程式指令的執行,從中了解計算機內部存儲器和暫存器內容的變化。《80x86彙編語言基礎教程(附光碟)》附帶的軟體包為編寫和調試控制台應用程式提供了很好的環境。
目錄
出版者的話
前言
第1章計算機中數的表示
第2章軟體工具和彙編語言語法
第3章基本指令
第4章分支與循環
第5章過程
第6章位運算
第7章浮點運算
附錄A十六進制/ASC碼轉換
附錄B有用的MS-DOS命令
附錄CMASM6.11保留字
附錄D80x86指令(按助記符排列)
附錄E80x86指令(按操作碼排列)

《彙編語言》

基本信息
教材名稱:《彙編語言》(第2版)
ISBN編號:9787302172284
出版時間:2008-4-1
出版社:清華大學出版社
頁數:337
版次印次:2
作者:王爽 著
開本:16開
裝幀:平裝
印數:1
字數:527000
內容簡介
彙編語言是各種CPU提供的機器指令的助記符的集合,人們可以用彙編語言直接控制硬體系統進行工作。彙編語言是很多相關課程(如數據結構、作業系統、微機原理等)的重要基礎。為了更好地引導、幫助讀者學習彙編語言,作者以循序漸進的思想精心創作了這本書。本書具有如下特點:採用了全新的結構對課程的內容進行組織,對知識進行最小化分割,為讀者構造了循序漸進的學習線索;在深入本質的層面上對彙編語言進行講解;對關鍵環節進行深入的剖析。
本書可用作大學計算機專業本科生的彙編教材及希望深入學習計算機科學的讀者的自學教材。
目錄
第1章 基礎知識
第2章 暫存器
第3章 暫存器(記憶體訪問)
第4章 第一個程式
第5章 [BX]和loop指令
第6章 包含多個段的程式
第7章 更靈活的定位記憶體地址的方法
第8章 數據處理的兩個基本問題
第9章 轉移指令的原理
第10章 CALL和RET指令
第11章 標誌暫存器
第12章 內中斷
第13章 int指令
第14章 連線埠
第15章 外中斷
第16章 直接定址表
第17章 使用BIOS進行鍵盤輸入和磁碟讀寫
綜合研究
附註

《新版彙編語言程式設計》

基本信息
《新版彙編語言程式設計》
《新版彙編語言程式設計》
教材名稱:《新版彙編語言程式設計》
ISBN編號:9787121026966
出版時間:2007-01-01
出版社:電子工業出版社
作者:錢曉捷主編
裝幀:平裝
字數:563200
內容簡介
本書以Intel80x86指令系統和MASM6.x為主體,全面而系統地介紹16/32位整數、浮點、多媒體指令的彙編語言程式設計方法。全書可分為基礎和提高兩部分。前5章作為基礎部分,以當前“彙編語言程式設計”課程的教學為目標,為讀者講解16位基本整數指令及其彙編語言程式設計的知識。基礎部分的主要內容是:彙編語言程式設計的基礎知識,8086指令詳解,MASM偽指令和操作符,程式格式,程式結構及其設計方法。後4章為提高部分,從不同的方面介紹彙編語言程式設計的深入內容和實際套用知識。提高部分各章的內容相對獨立,主要有:32位80x86CPU的整數指令系統及其編程,彙編語言與C/C++的混合編程,80x87FPU的浮點指令系統及其編程,多媒體擴展指令系統及其編程,64位指令簡介。本書可作為高等院校《彙編語言程式設計》課程的教材或參考書,主要讀者為計算機及相關學科的本科和高職、高專學生。本書內容廣博、語言淺顯、結構清晰、實例豐富,也適合於電子、自動控制等專業的高校學生和成教學生,計算機套用開發人員,深入學習微機套用技術的普通讀者等。
目錄
第1章彙編語言基礎知識
第2章8086的指令系統
第3章彙編語言程式格式
第4章基本彙編語言程式設計
第5章高級彙編語言程式設計
第6章32位指令及其編程
第7章彙編語言與C/C++的混合編程
第8章80x87浮點指令及其編程
第9章多媒體指令及其編程
第10章64位指令簡介
附錄A調試程式CodeView
附錄B彙編程式MASM的偽指令和操作符
附錄C80x86整數指令系統
附錄D輸入輸出子程式庫IO.LIB
參考文獻

《彙編語言程式設計》

基本信息
《彙編語言程式設計》
《彙編語言程式設計》
產品名稱:《彙編語言程式設計》
ISBN編號:9787111272601
出版時間:2009-10-1
出版社:機械工業出版社
頁數:340
版次印次:1
作者:何超主編
開本:16開
裝幀:平裝
印數:1
字數:544000
內容簡介
本書共8章,主要討論彙編語言的編程基礎、程式開發過程和調試方法。
本書的主要特點是通俗易懂,遵循由淺入深、由簡到繁、循序漸進的原則。力爭改變彙編語言難學難教的狀況。與本書配套的《彙編語言程式設計實驗與習題解答》一書另行出版,該書包含詳盡的彙編語言程式設計實驗和本書所有習題的解答。本書既可作為高等院校信息類(如計算機、自動控制、電工電子等)專業的本科教材,也可作為工程技術人員的參考書。
目錄
出版說明
前言
第1章 彙編語言的基本概念
第2章 彙編語言程式中的指令與偽指令
第3章 彙編語言程式設計初步
第4章 子程式設計
第5章 彙編語言程式的套用示例
第6章 輸入輸出和中斷處理
第7章 宏和多模組程式設計
第8章 彙編語言程式開發與調試
附錄
參考文獻

彙編簡介

彙編語合中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進制碼,就把機器語言變成了彙編語言。於是彙編語言亦稱為符號語言。
用彙編語言編寫的程式,機器不能直接識別,要由一種程式將彙編語言翻譯成機器語言,這種起翻譯作用的程式叫彙編程式,彙編程式是系統軟體中語言處理的系統軟體。彙編程式把彙編語言翻譯成機器語言的過程稱為彙編。
彙編語言比機器語言易於讀寫、易於調試和修改,同時也具有機器語言執行速度快,占記憶體空間少等優點,但在編寫複雜程式時具有明顯的局限性,彙編語言依賴於具體的機型,不能通用,也不能在不同機型之間移植。
是能完成一定任務的機器指令的集合。
常說彙編語言過時,是低級語言,並不是說彙編語言要被棄之,相反,彙編語言仍然是程式設計師必須了解的語言,在某些行業與領域,彙編是必不可少的,非它不可適用。只是,現在計算機最大的領域為IT軟體,也是我們常說的Windows編程,在熟練的程式設計師手裡,使用彙編語言編寫的程式,運行效率與性能比其它語言寫的程式是成倍的優秀,但是代價是需要更長的時間來最佳化,如果對計算機原理及編程基礎的紮實,實在是得不嘗失,對比現在的軟體開發,已經是市場化的軟體行業,加上高級語言的優秀與跨平台,一個公司不可以讓一個團隊使用彙編語言來編寫所有的東西,花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,只要最終結果不比彙編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。
但是,至今為止,還沒有程式設計師敢斷定彙編語言是不需要學的,一個不懂彙編語言的程式設計師,只是三流的程式,這是大部分人的共識,同時,技術精湛的彙編程式設計師,已經脫離軟體開發,擠身於工業電子編程中,一個電子工程師,主要開發語言就中彙編,c語言使用只占極少部分,而電子開發工程師是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程式設計師的十倍以上。這種情況是因為現在學習彙編的人雖然也不少,但是真正能學到精通的卻不多,它難學,難用,適用範圍小,雖然簡單,但是過於靈活,學習過高級語言的人去學習彙編比一開始學彙編的人難得多,但是學過彙編的人學習高級語言卻很容易,簡從繁易,繁從簡難。
總之,彙編語言是程式設計師的必修語言。

相關詞條

相關搜尋

熱門詞條

聯絡我們