汇编介绍
匯編大多是指匯編語言,匯編程序。把匯編語言翻譯成機器語言的過程稱為匯編。在匯編語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進制碼,就把機器語言變成了匯編語言。于是匯編語言亦稱為符號語言。用匯編語言編寫的程序,機器不能直接識別,要由一種程序將匯編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統軟件中語言處理的系統軟件。
目錄
- 詞語解釋
- 匯編簡介
- 相關教材
- 編譯環境
- 常用命令
- 匯編基礎
展開
編輯本段詞語解釋
huì biān1.動詞,把資料或文章等編輯在一起2.名詞,編輯在一起的資料,文獻3.名詞,一種計算機語言
編輯本段匯編簡介
匯編語言(Assembly Language)是面向機器的
程序設計語言。匯編語言比
機器語言易于讀寫、易于調試和修改,同時也具有機器語言執行速度快,占內存空間少等優點,但在編寫復雜程序時具有明顯的局限性,匯編語言依賴于具體的機型,不能通用,也不能在不同機型之間移植。是能完成一定任務的機器指令的集合。常說匯編語言過時,是低級語言,并不是說匯編語言要被棄之,相反,匯編語言仍然是程序員必須了解的語言,在某些行業與領域,匯編是必不可少的,非它不可適用。只是,現在
計算機最大的領域為IT
軟件,也是我們常說的
Windows編程,在熟練的程序員手里,使用匯編語言編寫的程序,運行效率與性能比其它語言寫的程序是成倍的優秀,但是代價是需要更長的時間來優化,如果對計算機原理及編程基礎不扎實,實在是得不償失,對比現在的軟件開發,已經是市場化的軟件行業,加上
高級語言的優秀與跨平臺,一個公司不可以讓一個團隊使用匯編語言來編寫所有的東西,花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,只要最終結果不比匯編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。
匯編語言
(6張)
但是,至今為止,還沒有程序員敢斷定匯編語言是不需要學的,一個不懂匯編語言的程序員,只是三流的程序員,這是大部分人的共識,同時,技術匯編語言(Assembly Language)是面向機器的程序設計語言精湛的匯編程序員,已經脫離軟件開發,擠身于工業電子編程中,一個電子工程師,主要開發語言就是匯編,
c語言使 用只占極少部分,而電子開發工程師是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程序員的十 倍以上。這種情況是因為現在學習匯編的人雖然也不少,但是真正能學到精通的卻不多,它難學,難用,適用范圍小,雖然簡單,但是過于靈活,學習過高級語言的 人去學習匯編比一開始學匯編的人難得多,但是學過匯編的人學習高級語言卻很容易,簡從繁易,繁從簡難。總之,匯編語言是程序員的必修語言。目前國內最好的匯編網站是“AoGo匯編小站”。其站長aogo,就是一個在工業方面有所成就的工程師,有意者可多參考。其次就是
羅云彬的匯編站點:這個大概是國內建站時間最長的匯編站點,其編寫的《Windows壞境下32位
匯編語言程序設計》一書。是站長十幾年的經驗的集合,不妨看看。熟悉指令,可以嘗試激活成功教程,加強興趣,參考看雪學院,國內最好的激活成功教程組織,其中看雪與眾高手打造的激活成功教程書《加密 解密完全方案》非常有名。匯編語言是一種低級的程序語言可直接控制硬件。
編輯本段相關教材
《80X86匯編語言基礎教程》
基本信息
教材名稱:80X86匯編語言基礎教程ISBN編號: 9787111253822出版時間:2009-3-1出版社:
機械工業出版社 頁數: 213版次印次: 1作者: (美)德特默(Detmer,R.C.) 著,
鄭紅,陳麗瓊 譯開本: 16開裝幀: 平裝印數: 1
內容簡介 學會一門具體的匯編語言對理解
計算機體系結構是非常有益的,然而,許多關于計算機組成和體系結構的教材對這方面的知識介紹得不多。《80×86匯編語言基礎教程(附光盤)》主要針對Intel 80×86體系結構介紹匯編語言知識,因此既是計算機組成和體系結構課程的很好的補充教材,同時也適合作為單獨的匯編語言課程教材。通過《80×86匯編語言基礎教程(附光盤)》的學習,學生能夠使用
微軟的MASM匯編器來編譯32位的平面存儲模式程序,并在微軟的Windbg調試器控制下跟蹤程序指令的執行,從中了解計算機內部存儲器和寄存器內容的變化。《80×86匯編語言基礎教程(附光盤)》附帶的
軟件包為編寫和調試控制臺應用程序提供了很好的環境。
目錄 出版者的話前言第1章計算機中數的表示第2章軟件工具和匯編語言語法第3章基本指令第4章分支與循環第5章過程第6章位運算第7章浮點運算附錄A 十六進制/ASC 碼轉換附錄B 有用的
MS-DOS命令附錄C MASM 6.11 保留字附錄D 80×86 指令(按助記符排列)附錄E 80×86 指令(按操作碼排列)
《匯編語言》
基本信息
教材名稱:匯編語言(第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
內容簡介 本 書以Intel 80×86指令系統和MASM 6.x為主體,全面而系統地介紹16/32位整數、浮點、多媒體指令的匯編語言程序設計方法。全書可分為基礎和提高兩部分。前5章作為基礎部分,以當前 “匯編語言程序設計”課程的教學為目標,為讀者講解16位基本整數指令及其匯編語言程序設計的知識。基礎部分的主要內容是:匯編語言程序設計的基礎知 識,8086指令詳解,MASM偽指令和操作符,程序格式,程序結構及其設計方法。后4章為提高部分,從不同的方面介紹匯編語言程序設計的深入內容和實際 應用知識。提高部分各章的內容相對獨立,主要有:32位80×86 CPU的整數指令系統及其編程,匯編語言與C/C++的混合編程,80×87 FPU的浮點指令系統及其編程,多媒體擴展指令系統及其編程,64位指令簡介。本書可作為高等院校《匯編語言程序設計》課程的教材或參考書,主要讀者為計 算機及相關學科的本科和高職、高專學生。本書內容廣博、語言淺顯、結構清晰、實例豐富,也適合于電子、自動控制等專業的高校學生和成教學生,計算機應用開 發人員,深入學習微機應用技術的普通讀者等。
目錄第1章匯編語言基礎知識第2章 8086的指令系統第3章匯編語言程序格式第4章基本匯編語言程序設計第5章高級匯編語言程序設計第6章 32位指令及其編程第7章匯編語言與C/C++的混合編程第8章 80×87浮點指令及其編程第9章多媒體指令及其編程第10章 64位指令簡介附錄A 調試程序CodeView附錄B 匯編程序MASM的偽指令和操作符附錄C 80×86整數指令系統附錄D 輸入輸出子程序庫IO.LIB參考文獻
《匯編語言程序設計》
基本信息
產品名稱:匯編語言程序設計ISBN編號:9787111272601出版時間:2009-10-1出版社: 機械工業出版社頁數: 340版次印次: 1作者:
何超主編開本: 16開裝幀: 平裝印數: 1字數: 544000
內容簡介 本書共8章,主要討論匯編語言的編程基礎、程序開發過程和調試方法。本書的主要特點是通俗易懂,遵循由淺入深、由簡到繁、循序漸進的原則。力爭改變匯編語言難學難教的狀況。與本書配套的《
匯編語言程序設計實驗與習題解答》一書另行出版,該書包含詳盡的匯編語言程序設計實驗和本書所有習題的解答。本書既可作為高等院校信息類(如計算機、自動控制、電工電子等)專業的本科教材,也可作為
工程技術人員的參考書。
目錄出版說明前言第1章 匯編語言的基本概念第2章 匯編語言程序中的指令與偽指令第3章 匯編語言程序設計初步第4章 子程序設計第5章 匯編語言程序的應用示例第6章 輸入輸出和中斷處理第7章 宏和多模塊程序設計第8章 匯編語言程序開發與調試附錄參考文獻
編輯本段編譯環境
匯編的調試環境總的來說比較少,也很少有非常好的
編譯器。reallychenchi設計的
輕松匯編是一款非常適合初學者的匯編編譯器。輕松匯編是一個匯編語言
集成開發環境,主要面向匯編語言初學者,也可以用它進行開發。除了普通的編輯功能以外,它還可以自動整理格式、高亮顯示和編譯、鏈接、調試
匯編程序,非常方便實用。輕松匯編的最大特點是可以格式整理,就像VC6.0一樣,可以設置斷點調試,省卻了使用者的不少工作。它可以在Win98/2k/XP下運行,是一款很優秀的軟件。
編輯本段常用命令
MOV指令為雙操作數指令,兩個操作數中不能全為內存操作數執行操作: dst = src1.目的數可以是通用寄存器,
存儲單元和段寄存器(但不允許用CS段寄存器).2.立即數不能直接送段寄存器3.不允許在兩個存儲單元直接傳送數據4.不允許在兩個段寄存器間直接傳送信息
PUSH入棧指令及
POP出棧指令:
堆棧操作是以“后進先出”的方式進行數據操作。PUSH SRC //Word入棧的操作數除不允許用立即數外,可以為通用寄存器,段寄存器(全部)和存儲器。入棧時高位字節先入棧,低位字節后入棧。POP DST //Word出棧操作數除不允許用立即數和CS段寄存器外,可以為通用寄存器,段寄存器和存儲器。執行POP SS指令后,堆棧區在存儲區的位置要改變。執行POP SP 指令后,棧頂的位置要改變。
XCHG(eXCHanG)交換指令: 將兩操作數值交換。XCHG OPR1,OPR2 //Byte/Word執行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp1.必須有一個操作數是在寄存器中2.不能與段寄存器交換數據3.存儲器與存儲器之間不能交換數據。
XLAT(TRANSLATE)換碼指令: 把一種代碼轉換為另一種代碼。XLAT (OPR 可選) //Byte執行操作: AL=(BX+AL)指令執行時只使用預先已存入BX中的表格首地址,執行后,AL中內容則是所要轉換的代碼。
LEA(Load Effective Address) 有效地址傳送寄存器指令LEA REG,SRC //指令把源操作數SRC的有效地址送到指定的寄存器中。執行操作: REG = EAsrc注: SRC只能是各種尋址方式的存儲器操作數,REG只能是16位寄存器MOV BX,OFFSET OPER_ONE 等價于 LEA BX,OPER_ONEMOV SP,[BX] //將BX間接尋址的相繼的二個存儲單元的內容送入SP中LEA SP,[BX] //將BX的內容作為存儲器有效地址送入SP中
LDS(Load DS with pointer)
指針送寄存器和DS指令LDS REG,SRC //常指定SI寄存器。執行操作: REG=(SRC),DS=(SRC+2) //將SRC指出的前二個存儲單元的內容送入指令中指定的寄存器中,后二個存儲單元送入DS段寄存器中。
LES(Load ES with pointer) 指針送寄存器和ES指令LES REG,SRC //常指定DI寄存器執行操作: REG=(SRC),ES=(SRC+2) //與LDS大致相同,不同之處是將ES代替DS而已。
LAHF ( Load AH with Flags ) 標志位送AH指令LAHF //將PSW寄存器中的低8位的狀態標志(條件碼)送入AH的相應位,SF送D7位,ZF送D6位……執行操作: AH=PSW的低位字節。
SAHF( Store AH into Flags ) AH送標志寄存器指令SAHF //將AH寄存器的相應位送到PSW寄存器的低8位的相應位,AH的D7位送SF,D6位送ZF……執行操作: PSW的低位字節=AH。
PUSHF( PUSH the Flags) 標志進棧指令PUSHF //將標志寄存器的值壓入堆棧頂部,同時棧指針SP值減2執行操作: SP=SP-1,(SP)=PSW的高8位,SP=SP-1,(SP)=PSW的低8位
POPF( POP the Flags ) 標志出棧指令POPF //與PUSHF相反,從堆棧的頂部彈出兩個字節送到PSW寄存器中,同時堆棧指針值加2執行操作: PSW低8位=(SP),SP=SP+1,PSW高8位=(SP),SP=SP+1輸入輸出指令(
IN,OUT):只限于使用累加器AX或AL與外部設備的端口傳送信息.IN (INput)輸入指令:信息從I/O通過累加器傳送到CPUIN AL,PORT //直接的字節輸入,PORT是外設端口編號(即端口地址),只能取 00H ~ 0FFH共256個端口地址。IN AX,PORT //直接的字輸入,AX存儲連續兩個端口地址PORT+1,PORTIN AL,DX //間接的字節輸入,端口地址范圍可通過DX設置為0000H ~ 0FFFFH共65536個端口地址IN AX,DX //間接的字輸入OUT( OUTput)輸出指令 :信息從CPU通過累加器傳送到I/OOUT PORT,AL //直接的字節輸出,PORT規定與IN指令相同。OUT PORT,AXOUT DX,AL //間接的字節輸出OUT DX,AXMOV AL,05H OUT 27H,AL //將字節05H傳送到地址27H的端口
ADD(ADD)加法指令ADD DST,SRC //Byte/Word執行操作: dst=dst+src1.兩個存儲器操作數不能通過ADD指令直接相加,即DST 和SRC必須有一個是通用寄存器操作數。2.段寄存器不能作為SRC 和DST.3.影響標志位Auxiliary Crray Flag,Carry Flag,Overflow Flag,Parity Flag,Sign Flag 和Zero Flag,如下所示:CF 根據最高有效位是否有進(借)位設置的:有進(借)位時CF=1,無進(借)位時CF=0.OF 根據操作數的符號及其變化來設置的:若兩個操作數的符號相同,而結果的符號與之相反時OF=1,否則為0.ZF 根據結果來設置:不等于0時ZF=0,等于0時ZF=1SF 根據結果的最高位來設置:最高位為0,則SF=0.AF 根據相加時D3是否向D4進(借)位來設置:有進(借)位時AF=1,無進(借)位時AF=0PF 根據結果的1的個數時否為奇數來設置:1的個數為奇數時PF=0,為偶數時PF=1
ADC( ADd with Carry)帶進位加法指令ADC DST,SRC //Byte/Word執行操作: dst=dst+src+CF //與ADD不同之處是還要加上進位標志位的值。
INC( INCrement) 加1指令INC OPR //Byte/Word執行操作: OPR=OPR+11.OPR可以是寄存器和存儲器操作數,但不能是立即數和段寄存器2.影響標志位OF,SF,ZF,PF 和AF,不影響CF.
SUB( SUBtract ) 不帶借位的減法指令SUB DST,SRC //Byte/Word執行操作:dst=dst – src1.DST和SRC尋址方式及規定與ADD相同。2.影響全部標志位。(判斷標志位參見ADD)
SBB ( SuBtract with Borrow) 帶借位減法指令SBB DST,SRC //Byte/Word執行操作:dst= dst – src – CF
DEC( DECrement ) 減1指令DEC OPR //Byte/Word執行操作:OPR = OPR – 1 //除CF標志位,其余標志位都受影響。
NEG( NEGate ) 求補指令NEG OPR執行操作:opr = 0- opr //將操作數按位求反后末位加1.
CMP ( CoMPare ) 比較指令CMP OPR1,OPR2執行操作:OPR1 – OPR2 //與SUB指令一樣執行運算,但不保存結果。比較情況 無符號數 有符號數A=B ZF=1 ZF=1A>B CF=0 && ZF=0 SF^OF=0 && ZF=0A<B CF=1 && ZF=0 SF^OF=1 && ZF=0A>=B CF=0 || ZF=1 SF^OF=0 || ZF=1A<=B CF=1 || ZF=1 SF^OF=1 || ZF=1
MUL( unsigned MULtiple ) 無符號數乘法指令MUL SRC //Byte/Word .執行操作:Byte => AX= AL *src //字節運算時目的操作數用AL,乘積放在AX中Word => DX=AX *src //字運算時目的操作數用AX,DX存放乘積的高位字,AX放乘積的低位字1.目的數必須是累加器 AX 或AL,指令中不需寫出2. 源操作數SRC可以是通用寄存器和各種尋址方式的存儲器操作數,而絕對不允許是立即數或段寄存器。
IMUL(sIgned MULtiple) 有符號數乘法指令IMUL SRC //與MUL指令相同,但必須是帶符號數
DIV ( unsigned DIVide) 無符號數除法指令DIV SRC //Byte/Word 其中: SRC的規定同乘法指令MUL執行操作:Byte => AX / src //字節運算時目的操作數在AX中,結果的商在AL中,余數在AH中Word=> DX,AX /src //字運算時目的操作數在DX高位字和AX低位字中,結果的商在AX中,余數在DX中存儲器操作數必須指明數據類型:BYTE PTR src 或 WORD PTR src
IDIV (sIgned DIVied) 有符號數除法指令IDIV SRC //Byte/Word 與DIV指令相同,但必須是帶符號數
CBW(Convert Byte to Word) 字節轉換為字指令CBW執行操作: AL中的符號位(D7)擴展到8位AH中,若AL中的D7=0,則AH=00H,若AL中的D7=1,則AH=FFH.
CWD(Convert Word to Double word) 字轉換為雙字指令CWD執行操作: AX中的符號位(D15)擴展到16位DX中,若AX中的D15=0,則DX=0000H,若AX中的D15=1,則DX=FFFFH十進制調整指令當計算機進行計算時,必須先把十進制數轉換為
二進制數,再進行二進制數運算,最后將結果又轉換為十進制數輸出。在計算機中,可用4位二進制數表示一位十進制數,這種代碼稱為BCD ( Binary Coded Decimal ).BCD碼又稱8421碼,在PC機中,BCD碼可用壓縮的BCD碼和非壓縮的BCD碼兩種格式表示。壓縮的BCD碼用4位二進制數表示一個十制數,整個十進數形式為一個順序的以4位為一組的數串。非壓縮的BCD碼以8位為一組表示一個十進制數,8位中的低4位表示8421的BCD碼,而高4位則沒有意義。壓縮的BCD碼調整指令
DAA(Decimal Adjust for Addition) 加法的十進制調整指令DAA執行操作:執行之前必須先執行ADD或ADC指令,加法指令必須把兩個壓縮的BCD碼相加,并把結果存話在AL寄存器中。
DAS(Decimal Adjust for Subtraction) 減法的十進制調整指令DAS執行操作:執行之前必須先執行SUB或SBB指令,減法指令必須把兩個壓縮的BCD碼相減,并氫結果存放在AL寄存器中。非壓縮的BCD碼調整指令
AAA(ASCII Adjust for Addition) 加法的ASCII調整指令AAA執行操作:執行之前必須先執行ADD或ADC指令,加法指令必須把兩個非壓縮的BCD碼相加,并把結果存話在AL寄存器中。
AAS(ASCII Adjust for Subtraction) 減法的ASCII調整指令AAS執行操作:執行之前必須先執行SUB或SBB指令,減法指令必須把兩個非壓縮的BCD碼相減,并氫結果存放在AL寄存器中。
MOVS( MOVe String) 串傳送指令MOVB //字節串傳送 DF=0,SI = SI + 1,DI = DI + 1 ;DF = 1,SI = SI – 1,DI = DI – 1MOVW //字串傳送 DF=0,SI = SI + 2,DI = DI + 2 ;DF = 1,SI = SI – 2,DI = DI – 2執行操作:[DI] = [SI],將位于DS段的由SI所指出的存儲單元的字節或字傳送到位于ES段的由DI 所指出的存儲單元,再修改SI和DI,從而指向下一個元素。在執行該指令之前,必須預置SI和DI的初值,用STD或CLD設置DF值。MOVS DST,SRC //同上,不常用,DST和SRC只是用來用類型檢查,并不允許使用其它尋址方式來確定操作數。1.目的串必須在附加段中,即必須是ES:[DI]2.源串允許使用段跨越前綴來修飾,但偏移地址必須是[SI].
STOS(STOre into String) 存入串指令STOS DSTSTOSB //存放字節串 ( DI ) = ALSTOSW //存放字串 ( DI ) = AX執行品作:把AL或AX中的內容存放由DI指定的附加段的字節或字單元中,并根據DF值修改及數據類型修改DI的內容。1.在執行該指令之前,必須把要存入的數據預先存入AX或AL中,必須預置DI的初值。2.DI所指向的存儲單元只能在附加段中,即必須是ES:[DI]
LODS ( LOaD from String ) 從串取指令LODS SRCLODSB //從字節串取 AL=(SI)LODSW //從字串取 AX= (SI±1) (SI)執行操作:把由SI指定的數據段中字節或字單元的內容送入AL或AX中,并根據DF值及數據類型修改SI的內容。1.在執行該指令之前,要取的數據必須在存儲器中預先定義(用DB或DW),必須預置SI的初值。2.源串允許使用段超越前綴來改變數據存儲的段區。
REP(REPeat)重復操作前綴REP String Primitive //其中:String Primitive可為MOVS,STOS或LODS指令執行操作:使REP前綴后的串指令重復執行,每執行一次CX=CX-1,直至CX=0時退出REP.方向標志設置
CLD(CLear Direction flag) 清除方向標志指令CLD執行操作:令DF=0,其后[SI],[DI]執行增量操作
STD(SeT Direction flag) 設置方向標志指令STD執行操作:令DF=1,其后[SI],[DI]執行減量操作
CMPS(CoMPare String) 串比較指令CMPS SRC,DSTCMPSB //字節串比較 (SI)-(DI)CMPSW //字串比較 (SI+1)(SI) – (DI+1)(DI)執行操作:把由SI指向的數據段中的一個字節或字與由DI指向的附加段中的一個字節或字相減,不保留結果,只根據結果置標志位。
SCAS (SCAn String ) 串掃描指令SCAS DSTSCASBSCASW執行操作:把AX或AL的內容與由DI指向的在附加段中的一個字節或字相減,不保留結果,根據結果置標志位。
AND,OR,XOR和
TEST都是雙字節操作指令,操作數的尋址方式的規定與算術運算指令相同。
NOT是單字節操作指令,不允許使用立即數。邏輯運算均是按位進行操作,真值表如下:AND (位與&) OR ( 位或| ) XOR ( 位異或^ )1.& 1 = 1 1 | 1 = 1 1 ^ 1 = 01.& 0 = 0 1 | 0 = 1 1 ^ 0 = 10 & 1 = 0 0 | 1 = 1 0 ^ 1 = 10 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0A:邏輯運算指令
AND(and) 邏輯與指令AND DST,SRC //Byte/Word執行操作:dst = dst & src1.AND指令執行后,將使CF=0,OF=0,AF位無定義,指令執行結果影響SF,ZF和PF標志位。2.AND指令典型用法A:用于屏蔽某些位,即使某些位為0.屏蔽AL的高4位:即將高4位和0000B相與,低4位和1111B相與MOV AL,39H //AL= 0011 1001B[39H]ADD AL,0FH // AL= 0000 1001B[09H] 即0011 1001B[39H] & 0000 1111B[0FH] = 0000 1001B[09H]3.AND指令典型用法B:取出某一位的值(見TEST)
OR(or) 邏輯或指令OR DST,SRC //Byte/Word執行操作:dst = dst | src1.OR指令執行后,將使CF=0,OF=0,AF位無定義,指令執行結果影響SF,ZF和PF標志位。2.常用于將某些位置1.將AL的第5位置1:MOV AL,4AH // AL=0100 1010B[4AH]OR AL,10H // AL=0101 1010B[5AH] 即0100 1010B[4AH] | 0001 0000B[10H] =0101 1010B [5AH]
XOR(eXclusive OR) 邏輯異或指令XOR DST,SRC //Byte/Word執行操作:dst = dst ^ src1.XOR指令常用于使某個操作數清零,同時使CF=0,清除進位標志。2.XOR指令使某些位維持不變則與 ‘0’ 相異或,若要使某些位取反則與 ‘1’相異或。將AL的高4位維持不變,低4位取反:MOV AL,B8H //AL=1011 1000B[B8H]XOR AL,0FH //AL=1011 0111B[B7H] 即1011 1000B[B8H] ^ 0000 1111[0FH]=1011 0111B[B7H]測試某一個操作數是否與另一確定操作數相等:XOR AX,042EHJZ …. //如果AX==042EH,則ZF=TRUE(1),執行JZ…
NOT (not) 邏輯非指令NOT OPR //Byte/Word執行操作:opr = ~opr // ~ 01100101 [65H] =10011010 [9AH]1.操作數不能使用立即數或段寄存器操作數,可使用通用寄存器和各種方式尋址的存儲器操作數。2.NOT指令不影響任何標志位。將AL各位取反:MOV AL,65H //AL=0110 0101B[65H]NOT AL //AL=1001 1010B[9AH] 即 ~ 0110 0101B[65H]=1001 1010B[9AH]
TEST(test) 指令TEST OPR1,OPR2 //Byte/Word執行操作:opr1 & opr21.兩個操作數相與的結果不保存,結果影響標志位PF,SF和ZF,使CF=0,OF=0,而AF位無定義。2.TEST指令常用于在不改變原有的操作數的情況下,檢測某一位或某幾位的條件是否滿足。只要令用來測試的操作數對應檢測位為1,其余位為0,相與后判斷零標志ZF值的真假。檢測某位是否為1:令用來測試的操作數對應檢測位為1,其余位為0,TEST指令后,若該位為1則 JNZ…TEST AL,0000 00001B //測試AL最低位是否為1:: 令用來測試的操作數對應檢測位為1,其余位為0,執行TEST指令JNZ THER //最低位若為1,則ZF=FALSE(0),執行JNZ THER,否則執行下一條指令。或者:先對操作數求反,令用來測試的操作數對應檢測位為1,其余位為0,TEST指令后,若該位為1則JZ…MOV DL,AL //將AL 傳送到DL,主要是不要影響AL的值。 以下測試AL的b2位是否為1NOT DL //先對操作數求反TEST 0000 0100B //令用來測試的操作數對應檢測位為1,其余位為0,執行TEST指令JZ THER //若AL的b2位為1,則ZF=TRUE(1),執行JZ THERB:移位指令[所有的移位指令都影響標志位
CF、OF、PF、SF和
ZF、AF無定義。]非循環邏輯移位:把操作數看成無符數來進行移位。
SHL( SHift logical Left )邏輯左移指令SHL OPR,CNT //Byte/Word執行操作:使OPR左移CNT位,并使最低CNT位為全0.1.OPR操作數不能使用立即數或段寄存器操作數,可使用通用寄存器和各種方式尋址的存儲器操作數。2.移位次數由CNT決定。每次將OPR的最高位移出并移到CF,最低位補0.MOV CL,7 //若移位多次,先預置移位次數CLSHL DX,CL //CNT可取1或CL寄存器操作數
SHR(SHift logical Right) 邏輯右移指令SHR OPR,CNT //Byte/Word同SHL,每次將OPR的最低位D0移出并移到CF.最高位補0.非循環算術移位:將操作數看成有符號數來進行移位。
SAL(Shift Arithmetic Left) 算術左移指令SAL OPR,CNT //Byte/WordSAL指令與SHL指令完全相同
SAR(Shift Arithmetic Right) 算術右移指令SAR OPR,CNT //Byte/WordSAR指令每次移位時,將最高位移入次高位的同時最高位值不變,最低位D0移出并移到CF.循環移位指令
ROL( ROtate Left) 循環左移指令ROL OPR,CNT //Byte/Word每次移位時,最高位移出并同時移到CF和最低位D0.
ROR (ROtate Right)循環右移指令ROR OPR,CNT //Byte/Word每次移位時,最低位D0移出并同時移到CF和最高位。帶進位循環移位指令
RCL(Rotate Left through Carry)帶進位循環左移指令RCL OPR,CNT //Byte/Word
RCR (Rotate Right through Carry)帶進位循環右移指令RCR OPR,CNT //Byte/Word處理器控制指令
CLC(CLear Carry) 進位位置0指令CLC //執行操作后,CF=0
CMC(CoMplement Carry) 進位位求反指令CMC //執行操作后,CF=!CF
STC (SeT Carry) 進位位置1指令STC //執行操作后,CF=1
NOP(No Operetion) 無操作指令NOP //此指令不執行任何操作,其機器碼占一個字節單元
HLT (HaLT) 停機指令HLT執行操作后,使機器暫停工作,使處理器CPU處于停機狀態,以等待一次外部中斷到來,中斷結束后,程序繼續執行,CPU繼續工作。
JMP ( JuMP ) 無條件轉移指令名稱 格式 執行操作段內直接短跳轉 JMP SHORT OPR IP=IP+8 位偏移量段內直接近轉移 JMP NEAR PTR OPR IP=IP+16位偏移量段內間接轉移 JMP WORD PTR OPR IP=(EA)段間直接轉移 JMP FAR PTR OPR IP=OPR 偏移地址,CS=OPR 段地址段間間接轉移 JMP DWORD PTR OPR IP=(EA),CS=(EA+2)1.無條件轉移到指定的地址去執行從該地址開始的指令。2.段內轉移是指在同一代碼段的范圍內進行轉移,只需改變IP寄存器內容。3.段間轉移則要轉移到另一個代碼段執行程序,此時要改變IP寄存器和CS段寄存器的內容。條件轉移指令:根據上一條指令所設置的條件碼(標志位)來判斷測試條件。根據五個標志位:ZF、SF、OF、 PF、 CF的兩種狀態(0 FALSE或1 TRUE)產生10種測試條件。Name Flag Flag == TRUE [1] Flag ==FALSE [ 0]Zero Falg ZF
JE/JZOPR //結果為零轉移
JNE/
JNZOPR //結果不為零轉移Sign Falg SF
JSOPR //結果為負轉移
JNSOPR //結果為正轉移Overflow Flag OF
JOOPR //溢出轉移
JNOOPR //不溢出轉移Parity Flag PF
JP/JPEOPR //結果為偶轉移
JNP/JPOOPR //結果為奇轉移Carry Flag CF
JCOPR //有進位轉移
JNCOPR //無進位轉移兩個數比較:情況 指令 滿足條件 指令 滿足條件A < B
JCCF==1
JLSF^OF==1 && ZF==0A ≥ B
JNCCF==0
JNLSF^OF==0 || ZF==1A ≤ B
JNA CF==1 || ZF==1
JLGSF^OF==1 || ZF==1A > B
JA CF==0 && ZF==0
JGSF^OF==0 && ZF==0測試CX轉移指令
JCXZ OPR //CX==0時轉移
LOOP(LOOP)循環指令LOOP OPR 測試條件:CX ≠ 0 //OPR在程序中實際是個標號LOOPZ OPR 測試條件:ZF == 1 && CX ≠ 0LOOPNZ OPR 測試條件:ZF == 0 && CX ≠ 0執行操作: 先執行CX=CX-1,再檢測上面的測試條件,如滿足則IP=IP+符號擴展的D8,不滿足則退出循環。過程調用及返回指令
CALL(CALL) 過程調用指令CALL DST //DST在程序中實際是子程序標號執行操作:先將過程的返回地址(即CALL的下一條指令的首地址)存入堆棧,然后轉移到過程入口地址執行子程序。調用方式 格式 斷點保護入棧情況 過程入口地址段內直接 CALL NEAR PTR PR1 (SP-1)(SP-2)←IP,CS不進棧 CS值保持不變,IP←DST段內間接 CALL WORD PTR (EA) (SP-1)(SP-2)←IP,CS不進棧 CS值保持不變,IP←(EA)段間直接 CALL FAR PTR PR1 (SP-1)(SP-2)←CS,(SP-3)(SP-4)←IP IP←DST偏移地址,CS←DST段地址段間間接 CALL DWORD PTR (EA) (SP-1)(SP-2)←CS,(SP-3)(SP-4)←IP IP←(EA),CS←(EA+2)注:為了表明是段內調用,可使用NEAR PTR屬性操作符作說明。
RET(RETurn)子程序返回指令RETRET EXP //帶立即數返回子程序返回指令RET放在子程序末尾,它使子程序在執行完全部任務后返回主程序繼續執行被打斷后的程序。返回地址在子程序調用時入棧保存的斷點地址-IP或IP和CS.
編輯本段匯編基礎
匯編也可以是一個種類的集合,如英語語法匯編,XX科目匯編……等等`詳細點的指令用法
數據傳送指令
一、數據傳送指令1.通用數據傳送指令MOV(Move)傳送PUSH(Push onto the stack)進棧POP(Pop from the stack)出棧XCHG(Exchange)交換.MOV指令格式為: MOV DST,SRC執行的操作:(DST)<-(SRC).PUSH進棧指令格式為:PUSH SRC執行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(SRC).POP出棧指令格式為:POP DST執行的操作:(DST)<-((SP+1),(SP))(SP)<-(SP)+2.XCHG 交換指令格式為:XCHG OPR1,OPR2執行的操作:(OPR1)<–>(OPR2)2.累加器專用傳送指令IN(Input) 輸入OUT(Output) 輸出XLAT(Translate) 換碼這組指令只限于使用累加器AX或AL傳送信息。.IN 輸入指令長格式為: IN AL,PORT(字節)IN AX,PORT(字)執行的操作: (AL)<-(PORT)(字節)(AX)<-(PORT+1,PORT)(字)短格式為: IN AL,DX(字節)IN AX,DX(字)執行的操作: AL<-((DX))(字節)AX<-((DX)+1,DX)(字).OUT 輸出指令長格式為: OUT PORT,AL(字節)OUT PORT,AX(字)執行的操作: (PORT)<-(AL)(字節)(PORT+1,PORT)<-(AX)(字)短格式為: OUT DX,AL(字節)OUT DX,AX(字)執行的操作: ((DX))<-(AL)(字節)((DX)+1,(DX))<-AX(字)在 IBM-PC機里,外部設備最多可有65536個I/O端口,端口(即外設的端口地址)為0000~FFFFH.其中前256個端口(0~FFH)可以直 接在指令中指定,這就是長格式中的PORT,此時機器指令用二個字節表示,第二個字節就是端口號。所以用長格式時可以在指定中直接指定端口號,但只限于前 256個端口。當端口號>=256時,只能使用短格式,此時,必須先把端口號放到DX寄存器中(端口號可以從0000到0FFFFH),然后再用 IN或OUT指令來 傳送信息。.XLAT 換碼指令格式為: XLAT OPR或: XLAT執行的操作:(AL)<-((BX)+(AL))3.有效地址送寄存器指令LEA(Load effective address)有效地址送寄存器LDS(Load DS with Pointer)指針送寄存器和DSLES(Load ES with Pointer)指針送寄存器和ES.LEA 有效地址送寄存器格式為: LEA REG,SRC執行的操作:(REG)<-SRC指令把源操作數的有效地址送到指定的寄存器中。.LDS 指針送寄存器和DS指令格式為: LDS REG,SRC執行的操作:(REG)<-(SRC)(DS)<-(SRC+2)把源操作數指定的4個相繼字節送到由指令指定的寄存器及DS寄存器中。該指令常指定SI寄存器。.LES 指針送寄存器和ES指令格式為: LES REG,SRC執行的操作: (REG)<-(SRC)(ES)<-(SRC+2)把源操作數指定的4個相繼字節送到由指令指定的寄存器及ES寄存器中。該指令常指定DI寄存器。4.標志寄存器傳送指令LAHF(Load AH with flags)標志送AHSAHF(store AH into flags)AH送標志寄存器PUSHF(push the flags) 標志進棧POPF(pop the flags) 標志出棧.LAHF 標志送AH格式為: LAHF執行的操作:(AH)<-(PWS的低字節).SAHF AH送標志寄存器格式為: SAHF執行的操作:(PWS的低字節)<-(AH).PUSHF 標志進棧格式為: PUSHF執行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW).POPF 標志出棧格式為: POPF執行的操作:(PWS)<-((SP)+1,(SP))(SP)<-(SP+2)
算術指令
二、算術指令1.加法指令ADD(add)加法ADC(add with carry)帶進位加法INC(increment)加1.ADD 加法指令格式: ADD DST,SRC執行的操作:(DST)<-(SRC)+(DST).ADC 帶進位加法指令格式: ADC DST,SRC執行的操作:(DST)<-(SRC)+(DST)+CF.ADD 加1指令格式: INC OPR執行的操作:(OPR)<-(OPR)+12.減法指令SUB(subtract)減法SBB(subtract with borrow)帶借位減法DEC(Decrement)減1NEG(Negate)求補CMP(Compare)比較.SUB 減法指令格式: SUB DST,SRC執行的操作:(DST)<-(DST)-(SRC).SBB 帶借位減法指令格式: SBB DST,SRC執行的操作:(DST)<-(DST)-(SRC)-CF.DEC 減1指令格式: DEC OPR執行的操作:(OPR)<-(OPR)-1.NEG 求補指令格式: NEG OPR執行的操作:(OPR)<- -(OPR).CMP 比較指令格式: CMP OPR1,OPR2執行的操作:(OPR1)-(OPR2)該指令與SUB指令一樣執行減法操作,但不保存結果,只是根據結果設置條件標志
西半球。3.乘法指令MUL(Unsigned Multiple)無符號數乘法IMUL(Signed Multiple)帶符號數乘法.MUL 無符號數乘法指令格式: MUL SRC執行的操作:字節操作數:(AX)<-(AL)*(SRC)字操作數:(DX,AX)<-(AX)*(SRC).IMUL 帶符號數乘法指令格式: IMUL SRC執行的操作:與MUL相同,但必須是帶符號數,而MUL是無符號數。4.除法指令DIV(Unsigned divide)無符號數除法IDIV(Signed divide)帶符號數除法CBW(Convert byte to word)字節轉換為字CWD(Contert word to double word)字轉換為雙字.DIV 無符號數除法指令格式: DIV SRC執行的操作:字節操作:(AL)<-(AX)/(SRC)的商(AH)<-(AX)/(SRC)的余數字操作: (AX)<-(DX,AX)/(SRC)的商(DX)<-(DX,AX)/(SRC)的余數.IDIV 帶符號數除法指令格式: DIV SRC執行的操作:與DIV相同,但操作數必須是帶符號數,商和余數也均為帶符號數,且余數的符號與被除數的符號相同。.CBW 字節轉換為字指令格式: CBW執行的操作:AL的內容符號擴展到AH.即如果(AL)的最高有效位為0,則(AH)=00;如(AL)的最高有效位為1,則(AH)=0FFH.CWD 字轉換為雙字指令格式: CWD執行的操作:AX的內容符號擴展到DX.即如(AX)的最高有效位為0,則(DX)=0;否則(DX)=0FFFFH.這兩條指令都不影響條件碼。
邏輯指令
三、邏輯指令1.邏輯運算指令AND(and) 邏輯與OR(or) 邏輯或NOT(not) 邏輯非XOR(exclusive or)異或TEST(test) 測試.AND 邏輯與指令格式: AND DST,SRC執行的操作:(DST)<-(DST)^(SRC).OR 邏輯或指令格式: OR DST,SRC執行的操作:(DST)<-(DST)V(SRC).NOT 邏輯非指令格式: NOT OPR執行的操作:(OPR)<-(OPR).XOR 異或指令格式: XOR DST,SRC執行的操作:(DST)<-(DST)V(SRC).TEST 測試指令格式: TEST OPR1,OPR2執行的操作:(DST)^(SRC)兩個操作數相與的結果不保存,只根據其特征置條件碼2.移位指令SHL(shift logical left) 邏輯左移SAL(shift arithmetic left) 算術左移SHR(shift logical right) 邏輯右移SAR(shift arithmetic right) 算術右移ROL(Rotate left) 循環左移ROR(Rotate right) 循環右移RCL(Rotate left through carry) 帶進位循環左移RCR(Rotate right through carry) 帶進位循環右移格式: SHL OPR,CNT(其余的類似)其中OPR可以是除立即數以外的任何尋址方式。移位次數由CNT決定,CNT可以是1或CL.循環移位指令可以改變操作數中所有位的位置;移位指令則常常用來做乘以2除以2操作。其中算術移位指令適用于帶符號數運算,SAL用來乘2,SAR用來除以2;而邏輯移位指令則用來無符號數運算,SHL用來乘2,SHR用來除以2.
串處理指令
四、串處理指令1.與REP相配合工作的MOVS,STOS和LODS指令.REP重復串操作直到(CX)=0為上格式: REP string primitive其中String Primitive可為MOVS,LODS或STOS指令執行的操作:1)如(CX)=0則退出REP,否則往下執行。2)(CX)<-(CX)-13)執行其中的串操作4)重復1)~3).MOVS 串傳送指令格式:可有三種MOVS DST,SRCMOVSB(字節)MOVSW(字)其中第二、三種格式明確地注明是傳送字節或字,第一種格式則應在操作數中表明是字還是字節操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]執行的操作:1)((DI))<-((SI))2)字節操作:(SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1當方向標志DF=0時用+,當方向標志DF=1時用-3)字操作:(SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2當方向標志DF=0時用+,當方向標志DF=1時用-該指令不影響條件碼。.CLD(Clear direction flag)該指令使DF=0,在執行串操作指令時可使地址自動增量;.STD(Set direction flag)該指令使DF=1,在執行串操作指令時可使地址自動減量。.STOS 存入串指令格式: STOS DSTSTOSB(字節)STOSW(字)執行的操作:字節操作:((DI))<-(AL),(DI)<-(DI)+-1字操作: ((DI))<-(AX),(DI)<-(DI)+-2該指令把AL或AX的內容存入由(DI)指定的附加段的某單元中,并根據DF的值及數據類型修改DI的內容,當它與REP聯用時,可把AL或AX的內容存入一個長度為(CX)的
緩沖區中。.LODS 從串取指令格式: LODS SRCLODSBLODSW執行的操作:字節操作:(AL)<-((SI)),(SI)<-(SI)+-1字操作: (AX)<-((SI)),(SI)<-(SI)+-2該指令把由(SI)指定的數據段中某單元的內容送到AL或AX中,并根據方向標志及數據類型修改SI的內容。指令允許使用段跨越前綴來指定非數據段的存儲區。該指令也不影響條件碼。一般說來,該指令不和REP聯用。有時緩沖區中的一串字符需要逐次取出來測試時,可使用本指令。2.與REPE/REPZ和REPNZ/REPNE聯合工作的CMPS和SCAS指令.REPE/REPZ 當相等/為零時重復串操作格式: REPE(或REPZ) String Primitive其中String Primitive可為CMPS或SCAS指令。執行的操作:1)如(CX)=0或ZF=0(即某次比較的結果兩個操作數不等)時退出,否則往下執行2)(CX)<-(CX)-13)執行其后的串指令4)重復1)~3).REPNE/REPNZ 當不相等/不為零時重復串操作格式: REPNE(或REPNZ) String Primitive其中String Primitive可為CMPS或SCAS指令執行的操作:除退出條件(CX=0)或ZF=1外,其他操作與REPE完全相同。.CMPS 串比較指令格式: CMP SRC,DSTCMPSBCMPSW執行的操作:1)((SI))-((DI))2)字節操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2指令把由(SI)指向的數據段中的一個字(或字節)與由(DI)指向的附加段中的一個字(或字節)相減,但不保存結果,只根據結果設置條件碼,指令的其它特性和MOVS指令的規定相同。.SCAS 串掃描指令格式: SCAS DSTSCASBSCASW執行的操作:字節操作:(AL)-((DI)),(DI)<-(DI)+-1字操作: (AL)-((DI)),(DI)<-(DI)+-2該指令把AL(或AX)的內容與由(DI)指定的在附加段中的一個字節(或字)進行比較,并不保存結果,只根據結果置條件碼。指令的其他特性和MOVS的規定相同。
控制轉移指令
五、控制轉移指令1.無條件轉移指令.JMP(jmp) 跳轉指令1)段內直接短轉移格式:JMP SHORT OPR執行的操作:(IP)<-(IP)+8位位移量2)段內直接近轉移格式:JMP NEAR PTR OPR執行的操作:(IP)<-(IP)+16位位移量3)段內間接轉移格式:JMP WORD PTR OPR執行的操作:(IP)<-(EA)4)段間直接(遠)轉移格式:JMP FAR PTR OPR執行的操作:(IP)<-OPR的段內偏移地址(CS)<-OPR所在段的段地址5)段間間接轉移格式:JMP DWORD PTR OPR執行的操作:(IP)<-(EA)(CS)<-(EA+2)2.條件轉移指令1)根據單個條件標志的設置情況轉移.JZ(或JE)(Jump if zero,or equal) 結果為零(或相等)則轉移格式:JE(或JZ) OPR測試條件:ZF=1.JNZ(或JNE)(Jump if not zero,or not equal) 結果不為零(或不相等)則轉移格式:JNZ(或JNE) OPR測試條件:ZF=0.JS(Jump if sign) 結果為負則轉移格式: JS OPR測試條件:SF=1.JNS(Jump if not sign) 結果為正則轉移格式:JNS OPR測試條件:SF=0.JO(Jump if overflow) 溢出則轉移格式: JO OPR測試條件:OF=1.JNO(Jump if not overflow) 不溢出則轉移格式: JNO OPR測試條件:OF=0.JP(或JPE)(Jump if parity,or parity even) 奇偶位為1則轉移格式: JP OPR測試條件:PF=1.JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位為0則轉移格式: JNP(或JPO) OPR測試條件:PF=0.JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或進位位為1則轉移格式:JB(或JNAE,JC) OPR測試條件:CF=1.JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或進位位為0則轉移格式:JNB(或JAE,JNC) OPR測試條件:CF=02)比較兩個無符號數,并根據比較的結果轉移.JB(或JNAE,JC)格式:同上.JNB(或JAE,JNC)格式:同上.JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于則轉移格式:JBE(或JNA) OPR測試條件:CFVZF=1.JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于則轉移格式:JNBE(或JA) OPR測試條件:CFVZF=03)比較兩個帶符號數,并根據比較的結果轉移.JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于則轉移格式:JL(或JNGE) OPR測試條件:SFVOF=1.JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于則轉移格式:JNL(或JGE) OPR測試條件:SFVOF=0.JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于則轉移格式:JLE(或JNG) OPR測試條件:(SFVOF)VZF=1.JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于則轉移格式:JNLE(或JG) OPR測試條件:(SFVOF)VZF=04)測試CX的值為0則轉移指令.JCXZ(Jump if CX register is zero) CX寄存器的內容為零則轉移格式:JCXZ OPR測試條件:(CX)=0注:條件轉移全為8位短跳!3.循環指令.LOOP 循環指令格式: LOOP OPR測試條件:(CX)<>0.LOOPZ/LOOPE 當為零或相等時循環指令格式: LOOPZ(或LOOPE) OPR測試條件:(CX)<>0且ZF=1.LOOPNZ/LOOPNE 當不為零或不相等時循環指令格式: LOOPNZ(或LOOPNE) OPR測試條件:(CX)<>0且ZF=0這三條指令的步驟是:1)(CX)<-(CX)-12)檢查是否滿足測試條件,如滿足則(IP)<-(IP)+D8的符號擴充。4.子程序.CALL調用指令.RET返回指令5.中斷.INT指令格式: INT TYPE或 INT執行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2((SP)+1,(SP))<-(CS)(SP)<-(SP)-2((SP)+1,(SP))<-(IP)(IP)<-(TYPE*4)(CS)<-(TYPE*4+2).INTO 若溢出則中斷執行的操作:若OF=1則:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)(SP)<-(SP)-2((SP)+1,(SP))<-(CS)(SP)<-(SP)-2((SP)+1,(SP))<-(IP)(IP)<-(10H)(CS)<-(12H).IRET 從
中斷返回指令格式: IRET執行的操作:(IP)<-((SP)+1,(SP))(SP)<-(SP)+2(CS)<-((SP)+1,(SP))(SP)<-(SP)+2(PSW)<-((SP)+1,(SP))(SP)<-(SP)+2
處理機控制指令
六、處理機控制指令1.標志處理指令.CLC進位位置0指令(Clear carry)CF<-0.CMC進位位求反指令(Complement carry)CF<-CF.STC進位位置1指令(Set carry)CF<-1.CLD方向標志置0指令(Clear direction)DF<-0.STD方向標志置1指令(Set direction)DF<-1.CLI中斷標志置0指令(Clear interrupt)IF<-0.STI中斷標志置1指令(Set interrupt)IF<-02.其他處理機控制指令NOP(No Opreation) 無操作HLT(Halt) 停機WAIT(Wait) 等待ESC(Escape) 換碼LOCK(Lock) 封鎖這些指令可以控制處理機狀態。這們都不影響條件碼。.NOP 無操作指令該指令不執行任何操作,其機器碼占有一個字節,在調試程序時往往用這條指令占有一定的存儲單元,以便在正式運行時用其他指令取代。.HLT停機指令該指令可使機器暫停工作,使處理機處于停機狀態以便等待一次外部中斷到來,中斷結束后可繼續執行下面的程序。.WAIT等待指令該指令使處理機處于空轉狀態,它也可以用來等待外部中斷的發生,但中斷結束后仍返回WAIT指令繼續執行。.ESC換碼指令格式ESC mem其 中mem指出一個存儲單元,ESC指令把該存儲單元的內容送到數據總線去。當然ESC指令不允許使用立即數和寄存器尋址方式。這條指令在使用協處理機 (Coprocessor)執行某些操作時,可從存儲器指得指令或操作數。協處理機(如8087)則是為了提高速度而可以選配的硬件。.LOCK封鎖指令該指令是一種前綴,它可與其他指令聯合,用來維持總線的鎖存信號直到與其聯合的指令執行完為止。當CPU與其他處理機協同工作時,該指令可避免破壞有用信息。
轉載于:https://www.cnblogs.com/hxwzwiy/archive/2012/03/27/2419120.html
總結
- 上一篇: SAP Fiori应用里日期格式的显示奥
- 下一篇: SAP Fiori internatio