匯編語言詳解
匯編語言(Assembly Language)是面向機(jī)器的程序設(shè)計(jì)語言。
匯編語言中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標(biāo)號(Label)代替地址碼。這樣用符號代替機(jī)器語言的二進(jìn)制碼,就把機(jī)器語言變成了匯編語言。于是匯編語言亦稱為符號語言。
用匯編語言編寫的程序,機(jī)器不能直接識別,要由一種程序?qū)R編語言翻譯成機(jī)器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統(tǒng)軟件中語言處理的系統(tǒng)軟件。匯編程序把匯編語言翻譯成機(jī)器語言的過程稱為匯編。
匯編語言比機(jī)器語言易于讀寫、易于調(diào)試和修改,同時(shí)也具有機(jī)器語言執(zhí)行速度快,占內(nèi)存空間少等優(yōu)點(diǎn),但在編寫復(fù)雜程序時(shí)具有明顯的局限性,匯編語言依賴于具體的機(jī)型,不能通用,也不能在不同機(jī)型之間移植。
是能完成一定任務(wù)的機(jī)器指令的集合。
常說匯編語言過時(shí),是低級語言,并不是說匯編語言要被棄之,相反,匯編語言仍然是程序員必須了解的語言,在某些行業(yè)與領(lǐng)域,匯編是必不可少的,非它不可適用。只是,現(xiàn)在計(jì)算機(jī)最大的領(lǐng)域?yàn)镮T軟件,也是我們常說的 Windows 編程,在熟練的程序員手里,使用匯編語言編寫的程序,運(yùn)行效率與性能比其它語言寫的程序是成倍的優(yōu)秀,但是代價(jià)是需要更長的時(shí)間來優(yōu)化,如果對計(jì)算機(jī)原理及編程基礎(chǔ)不扎實(shí),實(shí)在是得不償失,對比現(xiàn)在的軟件開發(fā),已經(jīng)是市場化的軟件行業(yè),加上高級語言的優(yōu)秀與跨平臺,一個(gè)公司不可以讓一個(gè)團(tuán)隊(duì)使用匯編語言來編寫所有的東西,花上幾倍甚至幾十倍的時(shí)間,不如使用其它語言來完成,只要最終結(jié)果不比匯編語言編寫的差太多,就能搶先一步完成,這是市場經(jīng)濟(jì)下的必然結(jié)果。
但是,至今為止,還沒有程序員敢斷定匯編語言是不需要學(xué)的,一個(gè)不懂匯編語言的程序員,只是三流的程序員,這是大部分人的共識,同時(shí),技術(shù)精湛的匯編程序員,已經(jīng)脫離軟件開發(fā),擠身于工業(yè)電子編程中,一個(gè)電子工程師,主要開發(fā)語言就是匯編,c語言使用只占極少部分,而電子開發(fā)工程師是千金難求,在一些工業(yè)公司,一個(gè)核心的電子工程師比其它任何職員待遇都高,對比起來,一般電子工程師待遇是程序員的十倍以上。這種情況是因?yàn)楝F(xiàn)在學(xué)習(xí)匯編的人雖然也不少,但是真正能學(xué)到精通的卻不多,它難學(xué),難用,適用范圍小,雖然簡單,但是過于靈活,學(xué)習(xí)過高級語言的人去學(xué)習(xí)匯編比一開始學(xué)匯編的人難得多,但是學(xué)過匯編的人學(xué)習(xí)高級語言卻很容易,簡從繁易,繁從簡難。
總之,匯編語言是程序員的必修語言。
經(jīng)典教材 在計(jì)算機(jī)之中,教材沒有經(jīng)典,只有合適。所以一份關(guān)于匯編的“經(jīng)典教材”是沒有的!
經(jīng)典教材首推王爽的《匯編語言》。這是一個(gè)非常經(jīng)典的入門書,適合初學(xué)者,學(xué)習(xí)起來就像看小說一樣輕松。關(guān)鍵是動手實(shí)踐的內(nèi)容很多,在學(xué)習(xí)第二章后就可以調(diào)試一些指令。
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 ) 無符號數(shù)乘法指令
MUL SRC //Byte/Word .
執(zhí)行操作:Byte => AX= AL *src //字節(jié)運(yùn)算時(shí)目的操作數(shù)用AL, 乘積放在AX中
Word => DX=AX *src //字運(yùn)算時(shí)目的操作數(shù)用AX, DX存放乘積的高位字, AX放乘積的低位字
1.目的數(shù)必須是累加器 AX 或AL,指令中不需寫出
2. 源操作數(shù)SRC可以是通用寄存器和各種尋址方式的存儲器操作數(shù), 而絕對不允許是立即數(shù)或段寄存器.
IMUL (sIgned MULtiple) 有符號數(shù)乘法指令
IMUL SRC //與MUL指令相同,但必須是帶符號數(shù)
DIV ( unsigned DIVide) 無符號數(shù)除法指令
DIV SRC //Byte/Word 其中: SRC的規(guī)定同乘法指令MUL
執(zhí)行操作:Byte => AX / src //字節(jié)運(yùn)算時(shí)目的操作數(shù)在AX中,結(jié)果的商在AL中 ,余數(shù)中AH中
Word=> DX,AX /src //字運(yùn)算時(shí)目的操作數(shù)在DX高位字和AX低位字中,結(jié)果的商在AX中 ,余數(shù)在DX中
存儲器操作數(shù)必須指明數(shù)據(jù)類型:BYTE PTR src 或 WORD PTR src
IDIV (sIgned DIVied) 有符號數(shù)除法指令
IDIV SRC //Byte/Word 與DIV指令相同,但必須是帶符號數(shù)
CBW (Convert Byte to Word) 字節(jié)轉(zhuǎn)換為字指令
CBW
執(zhí)行操作: AL中的符號位(D7)擴(kuò)展到8位AH中,若AL中的D7=0,則AH=00H,若AL中的D7=1,則AH=FFH.
CWD (Convert Word to Double word) 字轉(zhuǎn)換為雙字指令
CWD
執(zhí)行操作: AX中的符號位(D15)擴(kuò)展到16位DX中,若AX中的D15=0,則DX=0000H,若AX中的D15=1,則DX=FFFFH
十進(jìn)制調(diào)整指令
當(dāng)計(jì)算機(jī)進(jìn)行計(jì)算時(shí),必須先把十進(jìn)制數(shù)轉(zhuǎn)換為二進(jìn)制數(shù),再進(jìn)行二進(jìn)制數(shù)運(yùn)算,最后將結(jié)果又轉(zhuǎn)換為十進(jìn)制數(shù)輸出.
在計(jì)算機(jī)中,可用4位二進(jìn)制數(shù)表示一位十進(jìn)制數(shù),這種代碼稱為BCD ( Binary Coded Decimal ).
BCD碼又稱8421碼,在PC機(jī)中,BCD碼可用壓縮的BCD碼和非壓縮的BCD碼兩種格式表示.
壓縮的BCD碼用4位二進(jìn)制數(shù)表示一個(gè)十制數(shù),整個(gè)十進(jìn)數(shù)形式為一個(gè)順序的以4位為一組的數(shù)串.
非壓縮的BCD碼以8位為一組表示一個(gè)十進(jìn)制數(shù),8位中的低4位表示8421的BCD碼,而高4位則沒有意義.
壓縮的BCD碼調(diào)整指令
DAA (Decimal Adjust for Addition) 加法的十進(jìn)制調(diào)整指令
DAA
執(zhí)行操作:執(zhí)行之前必須先執(zhí)行ADD或ADC指令,加法指令必須把兩個(gè)壓縮的BCD碼相加,并把結(jié)果存話在AL寄存器中.
DAS (Decimal Adjust for Subtraction) 減法的十進(jìn)制調(diào)整指令
DAS
執(zhí)行操作:執(zhí)行之前必須先執(zhí)行SUB或SBB指令,減法指令必須把兩個(gè)壓縮的BCD碼相減,并氫結(jié)果存放在AL寄存器中.
非壓縮的BCD碼調(diào)整指令
AAA (ASCII Adjust for Addition) 加法的ASCII調(diào)整指令
AAA
執(zhí)行操作:執(zhí)行之前必須先執(zhí)行ADD或ADC指令,加法指令必須把兩個(gè)非壓縮的BCD碼相加,并把結(jié)果存話在AL寄存器中.
AAS (ASCII Adjust for Subtraction) 減法的ASCII調(diào)整指令
AAS
執(zhí)行操作:執(zhí)行之前必須先執(zhí)行SUB或SBB指令,減法指令必須把兩個(gè)非壓縮的BCD碼相減,并氫結(jié)果存放在AL寄存器中.
MOVS ( MOVe String) 串傳送指令
MOVB //字節(jié)串傳送 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
執(zhí)行操作:[DI] = [SI] ,將位于DS段的由SI所指出的存儲單元的字節(jié)或字傳送到位于ES段的由DI 所指出的存儲單元,再修改SI和DI, 從而指向下一個(gè)元素.
在執(zhí)行該指令之前,必須預(yù)置SI和DI的初值,用STD或CLD設(shè)置DF值.
MOVS DST , SRC //同上,不常用,DST和SRC只是用來用類型檢查,并不允許使用其它尋址方式來確定操作數(shù).
1.目的串必須在附加段中,即必須是ES:[DI]
2.源串允許使用段跨越前綴來修飾,但偏移地址必須是[SI].
STOS (STOre into String) 存入串指令
STOS DST
STOSB //存放字節(jié)串 ( DI ) = AL
STOSW //存放字串 ( DI ) = AX
執(zhí)行品作:把AL或AX中的內(nèi)容存放由DI指定的附加段的字節(jié)或字單元中,并根據(jù)DF值修改及數(shù)據(jù)類型修改DI的內(nèi)容.
1.在執(zhí)行該指令之前,必須把要存入的數(shù)據(jù)預(yù)先存入AX或AL中,必須預(yù)置DI的初值.
2.DI所指向的存儲單元只能在附加段中,即必須是ES:[DI]
LODS ( LOaD from String ) 從串取指令
LODS SRC
LODSB //從字節(jié)串取 AL=(SI)
LODSW //從字串取 AX= (SI±1) (SI)
執(zhí)行操作:把由SI指定的數(shù)據(jù)段中字節(jié)或字單元的內(nèi)容送入AL或AX中,并根據(jù)DF值及數(shù)據(jù)類型修改SI的內(nèi)容.
1.在執(zhí)行該指令之前,要取的數(shù)據(jù)必須在存儲器中預(yù)先定義(用DB或DW),必須預(yù)置SI的初值.
2.源串允許使用段超越前綴來改變數(shù)據(jù)存儲的段區(qū).
REP (REPeat)重復(fù)操作前綴
REP String Primitive //其中:String Primitive可為MOVS,STOS或LODS指令
執(zhí)行操作:使REP前綴后的串指令重復(fù)執(zhí)行,每執(zhí)行一次CX=CX-1,直至CX=0時(shí)退出REP.
方向標(biāo)志設(shè)置
CLD (CLear Direction flag) 清除方向標(biāo)志指令
CLD
執(zhí)行操作:令DF=0, 其后[SI],[DI]執(zhí)行增量操作
STD (SeT Direction flag) 設(shè)置方向標(biāo)志指令
STD
執(zhí)行操作:令DF=1, 其后[SI],[DI]執(zhí)行減量操作
CMPS (CoMPare String) 串比較指令
CMPS SRC , DST
CMPSB //字節(jié)串比較 (SI)-(DI)
CMPSW //字串比較 (SI+1)(SI) - (DI+1)(DI)
執(zhí)行操作:把由SI指向的數(shù)據(jù)段中的一個(gè)字節(jié)或字與由DI指向的附加段中的一個(gè)字節(jié)或字相減,不保留結(jié)果,只根據(jù)結(jié)果置標(biāo)志位.
SCAS (SCAn String ) 串掃描指令
SCAS DST
SCASB
SCASW
執(zhí)行操作:把AX或AL的內(nèi)容與由DI指向的在附加段中的一個(gè)字節(jié)或字相減,不保留結(jié)果,根據(jù)結(jié)果置標(biāo)志位.
AND, OR , XOR 和 TEST都是雙字節(jié)操作指令,操作數(shù)的尋址方式的規(guī)定與算術(shù)運(yùn)算指令相同.
NOT是單字節(jié)操作指令,不允許使用立即數(shù).
邏輯運(yùn)算均是按位進(jìn)行操作,真值表如下:
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:邏輯運(yùn)算指令
AND (and) 邏輯與指令
AND DST , SRC //Byte/Word
執(zhí)行操作:dst = dst & src
1.AND指令執(zhí)行后,將使CF=0,OF=0,AF位無定義,指令執(zhí)行結(jié)果影響SF,ZF和PF標(biāo)志位.
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
執(zhí)行操作:dst = dst | src
1.OR指令執(zhí)行后,將使CF=0, OF=0, AF位無定義,指令執(zhí)行結(jié)果影響SF, ZF和PF標(biāo)志位.
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
執(zhí)行操作:dst = dst ^ src
1.XOR指令常用于使某個(gè)操作數(shù)清零,同時(shí)使CF=0,清除進(jìn)位標(biāo)志.
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]
測試某一個(gè)操作數(shù)是否與另一確定操作數(shù)相等:
XOR AX , 042EH
JZ .... //如果AX==042EH, 則ZF=TRUE(1), 執(zhí)行JZ...
NOT (not) 邏輯非指令
NOT OPR //Byte/Word
執(zhí)行操作:opr = ~opr // ~ 01100101 [65H] =10011010 [9AH]
1.操作數(shù)不能使用立即數(shù)或段寄存器操作數(shù),可使用通用寄存器和各種方式尋址的存儲器操作數(shù).
2.NOT指令不影響任何標(biāo)志位。
將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
執(zhí)行操作:opr1 & opr2
1.兩個(gè)操作數(shù)相與的結(jié)果不保存,結(jié)果影響標(biāo)志位PF,SF和ZF,使CF=0, OF=0,而AF位無定義.
2.TEST指令常用于在不改變原有的操作數(shù)的情況下,檢測某一位或某幾位的條件是否滿足.只要令用來測試的操作數(shù)對應(yīng)檢測位為1,其余位為0,相與后判斷零標(biāo)志ZF值的真假.
檢測某位是否為1:
令用來測試的操作數(shù)對應(yīng)檢測位為1,其余位為0,TEST指令后,若該位為1則 JNZ...
TEST AL , 0000 00001B //測試AL最低位是否為1:: 令用來測試的操作數(shù)對應(yīng)檢測位為1,其余位為0,執(zhí)行TEST指令
JNZ THER //最低位若為1, 則ZF=FALSE(0), 執(zhí)行JNZ THER, 否則執(zhí)行下一條指令.
或者:先對操作數(shù)求反,令用來測試的操作數(shù)對應(yīng)檢測位為1,其余位為0,TEST指令后,若該位為1則JZ...
MOV DL , AL //將AL 傳送到DL,主要是不要影響AL的值. 以下測試AL的b2位是否為1
NOT DL //先對操作數(shù)求反
TEST 0000 0100B //令用來測試的操作數(shù)對應(yīng)檢測位為1,其余位為0,執(zhí)行TEST指令
JZ THER //若AL的b2位為1,則ZF=TRUE(1), 執(zhí)行JZ THER
B:移位指令[所有的移位指令都影響標(biāo)志位CF、OF、PF、SF和ZF.AF無定義.]
非循環(huán)邏輯移位:把操作數(shù)看成無符數(shù)來進(jìn)行移位.
SHL ( SHift logical Left )邏輯左移指令
SHL OPR , CNT //Byte/Word
執(zhí)行操作:使OPR左移CNT位,并使最低CNT位為全0.
1.OPR操作數(shù)不能使用立即數(shù)或段寄存器操作數(shù),可使用通用寄存器和各種方式尋址的存儲器操作數(shù).
2.移位次數(shù)由CNT決定.每次將OPR的最高位移出并移到CF,最低位補(bǔ)0.
MOV CL , 7 //若移位多次, 先預(yù)置移位次數(shù)CL
SHL DX , CL //CNT可取1或CL寄存器操作數(shù)
SHR (SHift logical Right) 邏輯右移指令
SHR OPR , CNT //Byte/Word
同SHL,每次將OPR的最低位D0移出并移到CF.最高位補(bǔ)0.
非循環(huán)算術(shù)移位:將操作數(shù)看成有符號數(shù)來進(jìn)行移位.
SAL (Shift Arithmetic Left) 算術(shù)左移指令
SAL OPR , CNT //Byte/Word
SAL指令與SHL指令完全相同
SAR(Shift Arithmetic Right) 算術(shù)右移指令
SAR OPR , CNT //Byte/Word
SAR指令每次移位時(shí),將最高位移入次高位的同時(shí)最高位值不變,最低位D0移出并移到CF.
循環(huán)移位指令
ROL ( ROtate Left) 循環(huán)左移指令
ROL OPR , CNT //Byte/Word
每次移位時(shí),最高位移出并同時(shí)移到CF和最低位D0.
ROR (ROtate Right)循環(huán)右移指令
ROR OPR,CNT //Byte/Word
每次移位時(shí),最低位D0移出并同時(shí)移到CF和最高位.
帶進(jìn)位循環(huán)移位指令
RCL (Rotate Left through Carry)帶進(jìn)位循環(huán)左移指令
RCL OPR,CNT //Byte/Word
RCR (Rotate Right through Carry)帶進(jìn)位循環(huán)右移指令
RCR OPR ,CNT //Byte/Word
處理器控制指令
CLC (CLear Carry) 進(jìn)位位置0指令
CLC //執(zhí)行操作后,CF=0
CMC (CoMplement Carry) 進(jìn)位位求反指令
CMC //執(zhí)行操作后,CF=!CF
STC (SeT Carry) 進(jìn)位位置1指令
STC //執(zhí)行操作后,CF=1
NOP (No Operetion) 無操作指令
NOP //此指令不執(zhí)行任何操作,其機(jī)器碼占一個(gè)字節(jié)單元
HLT (HaLT) 停機(jī)指令
HLT
執(zhí)行操作后,使機(jī)器暫停工作,使處理器CPU處于停機(jī)狀態(tài),以等待一次外部中斷到來,中斷結(jié)束后,程序繼續(xù)執(zhí)行,CPU繼續(xù)工作.
JMP ( JuMP ) 無條件轉(zhuǎn)移指令
名稱 格式 執(zhí)行操作
段內(nèi)直接短跳轉(zhuǎn) JMP SHORT OPR IP=IP+8 位偏移量
段內(nèi)直接近轉(zhuǎn)移 JMP NEAR PTR OPR IP=IP+16位偏移量
段內(nèi)間接轉(zhuǎn)移 JMP WORD PTR OPR IP=(EA)
段間直接轉(zhuǎn)移 JMP FAR PTR OPR IP=OPR 偏移地址, CS=OPR 段地址
段間間接轉(zhuǎn)移 JMP DWORD PTR OPR IP=(EA),CS=(EA+2)
1.無條件轉(zhuǎn)移到指定的地址去執(zhí)行從該地址開始的指令.
2.段內(nèi)轉(zhuǎn)移是指在同一代碼段的范圍內(nèi)進(jìn)行轉(zhuǎn)移,只需改變IP寄存器內(nèi)容.
3.段間轉(zhuǎn)移則要轉(zhuǎn)移到另一個(gè)代碼段執(zhí)行程序,此時(shí)要改變IP寄存器和CS段寄存器的內(nèi)容.
條件轉(zhuǎn)移指令:根據(jù)上一條指令所設(shè)置的條件碼(標(biāo)志位)來判斷測試條件.
根據(jù)五個(gè)標(biāo)志位:ZF、SF、OF、 PF、 CF的兩種狀態(tài)(0 FALSE或1 TRUE)產(chǎn)生10種測試條件.
Name Flag Flag == TRUE [1] Flag ==FALSE [ 0]
Zero Falg ZF JE/JZ OPR //結(jié)果為零轉(zhuǎn)移 JNE/JNZ OPR //結(jié)果不為零轉(zhuǎn)移
Sign Falg SF JS OPR //結(jié)果為負(fù)轉(zhuǎn)移 JNS OPR //結(jié)果為正轉(zhuǎn)移
Overflow Flag OF JO OPR //溢出轉(zhuǎn)移 JNO OPR //不溢出轉(zhuǎn)移
Parity Flag PF JP/JPE OPR //結(jié)果為偶轉(zhuǎn)移 JNP/JPO OPR //結(jié)果為奇轉(zhuǎn)移
Carry Flag CF JC OPR //有進(jìn)位轉(zhuǎn)移 JNC OPR //無進(jìn)位轉(zhuǎn)移
兩個(gè)數(shù)比較:
情況 指令 滿足條件 指令 滿足條件
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轉(zhuǎn)移指令
JCXZ OPR //CX==0時(shí)轉(zhuǎn)移
LOOP(LOOP)循環(huán)指令
LOOP OPR 測試條件:CX ≠ 0 //OPR在程序中實(shí)際是個(gè)標(biāo)號
LOOPZ OPR 測試條件:ZF == 1 && CX ≠ 0
LOOPNZ OPR 測試條件:ZF == 0 && CX ≠ 0
執(zhí)行操作: 先執(zhí)行CX=CX-1,再檢測上面的測試條件,如滿足則IP=IP+符號擴(kuò)展的D8,不滿足則退出循環(huán).
過程調(diào)用及返回指令
CALL (CALL) 過程調(diào)用指令
CALL DST //DST在程序中實(shí)際是子程序標(biāo)號
執(zhí)行操作:先將過程的返回地址(即CALL的下一條指令的首地址)存入堆棧,然后轉(zhuǎn)移到過程入口地址執(zhí)行子程序.
調(diào)用方式 格式 斷點(diǎn)保護(hù)入棧情況 過程入口地址
段內(nèi)直接 CALL NEAR PTR PR1 (SP-1)(SP-2)←IP , CS不進(jìn)棧 CS值保持不變,IP←DST
段內(nèi)間接 CALL WORD PTR (EA) (SP-1)(SP-2)←IP , CS不進(jìn)棧 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)
注:為了表明是段內(nèi)調(diào)用,可使用NEAR PTR屬性操作符作說明.
RET(RETurn)子程序返回指令
RET
RET EXP //帶立即數(shù)返回
子程序返回指令RET放在子程序末尾,它使子程序在執(zhí)行完全部任務(wù)后返回主程序繼續(xù)執(zhí)行被打斷后的程序.返回地址在子程序調(diào)用時(shí)入棧保存的斷點(diǎn)地址-IP或IP和CS.
匯編的調(diào)試環(huán)境總的來說比較少,也很少有非常好的編譯器。reallychenchi設(shè)計(jì)的輕松匯編是一款非常適合初學(xué)者的匯編編譯器。輕松匯編是一個(gè)匯編語言集成開發(fā)環(huán)境,主要面向匯編語言初學(xué)者,也可以用它進(jìn)行開發(fā)。除了普通的編輯功能以外,它還可以自動整理格式、高亮顯示和編譯、鏈接、調(diào)試匯編程序,非常方便實(shí)用。 輕松匯編的最大特點(diǎn)是可以格式整理,就像VC6.0一樣,可以設(shè)置斷點(diǎn)調(diào)試,省卻了使用者的不少工作。它可以在Win98/2k/XP下運(yùn)行,是一款很優(yōu)秀的軟件。
MOV 指令為雙操作數(shù)指令,兩個(gè)操作數(shù)中必須有一個(gè)是寄存器. MOV DST , SRC // Byte / Word 執(zhí)行操作: dst = src 1.目的數(shù)可以是通用寄存器, 存儲單元和段寄存器(但不允許用CS段寄存器). 2.立即數(shù)不能直接送段寄存器 3.不允許在兩個(gè)存儲單元直接傳送數(shù)據(jù) 4.不允許在兩個(gè)段寄存器間直接傳送信息 PUSH 入棧指令及POP出棧指令: 堆棧操作是以"后進(jìn)先出"的方式進(jìn)行數(shù)據(jù)操作. PUSH SRC //Word 入棧的操作數(shù)除不允許用立即數(shù)外,可以為通用寄存器,段寄存器(全部)和存儲器. 入棧時(shí)高位字節(jié)先入棧,低位字節(jié)后入棧. POP DST //Word 出棧操作數(shù)除不允許用立即數(shù)和CS段寄存器外, 可以為通用寄存器,段寄存器和存儲器. 執(zhí)行POP SS指令后,堆棧區(qū)在存儲區(qū)的位置要改變. 執(zhí)行POP SP 指令后,棧頂?shù)奈恢靡淖? XCHG(eXCHanG)交換指令: 將兩操作數(shù)值交換. XCHG OPR1, OPR2 //Byte/Word 執(zhí)行操作: Tmp=OPR1 OPR1=OPR2 OPR2=Tmp 1.必須有一個(gè)操作數(shù)是在寄存器中 2.不能與段寄存器交換數(shù)據(jù) 3.存儲器與存儲器之間不能交換數(shù)據(jù). XLAT(TRANSLATE)換碼指令: 把一種代碼轉(zhuǎn)換為另一種代碼. XLAT (OPR 可選) //Byte 執(zhí)行操作: AL=(BX+AL) 指令執(zhí)行時(shí)只使用預(yù)先已存入BX中的表格首地址,執(zhí)行后,AL中內(nèi)容則是所要轉(zhuǎn)換的代碼. LEA(Load Effective Address) 有效地址傳送寄存器指令 LEA REG , SRC //指令把源操作數(shù)SRC的有效地址送到指定的寄存器中. 執(zhí)行操作: REG = EAsrc 注: SRC只能是各種尋址方式的存儲器操作數(shù),REG只能是16位寄存器 MOV BX , OFFSET OPER_ONE 等價(jià)于 LEA BX , OPER_ONE MOV SP , [BX] //將BX間接尋址的相繼的二個(gè)存儲單元的內(nèi)容送入SP中 LEA SP , [BX] //將BX的內(nèi)容作為存儲器有效地址送入SP中 LDS(Load DS with pointer)指針?biāo)图拇嫫骱虳S指令 LDS REG , SRC //常指定SI寄存器。 執(zhí)行操作: REG=(SRC), DS=(SRC+2) //將SRC指出的前二個(gè)存儲單元的內(nèi)容送入指令中指定的寄存器中,后二個(gè)存儲單元送入DS段寄存器中。 LES (Load ES with pointer) 指針?biāo)图拇嫫骱虴S指令 LES REG , SRC //常指定DI寄存器 執(zhí)行操作: REG=(SRC) , ES=(SRC+2) //與LDS大致相同,不同之處是將ES代替DS而已. LAHF ( Load AH with Flags ) 標(biāo)志位送AH指令 LAHF //將PSW寄存器中的低8位的狀態(tài)標(biāo)志(條件碼)送入AH的相應(yīng)位, SF送D7位, ZF送D6位...... 執(zhí)行操作: AH=PSW的低位字節(jié)。 SAHF ( Store AH into Flags ) AH送標(biāo)志寄存器指令 SAHF //將AH寄存器的相應(yīng)位送到PSW寄存器的低8位的相應(yīng)位, AH的D7位送SF, D6位送ZF...... 執(zhí)行操作: PSW的低位字節(jié)=AH。 PUSHF ( PUSH the Flags) 標(biāo)志進(jìn)棧指令 PUSHF //將標(biāo)志寄存器的值壓入堆棧頂部, 同時(shí)棧指針SP值減2 執(zhí)行操作: SP=SP-1,(SP)=PSW的高8位, SP=SP-1, (SP)=PSW的低8位 POPF ( POP the Flags ) 標(biāo)志出棧指令 POPF //與PUSHF相反, 從堆棧的頂部彈出兩個(gè)字節(jié)送到PSW寄存器中, 同時(shí)堆棧指針值加2 執(zhí)行操作: PSW低8位=(SP), SP=SP+1, PSW高8位=(SP) , SP=SP+1 輸入輸出指令(IN,OUT):只限于使用累加器AX或AL與外部設(shè)備的端口傳送信息. IN (INput)輸入指令:信息從I/O通過累加器傳送到CPU IN AL , PORT //直接的字節(jié)輸入,PORT是外設(shè)端口編號(即端口地址),只能取 00H ~ 0FFH共256個(gè)端口地址. IN AX , PORT //直接的字輸入,AX存儲連續(xù)兩個(gè)端口地址PORT+1,PORT IN AL , DX //間接的字節(jié)輸入,端口地址范圍可通過DX設(shè)置為0000H ~ 0FFFFH共65536個(gè)端口地址 IN AX , DX //間接的字輸入 OUT( OUTput)輸出指令 :信息從CPU通過累加器傳送到I/O OUT PORT , AL //直接的字節(jié)輸出,PORT規(guī)定與IN指令相同. OUT PORT , AX OUT DX , AL //間接的字節(jié)輸出 OUT DX , AX MOV AL,05H OUT 27H, AL //將字節(jié)05H傳送到地址27H的端口 ADD(ADD)加法指令 ADD DST , SRC //Byte/Word 執(zhí)行操作: dst=dst+src 1.兩個(gè)存儲器操作數(shù)不能通過ADD指令直接相加, 即DST 和SRC必須有一個(gè)是通用寄存器操作數(shù). 2.段寄存器不能作為SRC 和DST. 3.影響標(biāo)志位Auxiliary Crray Flag ,Carry Flag, Overflow Flag, Parity Flag, Sign Flag 和Zero Flag ,如下所示: CF 根據(jù)最高有效位是否有進(jìn)(借)位設(shè)置的:有進(jìn)(借)位時(shí)CF=1, 無進(jìn)(借)位時(shí)CF=0. OF 根據(jù)操作數(shù)的符號及其變化來設(shè)置的:若兩個(gè)操作數(shù)的符號相同,而結(jié)果的符號與之相反時(shí)OF=1, 否則為0. ZF 根據(jù)結(jié)果來設(shè)置:不等于0時(shí)ZF=0, 等于0時(shí)ZF=1 SF 根據(jù)結(jié)果的最高位來設(shè)置:最高位為0, 則SF=0. AF 根據(jù)相加時(shí)D3是否向D4進(jìn)(借)位來設(shè)置:有進(jìn)(借)位時(shí)AF=1, 無進(jìn)(借)位時(shí)AF=0 PF 根據(jù)結(jié)果的1的個(gè)數(shù)時(shí)否為奇數(shù)來設(shè)置:1的個(gè)數(shù)為奇數(shù)時(shí)PF=0, 為偶數(shù)時(shí)PF=1 ADC( ADd with Carry)帶進(jìn)位加法指令 ADC DST , SRC //Byte/Word 執(zhí)行操作: dst=dst+src+CF //與ADD不同之處是還要加上進(jìn)位標(biāo)志位的值. INC ( INCrement) 加1指令 INC OPR //Byte/Word 執(zhí)行操作: OPR=OPR+1 1.OPR可以是寄存器和存儲器操作數(shù), 但不能是立即數(shù)和段寄存器 2.影響標(biāo)志位OF,SF,ZF,PF 和AF,不影響CF. SUB ( SUBtract ) 不帶借位的減法指令 SUB DST , SRC //Byte/Word 執(zhí)行操作:dst=dst - src 1.DST和SRC尋址方式及規(guī)定與ADD相同. 2.影響全部標(biāo)志位.(判斷標(biāo)志位參見ADD) SBB ( SuBtract with Borrow) 帶借位減法指令 SBB DST , SRC //Byte/Word 執(zhí)行操作:dst= dst - src - CF DEC ( DECrement ) 減1指令 DEC OPR //Byte/Word 執(zhí)行操作:OPR = OPR - 1 //除CF標(biāo)志位, 其余標(biāo)志位都受影響. NEG ( NEGate ) 求補(bǔ)指令 NEG OPR 執(zhí)行操作:opr = 0- opr //將操作數(shù)按位求反后末位加1. CMP ( CoMPare ) 比較指令 CMP OPR1 , OPR2 執(zhí)行操作:OPR1 - OPR2 //與SUB指令一樣執(zhí)行運(yùn)算, 但不保存結(jié)果. 比較情況 無符號數(shù) 有符號數(shù) A=B ZF=1 ZF=1 A>B CF=0 && ZF=0 SF^OF=0 && ZF=0 A
匯編也可以是一個(gè)種類的集合,如英語語法匯編,XX科目匯編……等等` 詳細(xì)點(diǎn)的指令用法 一、數(shù)據(jù)傳送指令 1.通用數(shù)據(jù)傳送指令 MOV(Move)傳送 PUSH(Push onto the stack)進(jìn)棧 POP(Pop from the stack)出棧 XCHG(Exchange)交換 .MOV指令 格式為: MOV DST,SRC 執(zhí)行的操作:(DST)<-(SRC) .PUSH進(jìn)棧指令 格式為:PUSH SRC 執(zhí)行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(SRC) .POP出棧指令 格式為:POP DST 執(zhí)行的操作:(DST)<-((SP+1),(SP)) (SP)<-(SP)+2 .XCHG 交換指令 格式為:XCHG OPR1,OPR2 執(zhí)行的操作:(OPR1)<-->(OPR2) 2.累加器專用傳送指令 IN(Input) 輸入 OUT(Output) 輸出 XLAT(Translate) 換碼 這組指令只限于使用累加器AX或AL傳送信息. .IN 輸入指令 長格式為: IN AL,PORT(字節(jié)) IN AX,PORT(字) 執(zhí)行的操作: (AL)<-(PORT)(字節(jié)) (AX)<-(PORT+1,PORT)(字) 短格式為: IN AL,DX(字節(jié)) IN AX,DX(字) 執(zhí)行的操作: AL<-((DX))(字節(jié)) AX<-((DX)+1,DX)(字) .OUT 輸出指令 長格式為: OUT PORT,AL(字節(jié)) OUT PORT,AX(字) 執(zhí)行的操作: (PORT)<-(AL)(字節(jié)) (PORT+1,PORT)<-(AX)(字) 短格式為: OUT DX,AL(字節(jié)) OUT DX,AX(字) 執(zhí)行的操作: ((DX))<-(AL)(字節(jié)) ((DX)+1,(DX))<-AX(字) 在IBM-PC機(jī)里,外部設(shè)備最多可有65536個(gè)I/O端口,端口(即外設(shè)的端口地址)為0000~FFFFH.其中前256個(gè)端口(0~FFH)可以直接在指令中指定,這就是長格式中的PORT,此時(shí)機(jī)器指令用二個(gè)字節(jié)表示,第二個(gè)字節(jié)就是端口號.所以用長格式時(shí)可以在指定中直接指定端口號,但只限于前256個(gè)端口.當(dāng)端口號>=256時(shí),只能使用短格式,此時(shí),必須先把端口號放到DX寄存器中(端口號可以從0000到0FFFFH),然后再用IN或OUT指令來 傳送信息. .XLAT 換碼指令 格式為: XLAT OPR 或: XLAT 執(zhí)行的操作:(AL)<-((BX)+(AL)) 3.有效地址送寄存器指令 LEA(Load effective address)有效地址送寄存器 LDS(Load DS with Pointer)指針?biāo)图拇嫫骱虳S LES(Load ES with Pointer)指針?biāo)图拇嫫骱虴S .LEA 有效地址送寄存器 格式為: LEA REG,SRC 執(zhí)行的操作:(REG)<-SRC 指令把源操作數(shù)的有效地址送到指定的寄存器中. .LDS 指針?biāo)图拇嫫骱虳S指令 格式為: LDS REG,SRC 執(zhí)行的操作:(REG)<-(SRC) (DS)<-(SRC+2) 把源操作數(shù)指定的4個(gè)相繼字節(jié)送到由指令指定的寄存器及DS寄存器中.該指令常指定SI寄存器. .LES 指針?biāo)图拇嫫骱虴S指令 格式為: LES REG,SRC 執(zhí)行的操作: (REG)<-(SRC) (ES)<-(SRC+2) 把源操作數(shù)指定的4個(gè)相繼字節(jié)送到由指令指定的寄存器及ES寄存器中.該指令常指定DI寄存器. 4.標(biāo)志寄存器傳送指令 LAHF(Load AH with flags)標(biāo)志送AH SAHF(store AH into flags)AH送標(biāo)志寄存器 PUSHF(push the flags) 標(biāo)志進(jìn)棧 POPF(pop the flags) 標(biāo)志出棧 .LAHF 標(biāo)志送AH 格式為: LAHF 執(zhí)行的操作:(AH)<-(PWS的低字節(jié)) .SAHF AH送標(biāo)志寄存器 格式為: SAHF 執(zhí)行的操作:(PWS的低字節(jié))<-(AH) .PUSHF 標(biāo)志進(jìn)棧 格式為: PUSHF 執(zhí)行的操作:(SP)<-(SP)-2 ((SP)+1,(SP))<-(PSW) .POPF 標(biāo)志出棧 格式為: POPF 執(zhí)行的操作:(PWS)<-((SP)+1,(SP)) (SP)<-(SP+2) 二、算術(shù)指令 1.加法指令 ADD(add)加法 ADC(add with carry)帶進(jìn)位加法 INC(increment)加1 .ADD 加法指令 格式: ADD DST,SRC 執(zhí)行的操作:(DST)<-(SRC)+(DST) .ADC 帶進(jìn)位加法指令 格式: ADC DST,SRC 執(zhí)行的操作:(DST)<-(SRC)+(DST)+CF .ADD 加1指令 格式: INC OPR 執(zhí)行的操作:(OPR)<-(OPR)+1 2.減法指令 SUB(subtract)減法 SBB(subtract with borrow)帶借位減法 DEC(Decrement)減1 NEG(Negate)求補(bǔ) CMP(Compare)比較 .SUB 減法指令 格式: SUB DST,SRC 執(zhí)行的操作:(DST)<-(DST)-(SRC) .SBB 帶借位減法指令 格式: SBB DST,SRC 執(zhí)行的操作:(DST)<-(DST)-(SRC)-CF .DEC 減1指令 格式: DEC OPR 執(zhí)行的操作:(OPR)<-(OPR)-1 .NEG 求補(bǔ)指令 格式: NEG OPR 執(zhí)行的操作:(OPR)<- -(OPR) .CMP 比較指令 格式: CMP OPR1,OPR2 執(zhí)行的操作:(OPR1)-(OPR2) 該指令與SUB指令一樣執(zhí)行減法操作,但不保存結(jié)果,只是根據(jù)結(jié)果設(shè)置條件標(biāo)志西半球. 3.乘法指令 MUL(Unsigned Multiple)無符號數(shù)乘法 IMUL(Signed Multiple)帶符號數(shù)乘法 .MUL 無符號數(shù)乘法指令 格式: MUL SRC 執(zhí)行的操作: 字節(jié)操作數(shù):(AX)<-(AL)*(SRC) 字操作數(shù):(DX,AX)<-(AX)*(SRC) .IMUL 帶符號數(shù)乘法指令 格式: IMUL SRC 執(zhí)行的操作:與MUL相同,但必須是帶符號數(shù),而MUL是無符號數(shù). 4.除法指令 DIV(Unsigned divide)無符號數(shù)除法 IDIV(Signed divide)帶符號數(shù)除法 CBW(Convert byte to word)字節(jié)轉(zhuǎn)換為字 CWD(Contert word to double word)字轉(zhuǎn)換為雙字 .DIV 無符號數(shù)除法指令 格式: DIV SRC 執(zhí)行的操作: 字節(jié)操作:(AL)<-(AX)/(SRC)的商 (AH)<-(AX)/(SRC)的余數(shù) 字操作: (AX)<-(DX,AX)/(SRC)的商 (AX)<-(DX,AX)/(SRC)的余數(shù) .IDIV 帶符號數(shù)除法指令 格式: DIV SRC 執(zhí)行的操作:與DIV相同,但操作數(shù)必須是帶符號數(shù),商和余數(shù)也均為帶符號數(shù),且余數(shù)的符號與被除數(shù)的符號相同. .CBW 字節(jié)轉(zhuǎn)換為字指令 格式: CBW 執(zhí)行的操作:AL的內(nèi)容符號擴(kuò)展到AH.即如果(AL)的最高有效位為0,則(AH)=00;如(AL)的最高有效位為1,則(AH)=0FFH .CWD 字轉(zhuǎn)換為雙字指令 格式: CWD 執(zhí)行的操作:AX的內(nèi)容符號擴(kuò)展到DX.即如(AX)的最高有效位為0,則(DX)=0;否則(DX)=0FFFFH. 這兩條指令都不影響條件碼. 三、邏輯指令 1.邏輯運(yùn)算指令 AND(and) 邏輯與 OR(or) 邏輯或 NOT(not) 邏輯非 XOR(exclusive or)異或 TEST(test) 測試 .AND 邏輯與指令 格式: AND DST,SRC 執(zhí)行的操作:(DST)<-(DST)^(SRC) .OR 邏輯或指令 格式: OR DST,SRC 執(zhí)行的操作:(DST)<-(DST)V(SRC) .NOT 邏輯非指令 格式: NOT OPR 執(zhí)行的操作:(OPR)<-(OPR) .XOR 異或指令 格式: XOR DST,SRC 執(zhí)行的操作:(DST)<-(DST)V(SRC) .TEST 測試指令 格式: TEST OPR1,OPR2 執(zhí)行的操作:(DST)^(SRC) 兩個(gè)操作數(shù)相與的結(jié)果不保存,只根據(jù)其特征置條件碼 2.移位指令 SHL(shift logical left) 邏輯左移 SAL(shift arithmetic left) 算術(shù)左移 SHR(shift logical right) 邏輯右移 SAR(shift arithmetic right) 算術(shù)右移 ROL(Rotate left) 循環(huán)左移 ROR(Rotate right) 循環(huán)右移 RCL(Rotate left through carry) 帶進(jìn)位循環(huán)左移 RCR(Rotate right through carry) 帶進(jìn)位循環(huán)右移 格式: SHL OPR,CNT(其余的類似) 其中OPR可以是除立即數(shù)以外的任何尋址方式.移位次數(shù)由CNT決定,CNT可以是1或CL. 循環(huán)移位指令可以改變操作數(shù)中所有位的位置;移位指令則常常用來做乘以2除以2操作.其中算術(shù)移位指令適用于帶符號數(shù)運(yùn)算,SAL用來乘2,SAR用來除以2;而邏輯移位指令則用來無符號數(shù)運(yùn)算,SHL用來乘2,SHR用來除以2. 四、串處理指令 1.與REP相配合工作的MOVS,STOS和LODS指令 .REP重復(fù)串操作直到(CX)=0為上 格式: REP string primitive 其中String Primitive可為MOVS,LODS或STOS指令 執(zhí)行的操作: 1)如(CX)=0則退出REP,否則往下執(zhí)行. 2)(CX)<-(CX)-1 3)執(zhí)行其中的串操作 4)重復(fù)1)~3) .MOVS 串傳送指令 格式:可有三種 MOVS DST,SRC MOVSB(字節(jié)) MOVSW(字) 其中第二、三種格式明確地注明是傳送字節(jié)或字,第一種格式則應(yīng)在操作數(shù)中表明是字還是字節(jié)操作,例如: MOVS ES:BYTE PTR[DI],DS:[SI] 執(zhí)行的操作: 1)((DI))<-((SI)) 2)字節(jié)操作: (SI)<-(SI)+(或-)1,(DI)<-(DI)+(或-)1 當(dāng)方向標(biāo)志DF=0時(shí)用+,當(dāng)方向標(biāo)志DF=1時(shí)用- 3)字操作: (SI)<-(SI)+(或-)2,(DI)<-(DI)+(或-)2 當(dāng)方向標(biāo)志DF=0時(shí)用+,當(dāng)方向標(biāo)志DF=1時(shí)用- 該指令不影響條件碼. .CLD(Clear direction flag)該指令使DF=0,在執(zhí)行串操作指令時(shí)可使地址自動增量; .STD(Set direction flag)該指令使DF=1,在執(zhí)行串操作指令時(shí)可使地址自動減量. .STOS 存入串指令 格式: STOS DST STOSB(字節(jié)) STOSW(字) 執(zhí)行的操作: 字節(jié)操作:((DI))<-(AL),(DI)<-(DI)+-1 字操作: ((DI))<-(AX),(DI)<-(DI)+-2 該指令把AL或AX的內(nèi)容存入由(DI)指定的附加段的某單元中,并根據(jù)DF的值及數(shù)據(jù)類型修改DI的內(nèi)容,當(dāng)它與REP聯(lián)用時(shí),可把AL或AX的內(nèi)容存入一個(gè)長度為(CX)的緩沖區(qū)中. .LODS 從串取指令 格式: LODS SRC LODSB LODSW 執(zhí)行的操作: 字節(jié)操作:(AL)<-((SI)),(SI)<-(SI)+-1 字操作: (AX)<-((SI)),(SI)<-(SI)+-2 該指令把由(SI)指定的數(shù)據(jù)段中某單元的內(nèi)容送到AL或AX中,并根據(jù)方向標(biāo)志及數(shù)據(jù)類型修改SI的內(nèi)容.指令允許使用段跨越前綴來指定非數(shù)據(jù)段的存儲區(qū).該指令也不影響條件碼. 一般說來,該指令不和REP聯(lián)用.有時(shí)緩沖區(qū)中的一串字符需要逐次取出來測試時(shí),可使用本指令. 2.與REPE/REPZ和REPNZ/REPNE聯(lián)合工作的CMPS和SCAS指令 .REPE/REPZ 當(dāng)相等/為零時(shí)重復(fù)串操作 格式: REPE(或REPZ) String Primitive 其中String Primitive可為CMPS或SCAS指令. 執(zhí)行的操作: 1)如(CX)=0或ZF=0(即某次比較的結(jié)果兩個(gè)操作數(shù)不等)時(shí)退出,否則往下執(zhí)行 2)(CX)<-(CX)-1 3)執(zhí)行其后的串指令 4)重復(fù)1)~3) .REPNE/REPNZ 當(dāng)不相等/不為零時(shí)重復(fù)串操作 格式: REPNE(或REPNZ) String Primitive 其中String Primitive可為CMPS或SCAS指令 執(zhí)行的操作: 除退出條件(CX=0)或ZF=1外,其他操作與REPE完全相同. .CMPS 串比較指令 格式: CMP SRC,DST CMPSB CMPSW 執(zhí)行的操作: 1)((SI))-((DI)) 2)字節(jié)操作:(SI)<-(SI)+-1,(DI)<-(DI)+-1 字操作: (SI)<-(SI)+-2,(DI)<-(DI)+-2 指令把由(SI)指向的數(shù)據(jù)段中的一個(gè)字(或字節(jié))與由(DI)指向的附加段中的一個(gè)字(或字節(jié))相減,但不保存結(jié)果,只根據(jù)結(jié)果設(shè)置條件碼,指令的其它特性和MOVS指令的規(guī)定相同. .SCAS 串掃描指令 格式: SCAS DST SCASB SCASW 執(zhí)行的操作: 字節(jié)操作:(AL)-((DI)),(DI)<-(DI)+-1 字操作: (AL)-((DI)),(DI)<-(DI)+-2 該指令把AL(或AX)的內(nèi)容與由(DI)指定的在附加段中的一個(gè)字節(jié)(或字)進(jìn)行比較,并不保存結(jié)果,只根據(jù)結(jié)果置條件碼.指令的其他特性和MOVS的規(guī)定相同. 五、控制轉(zhuǎn)移指令 1.無條件轉(zhuǎn)移指令 .JMP(jmp) 跳轉(zhuǎn)指令 1)段內(nèi)直接短轉(zhuǎn)移 格式:JMP SHORT OPR 執(zhí)行的操作:(IP)<-(IP)+8位位移量 2)段內(nèi)直接近轉(zhuǎn)移 格式:JMP NEAR PTR OPR 執(zhí)行的操作:(IP)<-(IP)+16位位移量 3)段內(nèi)間接轉(zhuǎn)移 格式:JMP WORD PTR OPR 執(zhí)行的操作:(IP)<-(EA) 4)段間直接(遠(yuǎn))轉(zhuǎn)移 格式:JMP FAR PTR OPR 執(zhí)行的操作:(IP)<-OPR的段內(nèi)偏移地址 (CS)<-OPR所在段的段地址 5)段間間接轉(zhuǎn)移 格式:JMP DWORD PTR OPR 執(zhí)行的操作:(IP)<-(EA) (CS)<-(EA+2) 2.條件轉(zhuǎn)移指令 1)根據(jù)單個(gè)條件標(biāo)志的設(shè)置情況轉(zhuǎn)移 .JZ(或JE)(Jump if zero,or equal) 結(jié)果為零(或相等)則轉(zhuǎn)移 格式:JE(或JZ) OPR 測試條件:ZF=1 .JNZ(或JNE)(Jump if not zero,or not equal) 結(jié)果不為零(或不相等)則轉(zhuǎn)移 格式:JNZ(或JNE) OPR 測試條件:ZF=0 .JS(Jump if sign) 結(jié)果為負(fù)則轉(zhuǎn)移 格式: JS OPR 測試條件:SF=1 .JNS(Jump if not sign) 結(jié)果為正則轉(zhuǎn)移 格式:JNS OPR 測試條件:SF=0 .JO(Jump if overflow) 溢出則轉(zhuǎn)移 格式: JO OPR 測試條件:OF=1 .JNO(Jump if not overflow) 不溢出則轉(zhuǎn)移 格式: JNO OPR 測試條件:OF=0 .JP(或JPE)(Jump if parity,or parity even) 奇偶位為1則轉(zhuǎn)移 格式: JP OPR 測試條件:PF=1 .JNP(或JPO)(Jump if not parity,or parity odd) 奇偶位為0則轉(zhuǎn)移 格式: JNP(或JPO) OPR 測試條件:PF=0 .JB(或JNAE,JC)(Jump if below,or not above or equal,or carry) 低于,或者不高于或等于,或進(jìn)位位為1則轉(zhuǎn)移 格式:JB(或JNAE,JC) OPR 測試條件:CF=1 .JNB(或JAE,JNC)(Jump if not below,or above or equal,or not carry) 不低于,或者高于或者等于,或進(jìn)位位為0則轉(zhuǎn)移 格式:JNB(或JAE,JNC) OPR 測試條件:CF=0 2)比較兩個(gè)無符號數(shù),并根據(jù)比較的結(jié)果轉(zhuǎn)移 .JB(或JNAE,JC) 格式:同上 .JNB(或JAE,JNC) 格式:同上 .JBE(或JNA)(Jump if below or equal,or not above) 低于或等于,或不高于則轉(zhuǎn)移 格式:JBE(或JNA) OPR 測試條件:CFVZF=1 .JNBE(或JA)(Jump if not below or equal,or above) 不低于或等于,或者高于則轉(zhuǎn)移 格式:JNBE(或JA) OPR 測試條件:CFVZF=0 3)比較兩個(gè)帶符號數(shù),并根據(jù)比較的結(jié)果轉(zhuǎn)移 .JL(或LNGE)(Jump if less,or not greater or equal) 小于,或者不大于或者等于則轉(zhuǎn)移 格式:JL(或JNGE) OPR 測試條件:SFVOF=1 .JNL(或JGE)(Jump if not less,or greater or equal)不小于,或者大于或者等于則轉(zhuǎn)移 格式:JNL(或JGE) OPR 測試條件:SFVOF=0 .JLE(或JNG)(Jump if less or equal,or not greater) 小于或等于,或者不大于則轉(zhuǎn)移 格式:JLE(或JNG) OPR 測試條件:(SFVOF)VZF=1 .JNLE(或JG)(Jump if not less or equal,or greater) 不小于或等于,或者大于則轉(zhuǎn)移 格式:JNLE(或JG) OPR 測試條件:(SFVOF)VZF=0 4)測試CX的值為0則轉(zhuǎn)移指令 .JCXZ(Jump if CX register is zero) CX寄存器的內(nèi)容為零則轉(zhuǎn)移 格式:JCXZ OPR 測試條件:(CX)=0 注:條件轉(zhuǎn)移全為8位短跳! 3.循環(huán)指令 .LOOP 循環(huán)指令 格式: LOOP OPR 測試條件:(CX)<>0 .LOOPZ/LOOPE 當(dāng)為零或相等時(shí)循環(huán)指令 格式: LOOPZ(或LOOPE) OPR 測試條件:(CX)<>0且ZF=1 .LOOPNZ/LOOPNE 當(dāng)不為零或不相等時(shí)循環(huán)指令 格式: LOOPNZ(或LOOPNE) OPR 測試條件:(CX)<>0且ZF=0 這三條指令的步驟是: 1)(CX)<-(CX)-1 2)檢查是否滿足測試條件,如滿足則(IP)<-(IP)+D8的符號擴(kuò)充. 4.子程序 .CALL調(diào)用指令 .RET返回指令 5.中斷 .INT指令 格式: INT TYPE 或 INT 執(zhí)行的操作:(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 若溢出則中斷 執(zhí)行的操作:若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 執(zhí)行的操作:(IP)<-((SP)+1,(SP)) (SP)<-(SP)+2 (CS)<-((SP)+1,(SP)) (SP)<-(SP)+2 (PSW)<-((SP)+1,(SP)) (SP)<-(SP)+2 六、處理機(jī)控制指令 1.標(biāo)志處理指令 .CLC進(jìn)位位置0指令(Clear carry)CF<-0 .CMC進(jìn)位位求反指令(Complement carry)CF<-CF .STC進(jìn)位位置1指令(Set carry)CF<-1 .CLD方向標(biāo)志置0指令(Clear direction)DF<-0 .STD方向標(biāo)志置1指令(Set direction)DF<-1 .CLI中斷標(biāo)志置0指令(Clear interrupt)IF<-0 .STI中斷標(biāo)志置1指令(Set interrupt)IF<-0 2.其他處理機(jī)控制指令 NOP(No Opreation) 無操作 HLT(Halt) 停機(jī) WAIT(Wait) 等待 ESC(Escape) 換碼 LOCK(Lock) 封鎖 這些指令可以控制處理機(jī)狀態(tài).這們都不影響條件碼. .NOP 無操作指令 該指令不執(zhí)行任何操作,其機(jī)器碼占有一個(gè)字節(jié),在調(diào)試程序時(shí)往往用這條指令占有一定的存儲單元,以便在正式運(yùn)行時(shí)用其他指令取代. .HLT停機(jī)指令 該指令可使機(jī)器暫停工作,使處理機(jī)處于停機(jī)狀態(tài)以便等待一次外部中斷到來,中斷結(jié)束后可繼續(xù)執(zhí)行下面的程序. .WAIT等待指令 該指令使處理機(jī)處于空轉(zhuǎn)狀態(tài),它也可以用來等待外部中斷的發(fā)生,但中斷結(jié)束后仍返回WAIT指令繼續(xù)執(zhí)行. .ESC換碼指令 格式ESC mem 其中mem指出一個(gè)存儲單元,ESC指令把該存儲單元的內(nèi)容送到數(shù)據(jù)總線去.當(dāng)然ESC指令不允許使用立即數(shù)和寄存器尋址方式.這條指令在使用協(xié)處理機(jī)(Coprocessor)執(zhí)行某些操作時(shí),可從存儲器指得指令或操作數(shù).協(xié)處理機(jī)(如8087)則是為了提高速度而可以選配的硬件. .LOCK封鎖指令 該指令是一種前綴,它可與其他指令聯(lián)合,用來維持總線的鎖存信號直到與其聯(lián)合的指令執(zhí)行完為止.當(dāng)CPU與其他處理機(jī)協(xié)同工作時(shí),該指令可避免破壞有用信息.
- 匯編語言(35148)
相關(guān)推薦
匯編語言的結(jié)構(gòu)化設(shè)計(jì)及其在俄羅斯方塊中的應(yīng)用
為了簡化匯編語言的編寫過程,本文提出了一種結(jié)構(gòu)化的匯編編程思路,并以基于AT89C51芯片(以下對匯編語言的討論針對51單片機(jī)系統(tǒng))的俄羅斯方塊游戲?yàn)槔瑏碚宫F(xiàn)在51單片機(jī)中匯編語言結(jié)構(gòu)化編寫的優(yōu)勢。##俄羅斯方塊的軟件實(shí)現(xiàn)方法##實(shí)驗(yàn)測試與結(jié)果
2014-06-23 10:27:472713
8051匯編語言程序設(shè)計(jì)舉例
成就更好的自己目錄3.8 8051匯編語言程序設(shè)計(jì)舉例3.8.1 子程序的設(shè)計(jì)3.8.2 查表程序設(shè)計(jì)3.8.3 分支轉(zhuǎn)移程序設(shè)計(jì)3.8.4 循環(huán)程序設(shè)計(jì)3.8 8051匯編語言程序設(shè)計(jì)舉例 介紹
2021-12-01 08:23:13
匯編語言實(shí)驗(yàn)
;nbsp; 匯編語言程序結(jié)構(gòu)………………………….8實(shí)驗(yàn)三 DOS和BIOS中斷功能調(diào)用………………….12實(shí)驗(yàn)四 &
2008-09-29 13:56:53
匯編語言開發(fā)DSP
剛學(xué)DSP,求教如何在CCS上全用匯編語言開發(fā)DSP 2812?包括如何引導(dǎo),入口地址,如何匯編調(diào)試等。
2013-10-28 12:25:51
匯編語言的特點(diǎn)有哪些
第5章單片機(jī)C語言及匯編語言混合編程05第5章單片機(jī)C語言與匯編語言混合編程 §5-1混合編程概述 匯編語言特點(diǎn): 優(yōu)點(diǎn):執(zhí)行速度快、效率高、實(shí)時(shí)性強(qiáng)、與硬件結(jié)合緊密。 缺點(diǎn):編程難度大、可讀性差
2021-07-15 08:04:29
ARM匯編語言入門
本指南介紹了使用A64指令集的Arm匯編語言的基本概念,向您展示了如何使用Arm Development Studio創(chuàng)建和運(yùn)行匯編代碼,并提供了匯編代碼示例供您進(jìn)行實(shí)驗(yàn)。
匯編語言是一種低級編程
2023-08-08 07:28:42
C語言與匯編語言怎樣才能更好地結(jié)合
在單片機(jī)學(xué)習(xí)的過程中,掌握一點(diǎn)匯編語言是非常有必有的,作為低級語言匯編語言在單片機(jī)開發(fā)中有它不可取代的作用,比如每條指令可以精確的確定延時(shí)時(shí)間,便于理解非常適合硬件工程師學(xué)習(xí)。但是要提高單片機(jī)技能
2021-07-20 06:56:36
STM32有專用的匯編語言嗎?
我是一個(gè)初學(xué)者,想了解STM32是怎么使用匯編語言的?而且有沒有有關(guān)的資料,然后與51單片機(jī)使用的匯編語言有什么區(qū)別?
2015-10-24 14:07:48
c語言匯編語言和機(jī)器語言的轉(zhuǎn)化
匯編語言經(jīng)過匯編程序可以翻譯成及期望語言,C語言是不是必須先轉(zhuǎn)換為匯編語言,然后才能生成機(jī)器語言?還是C語言可以直接經(jīng)過編譯就可以生成機(jī)器語言?我所查找的資料都是說C語言經(jīng)過編譯后生成.obj的目標(biāo)文件,也就是機(jī)器語言,望各位大師給小弟詳解一下,小弟不剩感激。
2015-04-14 16:53:27
《微機(jī)原理與匯編語言》 匯編語言程序設(shè)計(jì)知識
`《微機(jī)原理與匯編語言》匯編語言程序設(shè)計(jì)知識[hide][/hide]`
2017-03-19 10:15:07
什么是匯編語言
基于C++寶典的學(xué)習(xí)一、什么是匯編語言匯編語言是一種功能很強(qiáng)的程序設(shè)計(jì)語言,也是利用了計(jì)算機(jī)所有硬件特性并能直接控制硬件的語言。在匯編語言中,用助記符(Memoni)代替操作碼,用地址符號
2021-07-19 06:05:14
什么是匯編語言
文章目錄前言一、 匯編語言簡介1.1 什么是匯編語言1.2機(jī)器語言簡介1.3 匯編語言的演變史1.4 匯編語言的廣義組成二、硬件與軟件2.1 思考2.2 計(jì)算機(jī)的硬件構(gòu)成(1)存儲器(2)控制器(3
2022-02-24 07:01:46
使用匯編語言的地方有哪些
對資深單片機(jī)開發(fā)人員來說經(jīng)常提倡的一個(gè)開發(fā)技巧是,開發(fā)人員應(yīng)避免使用匯編語言。避免使用匯編語言的原因是它特定于所使用的處理器體系結(jié)構(gòu),難以閱讀,理解和維護(hù)。而且需要注意的是,在查看仍可以使用匯編語言
2021-12-01 06:33:06
如何才能有針性的學(xué)習(xí)匯編語言
本人是測控專業(yè)的,以后想在嵌入式方面發(fā)展,想學(xué)習(xí)一下匯編語言,但是不知道學(xué)習(xí)那種 我發(fā)現(xiàn)有 專門的 匯編語言程序設(shè)計(jì)還有基于ARM體系的匯編語言還有l(wèi)inux匯編Inter匯編太多了如果想學(xué)習(xí)咋選擇 是不是計(jì)算機(jī)專業(yè)的 匯編語言設(shè)計(jì) 把其他包括 或者大同小異
2016-08-01 00:23:34
請問自學(xué)匯編語言匯編語言需要什么?
學(xué)過C語言和Java 學(xué)過51單片機(jī), 現(xiàn)在想學(xué)習(xí)ARM 匯編語言 嵌入式系統(tǒng)Linux 這幾個(gè) 有什么相關(guān)的視頻或者書籍用來自學(xué)
2020-07-26 08:03:32
匯編語言程序設(shè)計(jì)pdf
匯編語言程序設(shè)計(jì)的內(nèi)容:每種高級語言程序在連接為可執(zhí)行程序之前,都必須被編譯為匯編語言程序,因此對于高級語言程序設(shè)計(jì)者來說,了解編譯器如何生成匯編語言代碼十
2008-10-21 17:38:550
匯編語言程序設(shè)計(jì)下載
professional assembly language 匯編語言程序設(shè)計(jì)本書分為三部分。第一部分講解匯編語言程序設(shè)計(jì)環(huán)境基礎(chǔ),第二部分研究匯編語言程序設(shè)計(jì),最后一部分講解高級匯編語言技術(shù)。本書
2008-10-21 17:42:050
32位匯編語言程序設(shè)計(jì)
Windows環(huán)境下32位匯編語言是一種全新的編程語言。它使用與C++語言相同的API接口,不僅可以用來開發(fā)出大型的軟件,而且是了解操作系統(tǒng)運(yùn)行細(xì)節(jié)的最佳方式。
本書從編寫應(yīng)用
2008-10-21 17:53:180
匯編語言編程藝術(shù)(PDF)
匯編語言編程藝術(shù)從簡單的Hello程序開始,系統(tǒng)而詳細(xì)地闡述了X86微機(jī)匯編語言編程的行種基礎(chǔ)知識和編程技巧,內(nèi)容涉及到數(shù)據(jù)表示、存儲器管理、各種數(shù)據(jù)類型、過程、與匯編
2008-10-21 18:04:070
宏匯編語言程序設(shè)計(jì)(PDF)
宏匯編語言程序設(shè)計(jì)介紹了IBM PC微型計(jì)算機(jī),基本匯編語言,順序、分支與循環(huán)程序設(shè)計(jì),子程序設(shè)計(jì),數(shù)值運(yùn)算程序設(shè)計(jì),非數(shù)值運(yùn)算程序設(shè)計(jì)等內(nèi)容。自學(xué)與提高的捷徑 高
2008-10-21 18:06:260
匯編語言靜態(tài)分析工具設(shè)計(jì)與應(yīng)用
本文針對當(dāng)前匯編語言的測試工具較少這一實(shí)際情況,針對某種匯編語言語法結(jié)構(gòu)特 點(diǎn),確定了匯編語言靜態(tài)分析工具的總體結(jié)構(gòu)框架,并對工具實(shí)現(xiàn)過程中重點(diǎn)的功能模塊算法, 進(jìn)行
2009-06-19 11:52:1726
匯編語言源代碼分析
匯編語言源代碼分析
查看源代碼將發(fā)現(xiàn)它由4 4個(gè)文件組成,其中:• 兩個(gè)是匯編語言文件,它們的名字帶后綴“ . s”;• 28個(gè)是用“C”語言編寫的,它們的名
2010-02-09 16:18:2126
DSP匯編語言編程基礎(chǔ)
DSP匯編語言編程基礎(chǔ)
一、 實(shí)驗(yàn)?zāi)康?1、了解 DSP 的尋址方式; 2、了解 DSP 的匯編語言與 C語言混合編程。 二、 實(shí)驗(yàn)器材 1、安裝有 CCS的 PC
2010-02-11 09:41:07205
匯編語言自學(xué)教程
匯編語言自學(xué)教程
匯編語言(AssemblyLanguage)是面向機(jī)器的程序設(shè)計(jì)語言。在匯編語合中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標(biāo)號(Label)代替地址碼。
2010-03-15 14:24:53509
匯編語言程序結(jié)構(gòu)
實(shí) 驗(yàn) 匯編語言程序結(jié)構(gòu)
一、實(shí)驗(yàn)?zāi)康?nbsp;1.掌握匯編語言程序上機(jī)過程。 2.掌握匯編語言結(jié)構(gòu)。
2008-09-28 23:11:252657
匯編語言程序設(shè)計(jì)實(shí)驗(yàn)
實(shí)驗(yàn) 匯編語言程序設(shè)計(jì)
一、實(shí)驗(yàn)?zāi)康?
1. 熟悉編寫和調(diào)試語言程序的方法,提高編
2008-09-28 23:24:304006
匯編語言教程-段寄存器的說明語句
匯編語言教程-段寄存器的說明語句
在匯編語言源程序中可以定義多個(gè)段,每個(gè)段都要與一個(gè)段寄存器建立一種對應(yīng)關(guān)系。建立這
2010-03-27 17:17:311230
Linux中的匯編語言
在閱讀Linux源代碼時(shí),你可能碰到一些匯編語言片段,有些匯編語言出現(xiàn)在以.S為擴(kuò)展名的匯編文件中,在這種文件中,整個(gè)程序全部由匯編語言組成。有些匯編命令出現(xiàn)在以.c為擴(kuò)展名
2011-04-07 20:43:2355
Assemble匯編語言設(shè)計(jì)技術(shù)
匯編語言 設(shè)計(jì)程序,是所有程序語言的基本資源。我們不管你使用除匯編語言或指令代碼以外的程序語言編程,僅僅是編程表達(dá)、編程規(guī)則和變成環(huán)境的變化,但是這些變化都是基于匯
2011-07-07 15:47:460
匯編語言學(xué)習(xí)課件_匯編語言程序組織
第四章 匯編語言程序組織
4.1 匯編語言語句格式
4.2 匯編語言源程序結(jié)構(gòu)
4.3 常用偽指令
4.4 匯編語言操作符
4.5 匯編語言程序上機(jī)過程
4.6 調(diào)用ROM BIOS或DOS中斷實(shí)現(xiàn)數(shù)據(jù)的輸入輸出
4.7 簡化段定義
2015-12-31 10:41:020
匯編語言學(xué)習(xí)課件_匯編語言高級編程技巧
第八章 匯編語言高級編程技巧
8.1 模塊化程序設(shè)計(jì)
8.2 匯編語言程序與高級語言程序的連接
8.3 使用DOS EXEC功能執(zhí)行程序
8.4 TSR程序設(shè)計(jì)
2015-12-31 10:41:140
匯編語言程序設(shè)計(jì)自學(xué)教程
匯編語言程序設(shè)計(jì)自學(xué)教程,幫助自學(xué)者掌握匯編語言的自行設(shè)計(jì)與編程。
2016-04-06 15:47:0639
Linux 匯編語言開發(fā)指南詳解
匯編語言的優(yōu)點(diǎn)是速度快,可以直接對硬件進(jìn)行操作,這對諸如圖形處理等關(guān)鍵應(yīng)用是非常重要的。Linux 是一個(gè)用 C 語言開發(fā)的操作系統(tǒng),這使得很多程序員開始忘記在 Linux 中還可以直接使用匯編這一
2017-11-02 10:51:480
C語言與匯編語言相互結(jié)合的嵌套匯編語言
要提高單片機(jī)技能,必須掌握C 語言編程,因?yàn)镃 語言有強(qiáng)大的模塊化管理思想。我想在很多人學(xué)習(xí)的過程中即學(xué)了匯編語言,又學(xué)習(xí)了C 語言,那么一個(gè)問題便隨之而產(chǎn)生,如果將C 語言與匯編語言相互結(jié)合,達(dá)到更好的編程效果,本次講解就是基于這個(gè)問題而生成的。
2018-03-14 18:23:003245
高級語言和匯編語言_機(jī)器語言的區(qū)別
本文首先介紹了高級語言的優(yōu)缺點(diǎn)、匯編語言的優(yōu)缺點(diǎn)及使用匯編語言的理由,其次介紹了機(jī)器語言的優(yōu)缺點(diǎn),最后闡述了高級語言和匯編語言、機(jī)器語言的區(qū)別是什么。
2018-04-16 10:28:0429298
CPU如何執(zhí)行代碼 匯編語言教程
的是低級語言,它專門用來控制硬件。匯編語言就是低級語言,直接描述/控制 CPU 的運(yùn)行。如果你想了解 CPU 到底干了些什么,以及代碼的運(yùn)行步驟,就一定要學(xué)習(xí)匯編語言。 匯編語言不容易學(xué)習(xí),就連簡明扼要的介紹都很難找到。下面
2021-08-25 11:14:103263
MCS-51單片機(jī)匯編語言程序設(shè)計(jì)
文章目錄前言一、匯編的方法1.手工匯編:2.機(jī)器匯編:二、偽指令一、匯編語言指令類型二.偽指令 常用偽指令及功能三、匯編語言程序設(shè)計(jì)步驟四、常用的順序結(jié)構(gòu)1、 順序程序設(shè)計(jì)2 、 分支程序的設(shè)計(jì)總結(jié)
2021-11-05 12:21:0428
Stm32單片機(jī)開發(fā)KEIL啟動文件匯編語言詳解
文章目錄簡介 啟動文件匯編代碼相關(guān)指令 堆棧空間的定義 初始化中斷向量表 復(fù)位中斷函數(shù) 中斷函數(shù)的弱(WEAK)聲明 用戶棧和堆初始化簡介我們在做單片機(jī)編程的時(shí)候,大部分都是用KEIL自帶的啟動文件
2021-11-13 15:21:0312
【匯編】AT89C52點(diǎn)亮一盞LED燈(匯編語言)
學(xué)習(xí)利用匯編語言寫單片機(jī)程序的第一步是要學(xué)習(xí)匯編語言的相關(guān)理論知識,那么實(shí)踐操作的第一步肯定是從點(diǎn)燈開始啦!編譯環(huán)境:keil4編譯語言:匯編語言內(nèi)容:??一、keil4建立AT89C52的工程環(huán)境
2021-11-22 20:51:0318
匯編語言學(xué)習(xí)
寄存器 一個(gè)cpu有多個(gè)寄存器 就是cpu中可以存儲數(shù)據(jù)的器件,一個(gè)cpu中有多個(gè)寄存器匯編語言由一下3類組成 1、匯編指令(機(jī)器碼的助記符) 2、偽指令(由編譯器執(zhí)行
2021-11-23 18:06:2414
[從零學(xué)習(xí)匯編語言] - 計(jì)算機(jī)中的硬件與軟件
文章目錄前言一、 匯編語言簡介1.1 什么是匯編語言1.2 機(jī)器語言簡介1.3 匯編語言的演變史1.4 匯編語言的廣義組成二、硬件與軟件2.1 思考2.2 計(jì)算機(jī)的硬件構(gòu)成(1)存儲器(2)控制器
2021-12-31 19:55:1110
單片機(jī)匯編語言的結(jié)構(gòu)/數(shù)據(jù)類型/匯編指令
開發(fā)匯編語言是為了為機(jī)器級代碼指令提供助記符或符號,匯編語言程序由助記符組成,因此應(yīng)將它們翻譯成機(jī)器代碼。負(fù)責(zé)這種轉(zhuǎn)換的程序稱為匯編程序。匯編語言通常被稱為低級語言,因?yàn)樗苯优c CPU 的內(nèi)部結(jié)構(gòu)一起工作。要用匯編語言編程,程序員必須知道 CPU 的所有寄存器。
2023-07-07 12:28:401824
評論
查看更多