A. 關於單片機SUBB帶借位減法指令!
是這樣的。SUBB的每條指令的執行周期為一個周期數。它會對PSW中的標志位Cy、AC、OV產生影響。當減法有借位時,則Cy=1;否則,Cy=0.若低4位向高四位有借位時,AC=1;否則,AC=0;進行減法運算時,最高位與次高位不同時發生借位,則0V=1,否則,0V=0。不知能否幫到你。
B. 單片機程序里 帶進位減法怎樣進行十進制調整
51單片機的DA A指令,放在SUBB指令後面,是不起作用的;
必須把SUBB指令變換成ADD指令,才能用DA A指令進行調整。
這里提到了「減法」變換成「加法」,就要借用時鍾「倒撥」變成「正撥」的方法,倒撥15分鍾,和正撥45分鍾,效果相同。15和45就是以60為模的互補的數。
兩位十進制數,是以100為模的,減去60,和加上40,效果是相同的。
100,可以分解,寫成99+1,按照十六進制,可以寫成9AH。
那麼,將A和60相減,程序如下:
MOV R0, A ;保存被減數.
MOV A, #9AH ;100
CLR C
SUBB A, #60H ;減去減數,得到100的補數.
ADD A, R0 ;使用加法即可.
DA A ;調整為BCD數.
;完
C. 關於單片機帶借位減法指令
51單片機中帶借位減法指令為:SUBB,使用該指令時一定要首先處理借位Cy,不然容易出錯,得出與理想不一樣的結果。比如:
MOV A,R2
SUBB A,R3
以上指令運行後,將的出不確定的結果,正確的處理方法為:
CLR C
MOV A,R2
SUBB A,R3
D. 51單片機匯編中SUBB帶借位指令的意思
51單片機匯編中SUBB帶借位指令的格式是:SUBB A, R(操作數),意思是累加器中的數減去源操作數所指出的數和進位位CY,其差值存放在累加器A中。運算結果影響PSW(程序狀態標志寄存器)。
在多位元組減法運算中,低位元組被減數有時會向高位產生借位,此時CY(進位標志)置一,所以在此必須使用帶借位減法指令。需要注意的是,進行單位元組減法或多位元組低8位減法運算時,應先把進位位清零。在80C51指令系統中沒有不帶借位的減法指令。
例如: SUBB 49H,58H;49H-58H,在這里是49H是被減數,帶借位。
實際上減法運算在計算機中是補碼相加。
(4)單片機減法指令擴展閱讀
匯編語言指令系統執行計算和控制過程:
單片機的幾個主要組成部分,構成了單片機的硬體。所謂硬體(Hardware),就是看得到,摸得到的實體。但是,光有這樣的硬體,還只是有了實現計算和控制功能的可能性。
單片機要真正地能進行計算和控制,還必須有軟體(Software)的配合。軟體主要指的是各種程序。只有將各種正確的程序「灌入」(存入)單片機,它才能有效地工作。
單片機所以能自動地進行運算和控制,正是由於人把實現計算和控制的步驟一步步地用命令的形式,即一條條指令(Instruction)預先存入到存貯器中,單片機在CPU的控制下,將指令一條條地取出來,並加以翻譯和執行。就以兩個數相加這一簡單的運算來說,當需要運算的數已存入存貯器後,還需要進行以下幾步:
第一步:把第一個數從它的存貯單元(Location)中取出來,送至運算器。
第二步:把第二個數從它所在的存貯單元中取出來,送至運算器;
第三步:相加;
第四步:把相加完的結果,送至存貯器中指定的單元。
E. 單片機的帶借位減法
單片機中用到帶借位的減法是為了進行多位元組的減法運算,在進行高位位元組運算時,要同時減去低位位元組的借位,以得到正確的結果。
如果cy=1,SUBB
#09H,#05H
結果是03H
不是很正確噢
首先你的指令是非法指令,計算機、單片機中的立即數是不能做目的操作數的,目的操作數是要保存結果的,而立即數是不能保存結果的。
要想完成你的運算想法,應該寫成如下形式:
MOV
A,#9
SETB
C
SUBB
A,#5
即執行後:
(A)-5-cy=9-5-1=3
結果為03H是正確的。
在進行最低位元組的減法運算時,即剛開始做減法,還沒有產生借位,應在運算前使cy=0
即
CLR
C
MOV
A,#DATA1
SUBB
A,#DATA2
執行時,
(A)-DATA2-cy=DATA1-DATA2-0
呵呵
滿意
就選滿意回答
F. 單片機的基本指令有哪些
不知道你是問的哪種單片機下面給你的是MCS-51的,希望對你有幫助,如有,麻煩採納,謝謝 數據傳送指令共有29條,數據傳送指令一般的操作是把源操作數傳送到目的操作數,指令執行完成後,源操作數不變,目的操作數等於源操作數。如果要求在進行數據傳送時,目的操作數不丟失,則不能用直接傳送指令,而採用交換型的數據傳送指令,數據傳送指令不影響標志C,AC和OV,但可能會對奇偶標志P有影響。 x0dx0ax0dx0a[1]. 以累加器A為目的操作數類指令(4條) x0dx0a這4條指令的作用是把源操作數指向的內容送到累加器A。有直接、立即數、寄存器和寄存器間接定址方式: x0dx0ax0dx0aMOV A,data ;(data)→(A) 直接單元地址中的內容送到累加器A x0dx0aMOV A,#data ;#data→(A) 立即數送到累加器A中 x0dx0aMOV A,Rn ;(Rn)→(A) Rn中的內容送到累加器A中 x0dx0aMOV A,@Ri ;((Ri))→(A) Ri內容指向的地址單元中的內容送到累加器A x0dx0ax0dx0a[2]. 以寄存器Rn為目的操作數的指令(3條) x0dx0a這3條指令的功能是把源操作數指定的內容送到所選定的工作寄存器Rn中。有直接、立即和寄存器定址方式: x0dx0ax0dx0aMOV Rn,data ;(data)→(Rn) 直接定址單元中的內容送到寄存器Rn中 x0dx0aMOV Rn,#data ;#data→(Rn) 立即數直接送到寄存器Rn中 x0dx0aMOV Rn,A ;(A)→(Rn) 累加器A中的內容送到寄存器Rn中 x0dx0ax0dx0a[3]. 以直接地址為目的操作數的指令(5條) x0dx0a這組指令的功能是把源操作數指定的內容送到由直接地址data所選定的片內RAM中。有直接、立即、寄存器和寄存器間接4種定址方式: x0dx0ax0dx0aMOV data,data ;(data)→(data) 直接地址單元中的內容送到直接地址單元 x0dx0aMOV data,#data ;#data→(data) 立即數送到直接地址單元 x0dx0aMOV data,A ;(A)→(data) 累加器A中的內容送到直接地址單元 x0dx0aMOV data,Rn ;(Rn)→(data) 寄存器Rn中的內容送到直接地址單元 x0dx0aMOV data,@Ri ;((Ri))→(data) 寄存器Ri中的內容指定的地址單元中數據送到直接地址單元 x0dx0ax0dx0a[4]. 以間接地址為目的操作數的指令(3條) x0dx0a這組指令的功能是把源操作數指定的內容送到以Ri中的內容為地址的片內RAM中。有直接、立即和寄存器3種定址方式: x0dx0ax0dx0aMOV @Ri,data ;(data)→((Ri)) 直接地址單元中的內容送到以Ri中的內容為地址的RAM單元 x0dx0aMOV @Ri,#data ;#data→((Ri)) 立即數送到以Ri中的內容為地址的RAM單元 x0dx0aMOV @Ri,A ;(A)→((Ri)) 累加器A中的內容送到以Ri中的內容為地址的RAM單元 x0dx0ax0dx0a[5]. 查表指令(2條) x0dx0a這組指令的功能是對存放於程序存儲器中的數據表格進行查找傳送,使用變址定址方式: x0dx0ax0dx0aMOVC A,@A+DPTR ;((A))+(DPTR)→(A) 表格地址單元中的內容送到累加器A中 x0dx0aMOVC A,@A+PC ;((PC))+1→(A),((A))+(PC)→(A) 表格地址單元中的內容送到累加器A中 x0dx0ax0dx0a[6]. 累加器A與片外數據存儲器RAM傳送指令(4條) x0dx0a這4條指令的作用是累加器A與片外RAM間的數據傳送。使用寄存器定址方式: x0dx0ax0dx0aMOVX @DPTR,A ;(A)→((DPTR)) 累加器中的內容送到數據指針指向片外RAM地址中 x0dx0aMOVX A, @DPTR ;((DPTR))→(A) 數據指針指向片外RAM地址中的內容送到累加器A中 x0dx0aMOVX A, @Ri ;((Ri))→(A) 寄存器Ri指向片外RAM地址中的內容送到累加器A中 x0dx0aMOVX @Ri,A ;(A)→((Ri)) 累加器中的內容送到寄存器Ri指向片外RAM地址中 x0dx0ax0dx0a[7]. 堆棧操作類指令(2條) x0dx0a這4類指令的作用是把直接定址單元的內容傳送到堆棧指針SP所指的單元中,以及把SP所指單元的內容送到直接定址單元中。這類指令只有兩條,下述的第一條常稱為入棧操作指令,第二條稱為出棧操作指令。需要指出的是,單片機開機復位後,(SP)默認為07H,但一般都需要重新賦值,設置新的SP首址。入棧的第一個數據必須存放於SP+1所指存儲單元,故實際的堆棧底為SP+1所指的存儲單元。 x0dx0ax0dx0aPUSH data ;(SP)+1→(SP),(data)→(SP) 堆棧指針首先加1,直接定址單元中的數據送到堆棧指針SP所指的單元中 x0dx0aPOP data ;(SP)→(data)(SP)-1→(SP), 堆棧指針SP所指的單元數據送到直接定址單元中,堆棧指針SP再進行減1操作 x0dx0ax0dx0a[8]. 交換指令(5條) x0dx0a這5條指令的功能是把累加器A中的內容與源操作數所指的數據相互交換。 x0dx0ax0dx0aXCH A,Rn ;(A)←→(Rn)累加器與工作寄存器Rn中的內容互換 x0dx0aXCH A,@Ri ;(A)←→((Ri))累加器與工作寄存器Ri所指的存儲單元中的內容互換 x0dx0aXCH A,data ;(A)←→(data)累加器與直接地址單元中的內容互換 x0dx0aXCHD A,@Ri ;(A 3-0 )←→((Ri) 3-0 )累加器與工作寄存器Ri所指的存儲單元中的內容低半位元組互換 x0dx0aSWAP A ;(A 3-0 )←→(A 7-4 )累加器中的內容高低半位元組互換 x0dx0ax0dx0a[9]. 16位數據傳送指令(1條) x0dx0a這條指令的功能是把16位常數送入數據指針寄存器。 x0dx0ax0dx0aMOV DPTR,#data16 ;#dataH→(DPH),#dataL→(DPL)16位常數的高8位送到DPH,低8位送到DPL x0dx0ax0dx0aMCS-51算術運算指令 x0dx0ax0dx0a算術運算指令共有24條,算術運算主要是執行加、減、乘、除法四則運算。另外MCS-51指令系統中有相當一部分是進行加、減1操作,BCD碼的運算和調整,我們都歸類為運算指令。雖然MCS-51單片機的算術邏輯單元ALU僅能對8位無符號整數進行運算,但利用進位標志C,則可進行多位元組無符號整數的運算。同時利用溢出標志,還可以對帶符號數進行補碼運算。需要指出的是,除加、減1指令外,這類指令大多數都會對PSW(程序狀態字)有影響。這在使用中應特別注意。 x0dx0ax0dx0a[1]. 加法指令(4條) x0dx0a這4條指令的作用是把立即數,直接地址、工作寄存器及間接地址內容與累加器A的內容相加,運算結果存在A中。 x0dx0ax0dx0aADD A,#data ;(A)+#data→(A) 累加器A中的內容與立即數#data相加,結果存在A中 x0dx0aADD A,data ;(A)+(data)→(A) 累加器A中的內容與直接地址單元中的內容相加,結果存在A中 x0dx0aADD A,Rn ;(A)+(Rn)→(A) 累加器A中的內容與工作寄存器Rn中的內容相加,結果存在A中 x0dx0aADD A,@Ri ;(A)+((Ri))→(A) 累加器A中的內容與工作寄存器Ri所指向地址單元中的內容相加,結果存在A中 x0dx0ax0dx0a[2]. 帶進位加法指令(4條) x0dx0a這4條指令除與[1]功能相同外,在進行加法運算時還需考慮進位問題。 x0dx0ax0dx0aADDC A,data ;(A)+(data)+(C)→(A) 累加器A中的內容與直接地址單元的內容連同進位位相加,結果存在A中 x0dx0aADDC A,#data ;(A)+#data +(C)→(A) 累加器A中的內容與立即數連同進位位相加,結果存在A中 x0dx0aADDC A,Rn ;(A)+Rn+(C)→(A) 累加器A中的內容與工作寄存器Rn中的內容、連同進位位相加,結果存在A中 x0dx0aADDC A,@Ri ;(A)+((Ri))+(C)→(A) 累加器A中的內容與工作寄存器Ri指向地址單元中的內容、連同進位位相加,結果存在A中 x0dx0ax0dx0a[3]. 帶借位減法指令(4條) x0dx0a這組指令包含立即數、直接地址、間接地址及工作寄存器與累加器A連同借位位C內容相減,結果送回累加器A中。 x0dx0a這里我們對借位位C的狀態作出說明,在進行減法運算中,CY=1表示有借位,CY=0則無借位。OV=1聲明帶符號數相減時,從一個正數減去一個負數結果為負數,或者從一個負數中減去一個正數結果為正數的錯誤情況。在進行減法運算前,如果不知道借位標志位C的狀態,則應先對CY進行清零操作。 x0dx0ax0dx0aSUBB A,data ;(A)-(data) - (C)→(A) 累加器A中的內容與直接地址單元中的內容、連同借位位相減,結果存在A中 x0dx0aSUBB A,#data ;(A)-#data -(C)→(A) 累加器A中的內容與立即數、連同借位位相減,結果存在A中 x0dx0aSUBB A,Rn ;(A)-(Rn) -(C)→(A) 累加器A中的內容與工作寄存器中的內容、連同借位位相減,結果存在A中 x0dx0aSUBB A,@Ri ;(A)-((Ri)) -(C)→(A) 累加器A中的內容與工作寄存器Ri指向的地址單元中的內容、連同借位位相減,結果存在A中 x0dx0ax0dx0a[4]. 乘法指令(1條) x0dx0a這個指令的作用是把累加器A和寄存器B中的8位無符號數相乘,所得到的是16位乘積,這個結果低8位存在累加器A,而高8位存在寄存器B中。如果OV=1,說明乘積大於FFH,否則OV=0,但進位標志位CY總是等於0。 x0dx0ax0dx0aMUL AB ;(A)×(B)→(A)和(B) 累加器A中的內容與寄存器B中的內容相乘,結果存在A、B中 x0dx0ax0dx0a[5]. 除法指令(1條) x0dx0a這個指令的作用是把累加器A的8位無符號整數除以寄存器B中的8位無符號整數,所得到的商存在累加器A,而余數存在寄存器B中。除法運算總是使OV和進位標志位CY等於0。如果OV=1,表明寄存器B中的內容為00H,那麼執行結果為不確定值,表示除法有溢出。 x0dx0ax0dx0aDIV AB ;(A)÷(B)→(A)和(B) 累加器A中的內容除以寄存器B中的內容,所得到的商存在累加器A,而余數存在寄存器B中。 x0dx0ax0dx0a[6]. 加1指令(5條) x0dx0a這5條指令的的功能均為原寄存器的內容加1,結果送回原寄存器。上述提到,加1指令不會對任何標志有影響,如果原寄存器的內容為FFH,執行加1後,結果就會是00H。這組指令共有直接、寄存器、寄存器減間址等定址方式: x0dx0ax0dx0aINC A ;(A)+1→(A) 累加器A中的內容加1,結果存在A中 x0dx0aINC data ;(data)+1→(data) 直接地址單元中的內容加1,結果送回原地址單元中 x0dx0aINC @Ri ;((Ri))+1→((Ri)) 寄存器的內容指向的地址單元中的內容加1,結果送回原地址單元中 x0dx0aINC Rn ;(Rn)+1→(Rn)寄存器Rn的內容加1,結果送回原地址單元中 x0dx0aINC DPTR ;(DPTR)+1→(DPTR)數據指針的內容加1,結果送回數據指針中 x0dx0ax0dx0a在INC data這條指令中,如果直接地址是I/O,其功能是先讀入I/O鎖存器的內容,然後在CPU進行加1操作,再輸出到I/O上,這就是「讀—修改—寫」操作。 x0dx0ax0dx0a[7]. 減1指令(4條) x0dx0a這組指令的作用是把所指的寄存器內容減1,結果送回原寄存器,若原寄存器的內容為00H,減1後即為FFH,運算結果不影響任何標志位,這組指令共有直接、寄存器、寄存器間址等定址方式,當直接地址是I/O口鎖存器時,「讀—修改—寫」操作與加1指令類似。 x0dx0ax0dx0aDEC A ;(A)-1→(A)累加器A中的內容減1,結果送回累加器A中 x0dx0aDEC data ;(data)-1→(data)直接地址單元中的內容減1,結果送回直接地址單元中 x0dx0aDEC @Ri ;((Ri))-1→((Ri))寄存器Ri指向的地址單元中的內容減1,結果送回原地址單元中 x0dx0ax0dx0aDEC Rn ;(Rn)-1→(Rn)寄存器Rn中的內容減1,結果送回寄存器Rn中 x0dx0ax0dx0a[8]. 十進制調整指令(1條) x0dx0a在進行BCD碼運算時,這條指令總是跟在ADD或ADDC指令之後,其功能是將執行加法運算後存於累加器A中的結果進行調整和修正。 x0dx0ax0dx0aDA A x0dx0ax0dx0aMCS-51邏輯運算及移位指令 x0dx0ax0dx0a邏輯運算和移位指令共有25條,有與、或、異或、求反、左右移位、清0等邏輯操作,有直接、寄存器和寄存器間址等定址方式。這類指令一般不影響程序狀態字(PSW)標志。 x0dx0ax0dx0a[1]. 循環移位指令(4條) x0dx0a這4條指令的作用是將累加器中的內容循環左或右移一位,後兩條指令是連同進位位CY一起移位。 x0dx0ax0dx0aRL A ;累加器A中的內容左移一位 x0dx0aRR A ;累加器A中的內容右移一位 x0dx0aRLC A ;累加器A中的內容連同進位位CY左移一位 x0dx0aRRC A ;累加器A中的內容連同進位位CY右移一位 x0dx0ax0dx0a[2]. 累加器半位元組交換指令(1條) x0dx0a這條指令是將累加器中的內容高低半位元組互換,這在上一節中內容已有介紹。 x0dx0ax0dx0aSWAP A ; 累加器中的內容高低半位元組互換 x0dx0ax0dx0a[3]. 求反指令(1條) x0dx0a這條指令將累加器中的內容按位取反。 x0dx0ax0dx0aCPL A ; 累加器中的內容按位取反 x0dx0ax0dx0a[4]. 清零指令(1條) x0dx0a這條指令將累加器中的內容清0。 x0dx0ax0dx0aCLR A ; 0→(A),累加器中的內容清0 x0dx0ax0dx0a[5]. 邏輯與操作指令(6條) x0dx0a這組指令的作用是將兩個單元中的內容執行邏輯與操作。如果直接地址是I/O地址,則為「讀—修改—寫」操作。 x0dx0ax0dx0aANL A,data ;累加器A中的內容和直接地址單元中的內容執行與邏輯操作。結果存在寄存器A中。 x0dx0aANL data,#data ;直接地址單元中的內容和立即數執行與邏輯操作。結果存在直接地址單元中。 x0dx0aANL A,#data ;累加器A的內容和立即數執行與邏輯操作。結果存在累加器A中。 x0dx0aANL A,Rn ;累加器A的內容和寄存器Rn中的內容執行與邏輯操作。結果存在累加器A中。 x0dx0aANL data,A ;直接地址單元中的內容和累加器A的內容執行與邏輯操作。結果存在直接地址單元中。 x0dx0aANL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行與邏輯操作。結果存在累加器A中。 x0dx0ax0dx0a[6]. 邏輯或操作指令(6條) x0dx0a這組指令的作用是將兩個單元中的內容執行邏輯或操作。如果直接地址是I/O地址,則為「讀—修改—寫」操作。 x0dx0ax0dx0aORL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯或操作。結果存在寄存器A中。 x0dx0aORL data,#data ;直接地址單元中的內容和立即數執行邏輯或操作。結果存在直接地址單元中。 x0dx0aORL A,#data ;累加器A的內容和立即數執行邏輯或操作。結果存在累加器A中。 x0dx0aORL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯或操作。結果存在累加器A中。 x0dx0aORL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯或操作。結果存在直接地址單元中。 x0dx0aORL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯或操作。結果存在累加器A中。 x0dx0ax0dx0a[7]. 邏輯異或操作指令(6條) x0dx0a這組指令的作用是將兩個單元中的內容執行邏輯異或操作。如果直接地址是I/O地址,則為「讀—修改—寫」操作。 x0dx0ax0dx0aXRL A,data ;累加器A中的內容和直接地址單元中的內容執行邏輯異或操作。結果存在寄存器A中。 x0dx0aXRL data,#data ;直接地址單元中的內容和立即數執行邏輯異或操作。結果存在直接地址單元中。 x0dx0aXRL A,#data ;累加器A的內容和立即數執行邏輯異或操作。結果存在累加器A中。 x0dx0aXRL A,Rn ;累加器A的內容和寄存器Rn中的內容執行邏輯異或操作。結果存在累加器A中。 x0dx0aXRL data,A ;直接地址單元中的內容和累加器A的內容執行邏輯異或操作。結果存在直接地址單元中。 x0dx0aXRL A,@Ri ;累加器A的內容和工作寄存器Ri指向的地址單元中的內容執行邏輯異或操作。結果存在累加器A中。 x0dx0ax0dx0aMCS-51控制轉移指令 x0dx0ax0dx0a控制轉移指令用於控製程序的流向,所控制的范圍即為程序存儲器區間,MCS-51系列單片機的控制轉移指令相對豐富,有可對64kB程序空間地址單元進行訪問的長調用、長轉移指令,也有可對2kB位元組進行訪問的絕對調用和絕對轉移指令,還有在一頁范圍內短相對轉移及其它無條件轉移指令,這些指令的執行一般都不會對標志位有影響。 x0dx0ax0dx0a[1]. 無條件轉移指令(4條) x0dx0a這組指令執行完後,程序就會無條件轉移到指令所指向的地址上去。長轉移指令訪問的程序存儲器空間為16地址64kB,絕對轉移指令訪問的程序存儲器空間為11位地址2kB空間。 x0dx0ax0dx0aLJMP addr16 ;addr16→(PC),給程序計數器賦予新值(16位地址) x0dx0ax0dx0aAJMP addr11 ;(PC)+2→(PC),addr11→(PC 10-0 )程序計數器賦予新值(11位地址),(PC 15-11 )不改變 x0dx0ax0dx0aSJMP rel ;(PC)+ 2 + rel→(PC)當前程序計數器先加上2再加上偏移量給程序計數器賦予新值 x0dx0ax0dx0aJMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址單元的值加上數據指針的值給程序計數器賦予新值 x0dx0ax0dx0a[2]. 條件轉移指令(8條) x0dx0a程序可利用這組豐富的指令根據當前的條件進行判斷,看是否滿足某種特定的條件,從而控製程序的轉向。 x0dx0ax0dx0aJZ rel ; A=0,(PC)+ 2 + rel→(PC),累加器中的內容為0,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0aJNZ rel ; A≠0,(PC)+ 2 + rel→(PC),累加器中的內容不為0,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0aCJNE A, data, rel ; A≠(data),(PC)+ 3 + rel→(PC),累加器中的內容不等於直接地址單元的內容,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0aCJNE A, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),累加器中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0aCJNE Rn, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Rn中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0aCJNE @Ri, #data, rel ; A≠#data,(PC)+ 3 + rel→(PC),工作寄存器Ri指向地址單元中的內容不等於立即數,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0aDJNZ Rn, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)工作寄存器Rn減1不等於0,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0aDJNZ data, rel ; (Rn)-1→(Rn),(Rn)≠0,(PC)+ 2 + rel→(PC)直接地址單元中的內容減1不等於0,則轉移到偏移量所指向的地址,否則程序往下執行 x0dx0ax0dx0a[3]. 子程序調用指令(1條) x0dx0a子程序是為了便於程序編寫,減少那些需反復執行的程序佔用多餘的地址空間而引入的程序分支,從而有了主程序和子程序的概念,需要反復執行的一些程序,我們在編程時一般都把它們編寫成子程序,當需要用它們時,就用一個調用命令使程序按調用的地址去執行,這就需要子程序的調用指令和返回指令。 x0dx0ax0dx0aLCALL addr16 ; 長調用指令,可在64kB空間調用子程序。此時(PC)+ 3→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr16→(PC),即分別從堆棧中彈出調用子程序時壓入的返回地址 x0dx0ax0dx0aACALL addr11 ; 絕對調用指令,可在2kB空間調用子程序,此時(PC)+ 2→(PC),(SP)+ 1→(SP),(PC 7-0 )→(SP),(SP)+ 1→(SP),(PC 15-8 )→(SP),addr11→(PC 10-0 ) x0dx0ax0dx0aRET ; 子程序返回指令。此時(SP)→(PC 15-8 ),(SP)- 1→(SP),(SP)→(PC 7-0 ),(SP)- 1→(SP) x0dx0ax0dx
G. 單片機實驗中,怎麼用匯編比較大小
單片機實驗中,用匯編語言編程比較兩個數大小,主要用SUBB減法指令,也可以使用CJNE指令。示常式序如下:
;啟動入口
ORG
0000H
;復位啟動
LJMP
START
;
ORG
0100H
;
;
;主控程序
START:
MOV
R0,#30H
MOV
X,#0
MOV
Y,#0
LOOP:
MOV
A,@R0
CLR
C
SUBB
A,#111
JNC
NEXT
CPL
C
MOV
A,@R0
SUBB
A,Y
JC
NUM
MOV
Y,@R0
NUM:
MOV
A,@R0
SUBB
A,#60
JC
INCR0
INC
X
INCR0:
INC
R0
JMP
LOOP
NEXT:
JMP
$
;
X
EQU
20H
;
Y
EQU
21H
;
END
;