匯編語言(Assembly Language)是面向機器的程序設計語言。
匯編語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。這樣用符號代替機器語言的二進制碼,就把機器語言變成了匯編語言。于是匯編語言亦稱為符號語言。
用匯編語言編寫的程序,機器不能直接識別,要由一種程序將匯編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統軟件中語言處理的系統軟件。匯編程序把匯編語言翻譯成機器語言的過程稱為匯編。
匯編語言比機器語言易于讀寫、易于調試和修改,同時也具有機器語言執行速度快,占內存空間少等優點,但在編寫復雜程序時具有明顯的局限性,匯編語言依賴于具體的機型,不能通用,也不能在不同機型之間移植。
是能完成一定任務的機器指令的集合。
常說匯編語言過時,是低級語言,并不是說匯編語言要被棄之,相反,匯編語言仍然是程序員必須了解的語言,在某些行業與領域,匯編是必不可少的,非它不可適用。只是,現在計算機最大的領域為IT軟件,也是我們常說的 Windows 編程,在熟練的程序員手里,使用匯編語言編寫的程序,運行效率與性能比其它語言寫的程序是成倍的優秀,但是代價是需要更長的時間來優化,如果對計算機原理及編程基礎不扎實,實在是得不償失,對比現在的軟件開發,已經是市場化的軟件行業,加上高級語言的優秀與跨平臺,一個公司不可以讓一個團隊使用匯編語言來編寫所有的東西,花上幾倍甚至幾十倍的時間,不如使用其它語言來完成,只要最終結果不比匯編語言編寫的差太多,就能搶先一步完成,這是市場經濟下的必然結果。
但是,至今為止,還沒有程序員敢斷定匯編語言是不需要學的,一個不懂匯編語言的程序員,只是三流的程序員,這是大部分人的共識,同時,技術精湛的匯編程序員,已經脫離軟件開發,擠身于工業電子編程中,一個電子工程師,主要開發語言就是匯編,c語言使用只占極少部分,而電子開發工程師是千金難求,在一些工業公司,一個核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程序員的十倍以上。這種情況是因為現在學習匯編的人雖然也不少,但是真正能學到精通的卻不多,它難學,難用,適用范圍小,雖然簡單,但是過于靈活,學習過高級語言的人去學習匯編比一開始學匯編的人難得多,但是學過匯編的人學習高級語言卻很容易,簡從繁易,繁從簡難。
總之,匯編語言是程序員的必修語言。
經典教材 在計算機之中,教材沒有經典,只有合適。所以一份關于匯編的“經典教材”是沒有的!
經典教材首推王爽的《匯編語言》。這是一個非常經典的入門書,適合初學者,學習起來就像看小說一樣輕松。關鍵是動手實踐的內容很多,在學習第二章后就可以調試一些指令。
匯編的調試環境總的來說比較少,也很少有非常好的編譯器。reallychenchi設計的輕松匯編是一款非常適合初學者的匯編編譯器。輕松匯編是一個匯編語言集成開發環境,主要面向匯編語言初學者,也可以用它進行開發。除了普通的編輯功能以外,它還可以自動整理格式、高亮顯示和編譯、鏈接、調試匯編程序,非常方便實用。
輕松匯編的最大特點是可以格式整理,就像VC6.0一樣,可以設置斷點調試,省卻了使用者的不少工作。它可以在Win98/2k/XP下運行,是一款很優秀的軟件。
MOV 指令為雙操作數指令,兩個操作數中必須有一個是寄存器.
MOV DST , SRC // Byte / Word
執行操作: dst = src
1.目的數可以是通用寄存器, 存儲單元和段寄存器(但不允許用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=Tmp
1.必須有一個操作數是在寄存器中
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_ONE
MOV 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通過累加器傳送到CPU
IN AL , PORT //直接的字節輸入,PORT是外設端口編號(即端口地址),只能取 00H ~ 0FFH共256個端口地址.
IN AX , PORT //直接的字輸入,AX存儲連續兩個端口地址PORT+1,PORT
IN AL , DX //間接的字節輸入,端口地址范圍可通過DX設置為0000H ~ 0FFFFH共65536個端口地址
IN AX , DX //間接的字輸入
OUT( OUTput)輸出指令 :信息從CPU通過累加器傳送到I/O
OUT PORT , AL //直接的字節輸出,PORT規定與IN指令相同.
OUT PORT , AX
OUT DX , AL //間接的字節輸出
OUT DX , AX
MOV AL,05H OUT 27H, AL //將字節05H傳送到地址27H的端口
ADD(ADD)加法指令
ADD DST , SRC //Byte/Word
執行操作: dst=dst+src
1.兩個存儲器操作數不能通過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=1
SF 根據結果的最高位來設置:最高位為0, 則SF=0.
AF 根據相加時D3是否向D4進(借)位來設置:有進(借)位時AF=1, 無進(借)位時AF=0
PF 根據結果的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+1
1.OPR可以是寄存器和存儲器操作數, 但不能是立即數和段寄存器
2.影響標志位OF,SF,ZF,PF 和AF,不影響CF.
SUB ( SUBtract ) 不帶借位的減法指令
SUB DST , SRC //Byte/Word
執行操作:dst=dst - src
1.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=1
A>B CF=0 && ZF=0 SF^OF=0 && ZF=0
A
A>=B CF=0 || ZF=1 SF^OF=0 || ZF=1
A<=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 - 1
MOVW //字串傳送 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 DST
STOSB //存放字節串 ( DI ) = AL
STOSW //存放字串 ( DI ) = AX
執行品作:把AL或AX中的內容存放由DI指定的附加段的字節或字單元中,并根據DF值修改及數據類型修改DI的內容.
1.在執行該指令之前,必須把要存入的數據預先存入AX或AL中,必須預置DI的初值.
2.DI所指向的存儲單元只能在附加段中,即必須是ES:[DI]
LODS ( LOaD from String ) 從串取指令
LODS SRC
LODSB //從字節串取 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 , DST
CMPSB //字節串比較 (SI)-(DI)
CMPSW //字串比較 (SI+1)(SI) - (DI+1)(DI)
執行操作:把由SI指向的數據段中的一個字節或字與由DI指向的附加段中的一個字節或字相減,不保留結果,只根據結果置標志位.
SCAS (SCAn String ) 串掃描指令
SCAS DST
SCASB
SCASW
執行操作:把AX或AL的內容與由DI指向的在附加段中的一個字節或字相減,不保留結果,根據結果置標志位.
AND, OR , XOR 和 TEST都是雙字節操作指令,操作數的尋址方式的規定與算術運算指令相同.
NOT是單字節操作指令,不允許使用立即數.
邏輯運算均是按位進行操作,真值表如下:
AND (位與&) OR ( 位或| ) XOR ( 位異或^ )
1 & 1 = 1 1 | 1 = 1 1 ^ 1 = 0
1 & 0 = 0 1 | 0 = 1 1 ^ 0 = 1
0 & 1 = 0 0 | 1 = 1 0 ^ 1 = 1
0 & 0 = 0 0 | 0 = 0 0 ^ 0 = 0
A:邏輯運算指令
AND (and) 邏輯與指令
AND DST , 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相與
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 | src
1.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 ^ src
1.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 , 042EH
JZ .... //如果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 & opr2
1.兩個操作數相與的結果不保存,結果影響標志位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位是否為1
NOT DL //先對操作數求反
TEST 0000 0100B //令用來測試的操作數對應檢測位為1,其余位為0,執行TEST指令
JZ THER //若AL的b2位為1,則ZF=TRUE(1), 執行JZ THER
B:移位指令[所有的移位指令都影響標志位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 //若移位多次, 先預置移位次數CL
SHL 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/Word
SAL指令與SHL指令完全相同
SAR(Shift Arithmetic Right) 算術右移指令
SAR OPR , CNT //Byte/Word
SAR指令每次移位時,將最高位移入次高位的同時最高位值不變,最低位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/JZ OPR //結果為零轉移 JNE/JNZ OPR //結果不為零轉移
Sign Falg SF JS OPR //結果為負轉移 JNS OPR //結果為正轉移
Overflow Flag OF JO OPR //溢出轉移 JNO OPR //不溢出轉移
Parity Flag PF JP/JPE OPR //結果為偶轉移 JNP/JPO OPR //結果為奇轉移
Carry Flag CF JC OPR //有進位轉移 JNC OPR //無進位轉移
兩個數比較:
情況 指令 滿足條件 指令 滿足條件
A < B JC CF==1 JL SF^OF==1 && ZF==0
A ≥ B JNC CF==0 JNL SF^OF==0 || ZF==1
A ≤ B JNA CF==1 || ZF==1 JLG SF^OF==1 || ZF==1
A > B JA CF==0 && ZF==0 JG SF^OF==0 && ZF==0
測試CX轉移指令
JCXZ OPR //CX==0時轉移
LOOP(LOOP)循環指令
LOOP OPR 測試條件:CX ≠ 0 //OPR在程序中實際是個標號
LOOPZ OPR 測試條件:ZF == 1 && CX ≠ 0
LOOPNZ 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)子程序返回指令
RET
RET 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)指針送寄存器和DS LES(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)標志送AH SAHF(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)+1 2.減法指令 SUB(subtract)減法 SBB(subtract with borrow)帶借位減法 DEC(Decrement)減1 NEG(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)的商 (AX)<-(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)-1 3)執行其中的串操作 4)重復1)~3) .MOVS 串傳送指令 格式:可有三種 MOVS DST,SRC MOVSB(字節) 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 DST STOSB(字節) STOSW(字) 執行的操作: 字節操作:((DI))<-(AL),(DI)<-(DI)+-1 字操作: ((DI))<-(AX),(DI)<-(DI)+-2 該指令把AL或AX的內容存入由(DI)指定的附加段的某單元中,并根據DF的值及數據類型修改DI的內容,當它與REP聯用時,可把AL或AX的內容存入一個長度為(CX)的緩沖區中. .LODS 從串取指令 格式: LODS SRC LODSB LODSW 執行的操作: 字節操作:(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)-1 3)執行其后的串指令 4)重復1)~3) .REPNE/REPNZ 當不相等/不為零時重復串操作 格式: REPNE(或REPNZ) String Primitive 其中String Primitive可為CMPS或SCAS指令 執行的操作: 除退出條件(CX=0)或ZF=1外,其他操作與REPE完全相同. .CMPS 串比較指令 格式: CMP SRC,DST CMPSB CMPSW 執行的操作: 1)((SI))-((DI)) 2)字節操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1 字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2 指令把由(SI)指向的數據段中的一個字(或字節)與由(DI)指向的附加段中的一個字(或字節)相減,但不保存結果,只根據結果設置條件碼,指令的其它特性和MOVS指令的規定相同. .SCAS 串掃描指令 格式: SCAS DST SCASB SCASW 執行的操作: 字節操作:(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=0 2)比較兩個無符號數,并根據比較的結果轉移 .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=0 3)比較兩個帶符號數,并根據比較的結果轉移 .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=0 4)測試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)-1 2)檢查是否滿足測試條件,如滿足則(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<-0 2.其他處理機控制指令 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與其他處理機協同工作時,該指令可避免破壞有用信息.
- 匯編語言(35148)
相關推薦
匯編語言的結構化設計及其在俄羅斯方塊中的應用
為了簡化匯編語言的編寫過程,本文提出了一種結構化的匯編編程思路,并以基于AT89C51芯片(以下對匯編語言的討論針對51單片機系統)的俄羅斯方塊游戲為例,來展現在51單片機中匯編語言結構化編寫的優勢。##俄羅斯方塊的軟件實現方法##實驗測試與結果
2014-06-23 10:27:47
2713


8051匯編語言程序設計舉例
成就更好的自己目錄3.8 8051匯編語言程序設計舉例3.8.1 子程序的設計3.8.2 查表程序設計3.8.3 分支轉移程序設計3.8.4 循環程序設計3.8 8051匯編語言程序設計舉例 介紹
2021-12-01 08:23:13
匯編語言實驗
;nbsp; 匯編語言程序結構………………………….8實驗三 DOS和BIOS中斷功能調用………………….12實驗四 &
2008-09-29 13:56:53
匯編語言的特點有哪些
第5章單片機C語言及匯編語言混合編程05第5章單片機C語言與匯編語言混合編程 §5-1混合編程概述 匯編語言特點: 優點:執行速度快、效率高、實時性強、與硬件結合緊密。 缺點:編程難度大、可讀性差
2021-07-15 08:04:29
ARM匯編語言入門
本指南介紹了使用A64指令集的Arm匯編語言的基本概念,向您展示了如何使用Arm Development Studio創建和運行匯編代碼,并提供了匯編代碼示例供您進行實驗。
匯編語言是一種低級編程
2023-08-08 07:28:42
C語言與匯編語言怎樣才能更好地結合
在單片機學習的過程中,掌握一點匯編語言是非常有必有的,作為低級語言匯編語言在單片機開發中有它不可取代的作用,比如每條指令可以精確的確定延時時間,便于理解非常適合硬件工程師學習。但是要提高單片機技能
2021-07-20 06:56:36
c語言匯編語言和機器語言的轉化
匯編語言經過匯編程序可以翻譯成及期望語言,C語言是不是必須先轉換為匯編語言,然后才能生成機器語言?還是C語言可以直接經過編譯就可以生成機器語言?我所查找的資料都是說C語言經過編譯后生成.obj的目標文件,也就是機器語言,望各位大師給小弟詳解一下,小弟不剩感激。
2015-04-14 16:53:27
什么是匯編語言
基于C++寶典的學習一、什么是匯編語言匯編語言是一種功能很強的程序設計語言,也是利用了計算機所有硬件特性并能直接控制硬件的語言。在匯編語言中,用助記符(Memoni)代替操作碼,用地址符號
2021-07-19 06:05:14
什么是匯編語言
文章目錄前言一、 匯編語言簡介1.1 什么是匯編語言1.2機器語言簡介1.3 匯編語言的演變史1.4 匯編語言的廣義組成二、硬件與軟件2.1 思考2.2 計算機的硬件構成(1)存儲器(2)控制器(3
2022-02-24 07:01:46
使用匯編語言的地方有哪些
對資深單片機開發人員來說經常提倡的一個開發技巧是,開發人員應避免使用匯編語言。避免使用匯編語言的原因是它特定于所使用的處理器體系結構,難以閱讀,理解和維護。而且需要注意的是,在查看仍可以使用匯編語言
2021-12-01 06:33:06
如何才能有針性的學習匯編語言
本人是測控專業的,以后想在嵌入式方面發展,想學習一下匯編語言,但是不知道學習那種 我發現有 專門的 匯編語言程序設計還有基于ARM體系的匯編語言還有linux匯編Inter匯編太多了如果想學習咋選擇 是不是計算機專業的 匯編語言設計 把其他包括 或者大同小異
2016-08-01 00:23:34
請問自學匯編語言匯編語言需要什么?
學過C語言和Java 學過51單片機, 現在想學習ARM 匯編語言 嵌入式系統Linux 這幾個 有什么相關的視頻或者書籍用來自學
2020-07-26 08:03:32
匯編語言程序設計pdf
匯編語言程序設計的內容:每種高級語言程序在連接為可執行程序之前,都必須被編譯為匯編語言程序,因此對于高級語言程序設計者來說,了解編譯器如何生成匯編語言代碼十
2008-10-21 17:38:55
0

匯編語言程序設計下載
professional assembly language 匯編語言程序設計本書分為三部分。第一部分講解匯編語言程序設計環境基礎,第二部分研究匯編語言程序設計,最后一部分講解高級匯編語言技術。本書
2008-10-21 17:42:05
0

32位匯編語言程序設計
Windows環境下32位匯編語言是一種全新的編程語言。它使用與C++語言相同的API接口,不僅可以用來開發出大型的軟件,而且是了解操作系統運行細節的最佳方式。
本書從編寫應用
2008-10-21 17:53:18
0

匯編語言編程藝術(PDF)
匯編語言編程藝術從簡單的Hello程序開始,系統而詳細地闡述了X86微機匯編語言編程的行種基礎知識和編程技巧,內容涉及到數據表示、存儲器管理、各種數據類型、過程、與匯編
2008-10-21 18:04:07
0

宏匯編語言程序設計(PDF)
宏匯編語言程序設計介紹了IBM PC微型計算機,基本匯編語言,順序、分支與循環程序設計,子程序設計,數值運算程序設計,非數值運算程序設計等內容。自學與提高的捷徑 高
2008-10-21 18:06:26
0

匯編語言靜態分析工具設計與應用
本文針對當前匯編語言的測試工具較少這一實際情況,針對某種匯編語言語法結構特 點,確定了匯編語言靜態分析工具的總體結構框架,并對工具實現過程中重點的功能模塊算法, 進行
2009-06-19 11:52:17
26

匯編語言源代碼分析
匯編語言源代碼分析
查看源代碼將發現它由4 4個文件組成,其中:• 兩個是匯編語言文件,它們的名字帶后綴“ . s”;• 28個是用“C”語言編寫的,它們的名
2010-02-09 16:18:21
26

DSP匯編語言編程基礎
DSP匯編語言編程基礎
一、 實驗目的 1、了解 DSP 的尋址方式; 2、了解 DSP 的匯編語言與 C語言混合編程。 二、 實驗器材 1、安裝有 CCS的 PC
2010-02-11 09:41:07
205

匯編語言自學教程
匯編語言自學教程
匯編語言(AssemblyLanguage)是面向機器的程序設計語言。在匯編語合中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址碼。
2010-03-15 14:24:53
509

Linux中的匯編語言
在閱讀Linux源代碼時,你可能碰到一些匯編語言片段,有些匯編語言出現在以.S為擴展名的匯編文件中,在這種文件中,整個程序全部由匯編語言組成。有些匯編命令出現在以.c為擴展名
2011-04-07 20:43:23
55

Assemble匯編語言設計技術
匯編語言 設計程序,是所有程序語言的基本資源。我們不管你使用除匯編語言或指令代碼以外的程序語言編程,僅僅是編程表達、編程規則和變成環境的變化,但是這些變化都是基于匯
2011-07-07 15:47:46
0

匯編語言學習課件_匯編語言程序組織
第四章 匯編語言程序組織
4.1 匯編語言語句格式
4.2 匯編語言源程序結構
4.3 常用偽指令
4.4 匯編語言操作符
4.5 匯編語言程序上機過程
4.6 調用ROM BIOS或DOS中斷實現數據的輸入輸出
4.7 簡化段定義
2015-12-31 10:41:02
0

匯編語言學習課件_匯編語言高級編程技巧
第八章 匯編語言高級編程技巧
8.1 模塊化程序設計
8.2 匯編語言程序與高級語言程序的連接
8.3 使用DOS EXEC功能執行程序
8.4 TSR程序設計
2015-12-31 10:41:14
0

Linux 匯編語言開發指南詳解
匯編語言的優點是速度快,可以直接對硬件進行操作,這對諸如圖形處理等關鍵應用是非常重要的。Linux 是一個用 C 語言開發的操作系統,這使得很多程序員開始忘記在 Linux 中還可以直接使用匯編這一
2017-11-02 10:51:48
0

C語言與匯編語言相互結合的嵌套匯編語言
要提高單片機技能,必須掌握C 語言編程,因為C 語言有強大的模塊化管理思想。我想在很多人學習的過程中即學了匯編語言,又學習了C 語言,那么一個問題便隨之而產生,如果將C 語言與匯編語言相互結合,達到更好的編程效果,本次講解就是基于這個問題而生成的。
2018-03-14 18:23:00
3245


高級語言和匯編語言_機器語言的區別
本文首先介紹了高級語言的優缺點、匯編語言的優缺點及使用匯編語言的理由,其次介紹了機器語言的優缺點,最后闡述了高級語言和匯編語言、機器語言的區別是什么。
2018-04-16 10:28:04
29298

CPU如何執行代碼 匯編語言教程
的是低級語言,它專門用來控制硬件。匯編語言就是低級語言,直接描述/控制 CPU 的運行。如果你想了解 CPU 到底干了些什么,以及代碼的運行步驟,就一定要學習匯編語言。 匯編語言不容易學習,就連簡明扼要的介紹都很難找到。下面
2021-08-25 11:14:10
3263


MCS-51單片機匯編語言程序設計
文章目錄前言一、匯編的方法1.手工匯編:2.機器匯編:二、偽指令一、匯編語言指令類型二.偽指令 常用偽指令及功能三、匯編語言程序設計步驟四、常用的順序結構1、 順序程序設計2 、 分支程序的設計總結
2021-11-05 12:21:04
28

Stm32單片機開發KEIL啟動文件匯編語言詳解
文章目錄簡介 啟動文件匯編代碼相關指令 堆棧空間的定義 初始化中斷向量表 復位中斷函數 中斷函數的弱(WEAK)聲明 用戶棧和堆初始化簡介我們在做單片機編程的時候,大部分都是用KEIL自帶的啟動文件
2021-11-13 15:21:03
12

【匯編】AT89C52點亮一盞LED燈(匯編語言)
學習利用匯編語言寫單片機程序的第一步是要學習匯編語言的相關理論知識,那么實踐操作的第一步肯定是從點燈開始啦!編譯環境:keil4編譯語言:匯編語言內容:??一、keil4建立AT89C52的工程環境
2021-11-22 20:51:03
18

匯編語言學習
寄存器 一個cpu有多個寄存器 就是cpu中可以存儲數據的器件,一個cpu中有多個寄存器匯編語言由一下3類組成 1、匯編指令(機器碼的助記符) 2、偽指令(由編譯器執行
2021-11-23 18:06:24
14

[從零學習匯編語言] - 計算機中的硬件與軟件
文章目錄前言一、 匯編語言簡介1.1 什么是匯編語言1.2 機器語言簡介1.3 匯編語言的演變史1.4 匯編語言的廣義組成二、硬件與軟件2.1 思考2.2 計算機的硬件構成(1)存儲器(2)控制器
2021-12-31 19:55:11
10

單片機匯編語言的結構/數據類型/匯編指令
開發匯編語言是為了為機器級代碼指令提供助記符或符號,匯編語言程序由助記符組成,因此應將它們翻譯成機器代碼。負責這種轉換的程序稱為匯編程序。匯編語言通常被稱為低級語言,因為它直接與 CPU 的內部結構一起工作。要用匯編語言編程,程序員必須知道 CPU 的所有寄存器。
2023-07-07 12:28:40
1824

評論