<track id="bbf7f"></track>

      <pre id="bbf7f"><ruby id="bbf7f"></ruby></pre>

        本公司不接受任何形式的推銷,只接受電子郵件。
        西安西保特工電力自動化有限公司

        公司地址:陜西省西安市高新區高新路88號尚品國際6幢
        公司郵箱:xibaotegong@aliyun.com
        公司電話:029-88997932
        公司網址:www.www.jtcwg.com

        詳細信息

        您現在的位置:網站首頁 >> 常見問題 >> 產品知識 >> 詳細信息

        數據傳送類指令分析

        發布時間:2018-07-18  瀏覽:1954次  字號:  

         數據傳送類指令的通用格式是:

        MOV  <目的操作數>,<源操作數>

        源操作數可以是:累加器A、通用寄存器Rnn=0-7)、直接地址direct、間接地址和立即數;

        目的操作數可以是:累加器A、通用寄存器Rnn=0-7)、直接地址direct和間接地址;

         數據傳送指令共有29條,數據傳送指令一般的操作是把源操作數傳送到目的操作數,指令執行完成后,源操作數不變,目的操作數等于源操作數。如果要求在進行數據傳送時,目的操作數不丟失,則不能用直接傳送指令,而采用交換型的數據傳送指令,數據傳送指令不影響標志C,ACOV,但可能會對奇偶標志P有影響。

        [1]. 
        以累加器A為目的操作數類指令(4條)
            
        4條指令的作用是把源操作數指向的內容送到累加器A。有直接、立即數、寄存器和寄存器間接尋址方式:

        MOV  A,direct     ;dataA) 直接單元地址中的內容送到累加器A,direct是直接地址
        MOV  A,#data    ;#data→A) 立即數送到累加器A
        MOV  A,Rn      ;RnA Rn中的內容送到累加器A中,Rn=R1-R7
        MOV  A,@Ri     ;((Ri))A Ri內容指向的地址單元中的內容送到累加器A,Ri=R0R1

        下面舉個例子跟大家說明:
        MOV  A
        ,R1 ;將工作寄存器R1中的值送入到累加器A中,R1中的值保持不變。
        MOV  A
        ,50H;將內存50H單元中的值送入到累加器A中,50H單元中的值保持不變。
        MOV  A
        ,@R1;先看R1中是什么值,把這個值當做地址,并將這個地址單元中的值送入累加器A中,前面我們已學過,這是寄存器間接尋址方式。

        [2]. 
        以寄存器Rn為目的操作數的指令(3條)
            3條指令的功能是把源操作數指定的內容送到所選定的工作寄存器Rn中,源操作數不變。有直接、立即和寄存器尋址方式:

        MOV  Rn,data     ;dataRn) 直接尋址單元中的內容送到寄存器Rn
        MOV  Rn,#data    ;#data→Rn)立即數直接送到寄存器Rn
        MOV  Rn,A        ;ARn) 累加器A中的內容送到寄存器Rn

        [3]. 
        以直接地址為目的操作數的指令(5條)
            
        這組指令的功能是把源操作數指定的內容送到由直接地址data所選定的片內RAM中。有直接、立即、寄存器和寄存器間接4種尋址方式:

        MOV  data,data   ;datadata) 直接地址單元中的內容送到直接地址單元
        MOV  data,#data ;#data→data) 立即數送到直接地址單元
        MOV  data,A     ;Adata) 累加器A中的內容送到直接地址單元
        MOV  data,Rn    ;Rndata) 寄存器Rn中的內容送到直接地址單元
        MOV  data,@Ri   ;((Ri))data) 寄存器Ri中的內容指定的地址單元中數據送到直接地址單元

        試比較一下MOV  50H,#60HMOV  50H,60H的區別

        [4]. 
        以間接地址為目的操作數的指令(3條)
            
        這組指令的功能是把源操作數指定的內容送到以Ri中的內容為地址的片內RAM中。有直接、立即和寄存器3種尋址方式:

        MOV  @Ri,data    ;data((Ri)) 直接地址單元中的內容送到以Ri中的內容為地址的RAM單元
        MOV  @Ri,#data   ;#data→((Ri))立即數送到以Ri中的內容為地址的RAM單元
        MOV  @Ri,A       ;A((Ri)) 累加器A中的內容送到以Ri中的內容為地址的RAM單元

        試比較一下MOV R0,20HMOV  @R0,20H的區別

        [5]. 
        查表指令(2條)
            這組指令的功能是對存放于程序存儲器中的數據表格進行查找傳送,使用變址尋址方式:

        MOVC  A,@A+DPTR   ;((A))+DPTRA) 表格地址單元中的內容送到累加器A
        MOVC  A,@A+PC     ;((PC))+1→A),((A))+PCA) 表格地址單元中的內容送到累加器A

        本指令是將ROM的數據送入A中,本指令也被稱為查表指令,常用此指令來查一個已做好在ROM中的表格。
        說明:
        1
        、此條指令引出了一個特殊的尋址方式,即變址尋址,在上節課時我們已進行過講解,本指令是要在ROM的一個地址單元中找出數據,顯然必須知道這個單元的地址,這個單元的地址是這樣確定的:在執行本指令立腳點DPTR中有一個數,A中有一個數,執行指令時,將ADPTR中的數加起來,就成為要查找單元的地址。
        2
        、查找到的結果被放在A中,因此,本條指令執行前后,A中的值不一定相同。
        例:有一個數在R0中,要求用查表的方法確定它的平方值(此數的取值范圍是0-5
              MOV  DPTR,#TABLE
              MOV  A,R0
              MOVC A,@A+DPTR
        TABLE:DB   0,1,4,9,16,25
        R0中的值為2,送入A中,而DPTR中的值則為TABLE,則最終確定的ROM單元的地址就是TABLE+2,也就是到這個單元中去取數,取到的是4,顯然它正是2的平方。其它數據也可以類推
        標號的真實含義:從這個地方也可以看到另一個問題,我們使用了標號來替代具體的單元地址。事實上,標號的真實含義就是地址數值。在這里它代表了0,1,4,9,16,25這幾個數據在ROM中存放的起點位置。我們經?吹降闹噶,如LCALL DELAY指令中,DELAY則代表了以DELAY為標號的那段程序在ROM中存放的起始地址。事實上,CPU正是通過這個地址才找到這段程序的。
        可以通過以下的例子再來看看標號的含義:
        MOV  DPTR,#100H
        MOV  A,R0
        MOVC A,@A+DPTR
        .....
        ORG  0100H
        DB   0,1,4,9,16,25
        如果R0中的值為2,則最終地址為100H+2102H,到102H單元中找到的是4。這樣應看明白了吧?
        那么為什么不這樣寫程序,要用標號呢?不是增加疑惑嗎?
        如果這樣寫程序的話,在寫程序時,我們就必須確定這張表格在ROM中的具體的位置,如果寫完程序后,又想在這段程序前插入一段程序,那么這張表格的位置就又要改變了,要改為ORG  100H這句話了,我們是經常需要修改程序的,那么麻煩,所以就用標號來替代,只要一編譯程序,位置就自動發生變化,我們把這個麻煩的事交給計算機去做了。

        [6]. 
        累加器A與片外數據存儲器RAM傳送指令(4條)
            
        4條指令的作用是累加器A與片外RAM間的數據傳送。使用寄存器尋址方式:

        MOVX  @DPTR,A    ;A((DPTR)) 累加器中的內容送到數據指針指向片外RAM地址中
        MOVX  A, @DPTR   ;((DPTR))A) 數據指針指向片外RAM地址中的內容送到累加器A
        MOVX  A, @Ri     ;((Ri))A) 寄存器Ri指向片外RAM地址中的內容送到累加器A
        MOVX  @Ri,A      ;A((Ri)) 累加器中的內容送到寄存器Ri指向片外RAM地址中

        說明:
        1、在89C51中,與外部存儲器RAM打交道的只可以是累加器A,所有需要送入外部RAM的數據必須要通過A送出去。而所有要讀入外部RAM中的數據也必需要通過A讀入。在此我們可以看出外部RAM的區別了。
        內部RAM間可以直接進行數據傳遞,而外部則不行。比如,要將外部RAM中某單元(設為110H單元的數據)送入另外一個單元(設為200H單元),也必須要先將110H單元中的內容讀入A,然后再送入200H單元中去。

        2、要讀寫外部的RAM,當然也必須要先知道RAM的地址,在后兩條指令中,地址是被地址放在DPTR中的,而前兩條指令,由于Ri(即R0R1)只是一個8位的寄存器,所以只能提供低8位地址,因為有時擴展的外部RAM的數量比較少,少于或等于256個,就只需提供8位地址就足夠了。請大家再復習下我們前面《51單片機的尋址方式》這節課。

        3、使用時應當首先將要讀或寫的地址送入DPTRRi中,然后再用讀寫命令。
        例:將外部RAM100H單元中的內容送入外部RAM200H單元中。
            MOV  DPTR
        ,#0100H
            MOVX A
        ,@DPTR
            MOV  DPTR
        ,#0200H
            MOVX @DPTR
        ,A


        [7]. 
        堆棧操作類指令(2條)
            4類指令的作用是把直接尋址單元的內容傳送到堆棧指針SP所指的單元中,以及把SP所指單元的內容送到直接尋址單元中。這類指令只有兩條,下述的第一條常稱為入棧操作指令,第二條稱為出棧操作指令。需要指出的是,單片機開機復位后,(SP)默認為07H,但一般都需要重新賦值,設置新的SP首址。入棧的第一個數據必須存放于SP+1所指存儲單元,故實際的堆棧底為SP+1所指的存儲單元。

        PUSH  data   ;SP+1→SP),(dataSP) 堆棧指針首先加1,直接尋址單元中的數據送到堆棧指針SP所指的單元中
        POP  data    ;SPdata)(SP-1→SP), 堆棧指針SP所指的單元數據送到直接尋址單元中,堆棧指針SP再進行減1操作

        第一條指令稱為推入,就是將direct中的內容送入堆棧中,第二條指令稱為彈出,就是將堆棧中的內容送回到direct中,推入指令的執行過程是:首先將P中的值加1,然后把SP中的值當做地址,將direct中的值送入以SP中的值為地址的RAM單元中去。
        例:
        MOV  SP
        ,#5FH
        MOV  A
        ,#100
        MOV  B
        ,#20
        PUSH ACC
        PUSH B
        執行第一條PUSH ACC指令是這樣的:將SP中的值加1,即變為60H,然后將A中的值送到60H單元中,因此執行完本條指令后,內存60H單元中的值就是100,同樣執行PUSH B時,是將SP+1,即變為61H,然后將B中的值送入到61H單元中,即執行完本條指令后61H單元中的值變為20。
        POP
        指令的執行也是這樣的,首先將SP中的值做為地址,并將此地址中的數送到POP指令的那個direct中,然后SP1。
        接上例:
        POP  B
        POP  ACC
        則執行過程是:將SP中的值(現在是61H)作為地址,取61H單元中的數值(現在是20),送到B中,所以執行完本條指令后B中的值是20,然后SP1,因此本條指令執行完后,SP的值變為60H,然后搪行POP ACC,將SP中的值(60H)作為地址,從該地址中取數(現在是100),并送到ACC中,所以執行完本條指令后,ACC中的值是100。
        這有什么意義呢?ACC中的值本來就是100,B中的值本來就是20,是的,在本例中,的確沒有意義,但在實際工作中,則在PUSH B后往事要執行其它的指令,而且這些指令會把A中的值,B中的值改掉,所以在程序結束,如果我們要把AB中的值恢復原值,那么這些指令就沒有意義了。
        還有一個問題,如果我們不用堆棧,比如說在PUSH  ACC指令處用MOV 60H,APUSH  B處用指令MOV  61H,B,然后用MOV  A,60H,MOV  B,61H來替代兩處POP指令,不也是一樣嗎?是的,從結果上看是一樣的,但從過程看是不一樣的,PUSHPOP指令都是單字節,單周期指令,而MOV指令則是雙字節,雙周期指令,更何況,堆棧的作用不止于此,所以一般的計算機上都設有堆棧,而我們在編寫子程序,需要保存數據時,通常不采用后面的方法,而是用堆棧的方法來實現。
        例:寫出以下程序的運行結果
        MOV  30H
        ,#12
        MOV  31H
        ,#23
        PUSH 30H
        PUSH 31H
        POP  30H
        POP  31H
         
        結果是30H中的值變為23,而31H中的值則變為12。也就是兩者進行了數據交換。從這個例子可以看出:使用堆棧時,入棧的書寫順序和出棧的書寫順序必須相反,才能保證數據被送回原位,否則就出錯了。
        另外特別注意事項:
        進行堆棧操作時,我們不能:
        PUSH  R0
        PUSH  R1
        而只能:
        PUSH  00H
        PUSH  01H
        POP
        也是一樣。

        [8]. 交換指令(5條)
            5條指令的功能是把累加器A中的內容與源操作數所指的數據相互交換。

        XCH      A,Rn    ;A←→Rn)累加器與工作寄存器Rn中的內容互換
        XCH      A,@Ri   ;A←→((Ri))累加器與工作寄存器Ri所指的存儲單元中的內容互換
        XCH      A,data  ;A←→data)累加器與直接地址單元中的內容互換
        XCHD   A,@Ri  ;A3-0←→((Ri3-0)累加器與工作寄存器Ri所指的存儲單元中的內容低半字節互換
        SWAP   A      ;A3-0←→A7-4)累加器中的內容高低半字節互換

        [9]. 16
        位數據傳送指令(1條)
            
        這是89C51單片機唯一的一條16位立即數傳遞指令,其功能是將一個16位的立即數送入數據指針DPTR中去。其中高8位送入DPH,低8位送入DPL。

        MOV  DPTR,#data16  ;#dataH→DPH),#dataL→DPL16位常數的高8位送到DPH,低8位送到DPL

        例如:MOV DPTR,#2345

        則執行完程序后,DPL中的值為23,DPL中的值為45。

         

        本公司不接受任何形式的推銷,只接受電子郵件。
        陜公網安備ICP15014344© 2021
        地址:陜西省西安市高新區高新路88號尚品國際6幢 郵箱:xibaotegong@aliyun.com
          西安西保特工電力自動化有限公司 版權所有 

         

        中国国产区91最新更新,国产系列丝袜熟女精品网站,国产在线不卡精品网站,97se国产在线,亚洲精品国产自在现线,亚洲欧美成 人 在线播放,欧美偷窥清纯综合图区