『壹』 單片機匯編語言指令中,條件轉移指令JBC與JC的區別是什麼
一、作用不同:
JBC指令判斷該位為1則轉移,同時將該位置0。
JC指令判斷有借位則轉移,也就是說兩數相減為負轉移。
二、含義不同:
JBC指令相當與JB和CLR (位) 二條指命的組合,它可在轉移的同時清除被判位;
JC指令只能對CY進位位進行判斷為高後轉移,並不能清除它,二條指令都當被測位為高進時進行相對轉移。
三、位置不同:
JC是判斷C進位標志是否為1,為1則跳轉到指定位置。
JBC是判斷可位定址區域內指定位是否為1,為1則跳轉到指定位置,並同時清除該位(置0)。
(1)單片機匯編語言指令擴展閱讀:
直接使用匯編指令編寫單片機程序,對硬體的控制更加直接,可以直接操作物理地址,寄存器,埠等;其它更高級的語言(如:C語言)對硬體的控制是依賴於類庫來實現的。並且,對於一些對程序大小和運行速度有非常嚴苛要求的項目而言,都必須使用匯編指令。C語言只是為了方便編寫,與機器打交道的其實都是2進製得代碼,匯編語言就是這些代碼好記憶的名稱和規則,只是比C語言難理解些。
『貳』 單片機匯編語言中比較指令
剛好也有這么個困惑,已經解決了,拿出來分享下
比較轉移指令
CJNZ
CJNE
A,#data,rel
CJNE
A,direct,rel
CJNE
Rn,#data,rel
CJNE
@Ri,#data,rel
第一條指令的功能是將A中的值和立即數data比較,如果兩者相等,就次序執行(執行本
指令的下一條指令),如果不相等,就轉移,同樣地,我們能將rel理解成標號,即:CJNEA,
#data,標號。這樣利用這條指令,我們就能判斷兩數是否相等,這在很多場合是非常有用的。
但有時還想得知兩數比較之後哪個大,哪個小,本條指令也具有這樣的功能,如果兩數不相等,則CPU還會反映出哪個數大,哪個數小,這是用CY(進位位)來實現的。如果前面的
數(A中的)大,則CY=0,不然CY=1,因此在程序轉移後再次利用CY就可判斷出A中的數
比data大還是小了。
例:
MOV
A,R0
CJNE
A,#10H,L1
MOV
R1,#0FFH
AJMP
L3
L1:
JC
L2
MOV
R1,#0AAH
AJMP
L3
L2:
MOV
R1,#0FFH
L3:
SJMP
L3
JC是判CY是0,還是1進行轉移,如果CY=1,則轉移到JC後面的標號處
執行,如果CY=0則次序執行(執行它的下面一條指令)。
分析一下上面的程序,如果(A)=10H,則次序執行,即R1=0。如果(A)不等於10H,則轉
到L1處繼續執行,在L1處,再次進行判斷,如果(A)>10H,則CY=1,將次序執行,即執
行MOV
R1,#0AAH指令,而如果(A)<10H,則將轉移到L2處指行,即執行MOV
R1,#0FFH
指令。因此最終結果是:本程序執行前,如果(R0)=10H,則(R1)=00H,如果(R0)>10H,
則(R1)=0AAH,如果(R0)<10H,則(R1)=0FFH。
弄懂了這條指令,其它的幾條就類似了,第二條是把A當中的值和直接地址中的值比較,第
三條則是將直接地址中的值和立即數比較,第四條是將間址定址得到的數和立即數比較,這
里就不詳談了,下面給出幾個對應的常式。
CJNE
A,10H
;把A中的值和10H中的值比較(注意和上題的區別)
CJNE
10H,#35H
;把10H中的值和35H中的值比較
CJNE
@R0,#35H
;把R0中的值作為地址,從此地址中取數並和35H比較
『叄』 匯編語言在51單片機中的所有指令有那些
單片機指令功能一覽表
助記符 代碼 說明
MOV A,Rn E8~EF 寄存器A
MOV A,direct E5 dircet 直接位元組送A
MOV A,@Ri ER~E7 間接RAM送A
MOV A,#data 74 data 立即數送A
MOV Rn,A F8~FF A送寄存器
MOV Rn,dircet A8~AF dircet 直接位元組送寄存器
MOV Rn,#data 78~7F data 立即數送寄存器
MOV dircet,A F5 dircet A送直接位元組
MOV dircet,Rn 88~8F dircet 寄存器送直接位元組
MOV dircet1,dircet2 85 dircet1 dircet2 直接位元組送直接位元組
MOV dircet,@Ro 86~87 間接RAM送直接位元組
MOV dircet,#data 75 dircet data 立即數送直接位元組
MOV @Ri,A F6~F7 A送間接RAM
MOV @Ri,#data 76~77 data 直接位元組送間接RAM
MOV @Ri,#data 76~77 data 立即數送間接RAM
MOV DPTR,#data16 90 data 15~8 16位常數送數據指針
data7~0
MOVC A,@A+DPTR 93 由((A)+(DPTR))定址的程序存貯
器位元組選A
MOVC A,@A+PC 83 由((A)+(PC));定址的程序存貯器位元組送A
MOVX A,@Ri E2~E3 送外部數據(8位地址)送A
MOVX A,@DPTR E0 送外部數據(16位地址)送A
MOVX @Ri,A F2~F3 A送外部數據(8位地址)
MOVX @DPTR,A F0 A送外部數據(16位地址)
PUSH dircet C0 dircet 直接位元組進棧,SP加1
POP dircet D0 dircet 直接位元組退棧,SP減1
XCH A,Rn C8~CF 交換A和寄存器
XCH A,dircet C5 dircet 交換A和直接位元組
XCH A,@Ri C6~C7 交換A和間接RAM
XCH A,@Ri D6~D7 交換A和間接RAM的低位
SWAP A C4
算術操作 (A的二個半位元組交換)
ADD A,Rn 28~2F 寄存器加到A
ADD A,dircet 25 dircet 直接位元組加到A
ADD A,@Ri 26~27 間接RAM加到A
ADD A,#data 24data 立即數加到A
ADD A,Rn 38~3F 寄存器和進位位加到A
ADD A,dircet 35dircet 直接位元組和進位位加到A
ADD A,@Ri 36~37 間接位元組和進位位加到A
ADD A,data 34 data 立即數和進位位加到A
ADD A,Rn 98~9F A減去寄存器和進位位
ADD A,dircet 95 dircet A減去直接位元組和進位位
ADD A,@Ri 36~37 間接RAM和進位位加到A
ADD A,data 34 data 立即數和進位位加到A
SUBB A,Rn 98~9F A減去寄存器和進位位
SUBB A,dircet 95 dircet A減去直接位元組和進位位
SUBB A,@Ri 96~97 A減去間接RAM和進位位
SUBB A,#data 94 data A減去立即數和進位位
INC A 04 A加1
INC Rn 08~0F 寄存器加1
INC dircet 05 dircet 直接位元組加1
INC @Ri 06~07 間接RAM加1
DEC A 14 A減1
DEC Rn 18~1F 寄存器減1
DEC dircet 15 dircet 直接位元組減1
DEC @Ri 16~17 間接RAM減1
INC DPTR A3 數據指針加1
MUL AB A4 A乘以B
DIV AB 84 A除以B
DA A D4 A的十進制加法調整
邏輯操作
ANL A,Rn 58~5F 寄存器「與」到A
ANL A,dircet 55 dircet 直接位元組「與」到A
ANL A,@Ri 56~57 間接RAm「與」到A
ANL A,#data 54 data 立即數「與」到A
ANL dircet A 52 dircet A「與」到直接位元組
ANL dircet,#data 53 dircet data 立即數「與」到直接位元組
ORL A,Rn 48~4F 寄存器「或」到A
ORL A,dircet 45 dircet 直接位元組「或」到A
ORL A,@Ri 46~47 間接RAM「或」到A
ORL A,#data 44 data 立即數「或」到A
ORL dircet,A 42 dircet A「或」到直接位元組
ORL dircet,#data 43 dircet data 立即數「或」到直接位元組
XRL A,Rn 68~6F 寄存器「異或」到A
XRL A,dircet 65 dircet 直接位元組「異或」到A
XRL A,@Ri 66~67 間接RAM「異或」到A
XRL A,#data 64 data 立即數「異或」到A
XRL dircet A 62 dircet A「異或」到直接位元組
XRL dircet,#data 63 dircet data 立即數「異或」到直接位元組
CLR A E4 清零
CPL A F4 A取反
RL A 23 A左環移
RLC A 33 A通過進位左環移
RR A 03 A右環移
RRC A 13 A通過進位右環移
控製程序轉移
ACALL addr 11 *1 addr(a7~a0) 絕對子程序調用
LCALL addr 16 12 addr(15~8) 長子程序調用
addr(7~0)
RET 22 子程序調用返回
RETI addr 11 32 中斷調用返回
AJMP addr 11 △1 addr(a7~a6) 絕對轉移
LJMP addr 16 02addr(15~8) 長轉移
addr(7~0)
SJMP rel 80 rel 短轉移,相對轉移
JMP @A+DPTR 73 相對於DPTR間接轉移
JZ rel 60 rel A為零轉移
JNZ rel 70 rel A為零轉移
CJNE A,dircet,rel B5 dircet rel 直接位元組與A比較,不等則轉移
CJNE A,#data,rel B4 data rel 立即數與A比較,不等則轉移
CJNE A,Rn,#data,rel B8~BF data rel 立即數與寄存器比較,不等則轉移
CJNE @Ri,#data,rel B6~B7 data rel 立即數與間接RAM比較,不等則轉移
DJNZ Rn,rel D8~DF rel 寄存器減1,不為零則轉移
DJNZ dircet,rel B5 dircet rel 直接位元組減1,不為零則轉移
NOP 00 空操作
*=a10a9a8l
△=a10a9a80
布爾變數操作
CLR C C3 清零進位
CLR bit C2 清零直接位
SETB C D3 置位進位
SETB bit D2 置位直接位
CPL C B3 進位取反
CPL bit B2 直接位取反
ANL C,bit 82 dit 直接數「與」到進位
ANL C,/bit B0 直接位的反「與」到進位
ORL C,bit 72 bit 直接位「或」到進位
ORL C,/bit A0 bit 直接位的反「或」到進位
MOV C,bit A2 bit 直接位送進位
MOV bit,C 92 bit 進位送直接位
JC rel 40 rel 進位位為1轉移
JNC rel 50 rel 進位位為0轉移
JB bit,rel 20 bit rel 直接位為1相對轉移
JNB bit,rel 30 bit rel 直接位為0相對轉移
JBC bit,rel 10 bit rel 直接位為1相對轉移,然後清零該位
[1]. 循環移位指令(4條)
RL A ;累加器A中的內容左移一位
RR A ;累加器A中的內容右移一位
RLC A ;累加器A中的內容連同進位位CY左移一位
RRC A ;累加器A中的內容連同進位位CY右移一位
[2]. 累加器半位元組交換指令(1條)
SWAP A ; 累加器中的內容高低半位元組互換
[3]. 求反指令(1條)
CPL A ; 累加器中的內容按位取反
[4]. 清零指令(1條)
CLR A ; 0→(A),累加器中的內容清0
[5]. 邏輯與操作指令(6條)
ANL A,data ;累加器A中的內容和直接地址單元中的內容執行與邏輯操作。結果存在寄存器A中。
ANL data,#data ;直接地址單元中的內容和立即數執行與邏輯操作。結果存在直接地址單元中。
ANL A,#data ;累加器A的內容和立即數執行與邏輯操作。結果存在累加器A中。
ANL A,Rn ;累加器A的內容和寄存器Rn中的內容執行與邏輯操作。結果存在累加器A中。
ANL data,A ;直接地址單元中的內容和累加器A的內容執行與邏輯操作。結果存在直接地址單元中。
ANL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行與邏輯操作。結果存在累加器A中。
[6]. 邏輯或操作指令(6條)
這組指令的作用是將兩個單元中的內容執行邏輯或操作。如果直接地址是I/O地址,則為「讀—修改—寫」操作。
ORL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯或操作。結果存在寄存器A中。
ORL data,#data ;直接地址單元中的內容和立即數執行邏輯或操作。結果存在直接地址單元中。
ORL A,#data ;累加器A的內容和立即數執行邏輯或操作。結果存在累加器A中。
ORL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯或操作。結果存在累加器A中。
ORL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯或操作。結果存在直接地址單元中。
ORL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯或操作。結果存在累加器A中。
[7]. 邏輯異或操作指令(6條)
XRL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯異或操作。結果存在寄存器A中。
XRL data,#data ;直接地址單元中的內容和立即數執行邏輯異或操作。結果存在直接地址單元中。
XRL A,#data ;累加器A的內容和立即數執行邏輯異或操作。結果存在累加器A中。
XRL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯異或操作。結果存在累加器A中。
XRL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯異或操作。結果存在直接地址單元中。
XRL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯異或操作。結果存在累加器A中
控制轉移類指令分析
[1]. 無條件轉移指令(4條)
LJMP addr16 ;addr16→(PC),給程序計數器賦予新值(16位地址)
AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序計數器賦予新值(11位地址),(PC15-11)不改變
SJMP rel ;(PC)+ 2 + rel→(PC)當前程序計數器先加上2再加上偏移量給程序計數器賦予新值
JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址單元的值加上數據指針的值給程序計數器賦予新值
[2]. 條件轉移指令(8條)
JZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的內容為0,則轉移到偏移量所指向的地址,否則程序往下執行
JNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的內容不為0,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的內容不等於直接地址單元的內容,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
CJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址單元中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行
布爾變數操作指令分析
[1]. 位傳送指令(2條)
MOV C,bit ;bit→CY,某位數據送CY
MOV bit,C ;CY→bit,CY數據送某位
[2]. 位置位復位指令(4條)
CLR C ; 0→CY,清CY
CLR bit ; 0→bit,清某一位
SETB C ; 1→CY,置位CY
SETB bit ; 1→bit,置位某一位
[3]. 位運算指令(6條)
ANL C,bit ;(CY)∧(bit)→CY
ANL C,/bit ;(CY)∧( )→CY
ORL C,bit ;(CY)∨(bit)→CY
ORL C,/bit ;(CY)∧()→CY
CPL C ;()→CY
CPL bit ;()→bir
[4]. 位控制轉移指令(5)
JC rel ; (CY)=1轉移,(PC)+2+rel→PC,否則程序往下執行,(PC)+2→PC。
JNC rel ; (CY)=0轉移,(PC)+2+rel→PC,否則程序往下執行,(PC)+2→PC。
JB bit, rel ; 位狀態為1轉移。
JNB bit, rel ; 位狀態為0轉移。
JBC bit, rel ; 位狀態為1轉移,並使該位清「0」。
『肆』 單片機所有指令的英文全稱
MCS-51使用匯編語言指
令,它共有44個操作碼助記符,33種功能,
其操作數有#data、direct、Rn、@Ri等。這里先介紹指令助記符及其相關符號的記憶方
法。
一、助記符號的記憶方法
1�表格列舉法
把44個指令助記符按功能分為五類,每類列表記憶。此處從略,請讀者自己總結。
2�英文還原法
單片機的操作碼助記符是該指令功能的英文縮寫,將縮寫還原成英語原文,再對照漢
語有助於理解其助記符含義,從而加強記憶。例如:
增量 INC-Incremect 減量 DNC-Decrement
短轉移 SJMP-Short jump 長轉移 LJMP-Long jump
比較轉移 CJNE-Compare jump not equality
絕對轉移 AJMP-Absolute jump 空操作 NOP-No operation
交換 XCH-Exchange 加法 ADD-Addition
乘法 MUL-Multiplication 除法 DIV-Division
左環移 RL-Rotate left 進位左環移 RLC-Rotate
left carry
右環移 RR-Rotate right 進位右環移RRC-Rotate
right carry
3�功能模塊記憶法
單片機的44個指令助記符,按所屬指令功能可分為五大類,每類又可以按功能相似原
則為2~3組。這樣,化整為零,各個擊破,實現快速記憶。
1)數據傳送組。 2)加減運算組
MOV 內部數據傳送 ADD 加法
MOVC 程序存儲器傳送 ADDC 帶進位加法
MOVX 外部數據傳送 SUBB 帶進位減法
3)邏輯運算組。 4)子程序調用組。
ANL 邏輯與 LCALL 長調用
ORL 邏輯或 ALALL 絕對調用
XRL 邏輯異或 RET 子程序返回
二、指令的記憶方法
1�指令操作數的有關符號
MCS-51的定址方式共有六種:立即數定址、直接定址、寄存器定址、寄存器間址、變
址定址、相對定址。我們必須掌握其表示的方法。
1)立即數與直接地址。ata表示八位立即數,#data16表示是十六位立即數,data或
direct表示直接地址。
2)Rn(n=0-7)、A、B、CY、DPTR寄存器定址變數。
3)@R0、@R1、@DPTR、SP表示寄存器間址變數。
4)DPTR+A、PC+A表示變址定址的變數。
5)PC+rel(相對量)表示相對定址變數。
記住指令的助記符,掌握不同定址方式的指令操作數的表示方法,為我們記憶匯編指
令打下了基礎。MCS-51指令雖多,但按功能可分為五類,
其中數據傳送類28條,算術運算類24條,邏輯操作類25條,控制轉移類17條,布爾位操作
類17條。在每類指令里,根據其功能,抓住其源、
目的操作數的不同組合,再輔之以下方法,是完全能記住的。
我們約定,可能的目的操作數按(#data/direct/A/Rn/@Ri)順序表示。
對於MOV指令,其目的操作數按A、Rn、direct、@Ri的順序書寫,則可以記住MOV的15
條指令。例如以累加器A為目的操作數,可寫出如下4條指令。
MOV A,#data/direct/A/Rn/@Ri
以此類推,寫出其它指令。
MOV Rn,#data/direct/A
MOV direct,#data/direct/A/Rn/@Ri
MOV @Ri,#data/direct/A
2�指令圖示記憶法
圖示記憶法是把操作功能相同或相似、但其操作數不同的指令,用圖形和箭頭將目
的、源操作數的關系表示出來的一種記憶方法。
例如:由助記符MOV、MOVX、MOVC組成的送數組指令,可以用圖1、2幫助記憶。
由助記符CJNE形成的四條指令,也可以用圖示法表示,如圖3。
CJNE A,#data,rel CJNE A,direct,rel
CJNE @Rn,#data,rel CJNE @Ri,#data,rel
另外,對於由(ANL、ORL、ARL)形成的18條邏輯操作指令,有關A的四條環移指令,
也可以用圖示法表示,請讀者自行畫出記憶。
3�相似功能歸類法
在MCS-51指令中,我們發現部分指令其操作碼不同,但功能相似,而操作數則完全一
樣。相似功能歸類法就是把具有這樣特點的指令放在一起記憶,
只要記住其中的一條,其餘的也就記住了。如加、減法的十二條指令,與、或、非的十八
條指令,現列舉如下。
ADD/ADDC/SUBB A,#data/direct/Rn/@Ri
ANL/ORL/XRL A,#data/direct/Rn/@Ri
ANL/ORL/XRL direct,#data/a
上述每一排指令,功能相似,其操作數都相同。其它的如加1(INC)、減1(DEC)指令也
可照此辦理。
4�口訣記憶法
對於有些指令,我們可以把相關的功能用精練的語言編成一句話來記憶。如PUSH
direct和POP direct這兩條指令。
初學者常常分不清堆棧SP的變化情況,為此編成這樣一句話:(SP的內容)加1(direct的內
容)再入棧,(SP的內容)彈出(到direct單元)SP才減1。
又如乘法指令中積的存放,除法指令中被除數和除數以及商的存放,都可以編成口訣記憶
如下。
MUL AB 高位積(存於)B,低位積(存於)A。
DIV AB A除以B,商(存於)A余(下)B。
上面介紹了幾種快速記憶單片機指令的方法,希望能起到拋磚引玉的作用,相信讀者
在學習單片機的過程中能找到適合自己的方法來記憶。
但是,有了好的方法還不夠,還需要實踐,即多讀書上的例題和別人編寫的程序,自己再
結合實際編寫一些程序。只有這樣,
才能更好更快地掌握單片機指令系統。
『伍』 51單片機匯編語言:位操作指令有哪些
數據位傳送指令
MOV C, bit ;bit 可直接定址位 C←(bit)
MOV bit,C ;C 進位位 (bit) ← C
位變數修改指令
CLR C ; 將C=0
CLR bit
CPL C ; 將C求反再存入C
CPL bit ; 將bit求反再存入bit
SETB C ; 將C=1
SETB bit ; (bit) ← 1
位變數邏輯指令
ANL C, bit ANL C, bit ORL C, bit ORL C, bit
『陸』 單片機匯編語言指令中中斷返回指令RET和RETI有什麼不同
RET是普通子程序的返回指令,RET是普通子程序的最後1條指培含令,它使程序從子程序轉到調用該子程序指令LCALL/ACALL的下1條指令執行。
RETI是中斷服務子程序的返回指令,RETI是中斷服務子程序的最後1條指令,它使程序從中斷服務子御消程序轉到中斷點繼續運行。
RETI指令除了執行返回功鎮中知能外,還清除內部相應的中斷狀態寄存器(該狀態寄存器由CPU響應中斷時置位,宣告CPU當前正在執行中斷服務程序),因此中斷服務子程序必須用RETI結束,
CPU執行RETI指令後,必須至少再執行一條其它指令才能響應新的中斷。
『柒』 匯編語言常用指令
單片機匯編語言匯編錯誤原因分析
匯編語言的指令格式,目前有兩種不同的標准:Windows下的匯編語言基本上都遵循Intel風格的語法,比如:MASM、NASM;而Unix/Linux下的匯編語言基本上都遵循AT&T風格的語法;
一、匯編語言語句的通用格式
[名稱[:]] 指令碼 [第一操作數][,第二操作數] ;注釋
匯編語言的指令碼的操作數的個數可以是0、1、2個;當操作數的個數為2的時候,語句還有兩種不同的格式:
Windows下Intel風格的匯編語言語句格式為:
[名稱[:]] 指令碼 目的操作數DST,源操作數SRC ;注釋
Unix/Linux下AT&T風格的匯編語言語句格式為:
[名稱[:]] 指令碼 源操作數SRC,目的操作數DST ;注釋
例如: CYCLE: ADD AX,02H ;(AX)匯編語言語句格式中的"名稱"並不是所有語句都必需的,但是,如果語句中帶有"名稱",那麼,大多數情況下,"名稱"都表示的是內存中某一存儲單元的地址,也就是"名稱"後面各項在內存中存放的第一個存儲單元的地址(包括該"名稱"所在段的段地址和段內偏移地址);比如上面的指令中,CYCLE就是該語句的名稱,CYCLE表示的就是其後面的機器指令碼在內存中存放的第一個地址;"名稱"與指令碼之間的分隔符可以是冒號":",也可以是空格字元" ";當以冒號分割時,該名稱代表的是一個標號;當以空格分割時,該名稱代表的可能是標號,也可能是變數;當指令碼有多個操作數的時候,相鄰兩個操作數之間要用逗號","分割;指令碼與操作數之間必須以空格分割;匯編語言語句的注釋必須以分號";"開頭;
二、組成語句的元素
1、常數:
匯編語言中的常數有整數、字元串;二進制、八進制、十進制、十六進制;匯編語言採用不同的後綴區分:
B:二進制數; O:八進制數; D:十進制數; H:十六進制數;
當一個數值後面沒有後綴的時候,默認為十進制數;
字元串常數是用一對單引號('')括起來的一串字元;
2、表達式:
由操作數和操作符組成;
算數運算操作符: +、-、*、/、MOD,等;取模運算MOD是取兩數相除的余數;
邏輯運算操作符: AND(邏輯與)、OR(邏輯或)、NOT(邏輯非)、XOR(邏輯異或);
注意:邏輯運算符同時又可以是邏輯運算指令的指令碼,只有當它們出現在指令的操作數部分時,才是操作符;例如:
ADD AL,0CH ADD 0FH ;第一個ADD是指令碼,第二個ADD是操作符;
關系運算操作符: EQ(相等)、NE(不等)、LT(小於)、GT(大於)、LE(小於等於)、GE(大於等於);
匯編語言中的表達式不能單獨構成語句,只能是語句的組成部分;
注意:語句中表達式的求值不是在語句執行時完成的,而是在對源程序進行匯編鏈接時完成的.所以,語句中各表達式的值必須在匯編或鏈接時就是確定的,也就是說,表達式中各標識符的值在匯編或鏈接時就應該是確定的;
3、標號:
標號是由標識符表示的指令的名稱,用於指示對應指令的位置(地址);
標號具有三個屬性:段地址、偏移地址和類型;
標號的段地址和偏移地址屬性是指該標號所對應的指令所在段的段地址和段內偏移地址;
標號的類型有兩種:NEAR和FAR;標號定義成NEAR類型,表示該標號在段內使用,而定義成FAR類型則表示該標號可以在段間使用;
標號的定義:在指令碼前面加上標識符和冒號":";
例如:START: PUSH DS
這條語句裡面,START就是我們定義的標號,它代表指令PUSH的地址,所以,標號可以作為程序轉移指令的操作數(即:要轉向的地址);標號還可以採用偽指令來定義;例如:用LABEL偽指令和過程定義偽指令來定義;
4、變數:
與高級語言一樣,並不是所有的操作數都是常數,匯編語言也有自己的變數,變數的值在程序運行期間是可以被改變的;
A.定義變數:匯編語言中,變數的定義是通過偽指令來完成的;定義變數的偽指令格式如下:
變數名 DB 表達式 ;定義位元組變數,又稱單位元組變數(1個連續位元組),DB-->BYTE
變數名 DW 表達式 ;定義字變數,又稱雙位元組變數(2個連續位元組),DW-->WORD
變數名 DD 表達式 ;定義雙字變數,又稱四位元組變數(4個連續位元組),DD-->DWORD
變數名 DF 表達式 ;定義六位元組變數,又稱六位元組變數(6個連續位元組),DF-->FWORD
變數名 DQ 表達式 ;定義長字變數,又稱八位元組變數(8個連續位元組),DQ-->QWORD
變數名 DT 表達式 ;定義十位元組變數(10個連續位元組),DT-->TBYTE;
其中,變數名是一個合法的標識符,變數名後面不能加冒號":",只能用空格;變數名不是必要的,可有可無;變數的類型由關鍵字DB、DW、DD、DQ、DT來定義;
變數定義語句中的"表達式"是用於對變數進行初始化的,可有一下幾種情況:
(1).一個或多個常數或表達式;當為多個常數或表達式時,期間要用逗號隔開;如DATA1--DATA4;
(2).帶單引號的字元串;
對於位元組型(DB)變數,每個變數的大小為1個位元組,每個變數的值不能超過1個字元,每個位元組內存入一個字元的ASCII碼值,整個字元串可以在同一對單引號內給出,這相當於是定義了一個字元數組,如DATA5;
對於字類型(DW)變數,每個變數的大小為2個位元組,每個變數的值不能超過2個字元,若為2個字元時,同樣遵循高位存入高位元組,低位存入低位元組的規則;若為1個字元,則該字元的ASCII碼值存入到低位元組,高位元組為00,如DATA6;
對於雙字類型(DD)變數,每個變數的大小為4個位元組,每個變數的值不能超過2個字元,若為2個字元,同樣遵循高位存入高位元組,低位存入低位元組的規則;但是2個字元的值被存入到雙字變數的最低2個位元組中,1個字元的值被存入到雙字變數的最低1個位元組中;
對於長字類型(DQ)變數,每個變數的大小為8個位元組,每個變數的值不能超過2個字元,若為2個字元,同樣遵循高位存入高位元組,低位存入低位元組的規則;但是2個字元的值被存入到長字變數的最低2個位元組中,1個字元的值被存入到長字變數的最低1個位元組中;
(3).一個問號"?",表示該變數的值不確定,即:該變數所表示的內存單元中的內容是不確定的,或者說是,當表達式為問號時,變數所對應的內存區中並沒有存入新的值,而只是預留出了相應的存儲空間;如DATA7、DATA8
(4).重復方式;此時的格式為: 重復次數 DUP(表達式);重復方式指出表達式的值可以重復地存儲到變數對應的內存區中,重復的次數由偽指令給出,相當於定義數組;如DATA9、DATA10
定義變數的例子:
DATA1 DB 20H ;1位元組變數
DATA2 DW 0204H,1000H ;2位元組變數
DATA3 DB (-1*3),(15/3) ;1位元組變數
DATA4 DD 123456H ;4位元組變數
DATA5 DB '0123' ;字元串變數,相當於一個字元數組
DATA6 DW 'AB','C','D' ;字元串變數,相當於一個字元串數組;
DATA7 DB ? ;1位元組變數,未初始化
DATA8 DD ? ;4位元組變數,未初始化
DATA9 DB 5 DUP(0) ;1位元組變數,用5個0初始化,相當於是一個具有5個DB型元素的數組
DATA10 DW 3 DUP(?) ;2位元組變數,未初始化,相當於是一個具有3個DW型元素的數組
變數定義語句中偽指令的功能是在變數名所對應的地址開始的內存區依次存入表達式中的各項值,表達式中的每項值所佔用內存位元組數與變數的類型對應;
總結:一個變數的變數名實際上就代表了該變數所對應的內存區在內存段中的有效地址(偏移地址);高地址是指地址值相對較大,低地址是指地址值相對較小,高地址與低地址是相對而言的;
5、變數的屬性:
(1).屬性介紹
一個變數具有一下屬性:
A.段地址(SEG):變數所在段的段地址;
B.偏移地址(OFFSET):變數所在段內的偏移地址;
C.類型(TYPE):變數的類型定義了每個變數所佔用的內存位元組數,對於DB、DW、DD、DQ、DT類型定義的變數所佔用的內存位元組數分別是1、2、4、8、10;通常又將DB、DW、DD類型所定義的變數分別成為BYTE類型、WORD類型、DWORD類型變數;
常用標識符的類型值列表:
標識符種類 位元組變數 字變數 雙字變數 近標號NEAR 遠標號FAR
TYPE的值 1 2 4 -1 -2
D.長度(LENGTH):變數定義時,一個變數名所定義的變數個數;在含有DUP操作符的變數定義中,變數名所定義的變數個數為定義格式中的重復次數;在其它各種變數定義中,每個變數名所定義的變數個數均為1個;
E.大小(SIZE):變數定義語句中,分配給同一個變數名的所有變數的總的位元組數,其值為該變數的類型與長度的成績;
其中,段地址、偏移地址和類型屬性是變數的主屬性,而長度和大小屬性是變數的輔助屬性;
(2).屬性操作符:
操作符 表達式 含義
SEG SEG 變數名或標號 取出變數名或標號所在段的段地址
OFFSET OFFSET 變數名或標號 取出變數名或標號所在段內的偏移地址
TYPE TYPE 變數名或標號 取出變數名或標號的類型(變數所佔用的位元組數)
LENGTH LENGTH 變數名 取出變數的長度
SIZE SIZE 變數名 取出變數的大小
這些操作符不能單獨構成語句,只能作為表達式的組成部分,並且表達式的求值也是在匯編過程中完成的;
6.強制類型轉換操作符PTR
格式:數據類型 PTR 地址表達式
格式中的"數據類型"可以是BYTE、WORD、DWORD、NEAR、FAR;前三種類型是變數的類型,後兩種類型是標號的類型;格式中的表達式可以是變數、標號、其它地址表達式;
PTR操作符的功能是用來重新定義已定義的變數或標號的類型,其作用域只在當前語句中; 例如:
DATA1 DW 02H
MOV BYTE PTR DATA1,AL
這條指令中,是把DATA1的類型轉換為BYTE類型,然後把AL中的內容存放到DATA1的最低一個位元組中;作用域只在這條MOV語句中,過了這條語句,DATA1仍然是DW類型,即:DATA1原來的類型並沒有被修改;