Social Icons

twitterfacebookgoogle plusrss feedemail

12/04/2009

微處理機-Data Movement Practices-(2)

2. Move data from external Data RAM 3000H-3FFFH to external data RAM 7000H-7FFFH.
程式碼如下
      source_add equ 3000H
      dest_add equ 7000H
      last_dest_add equ 7FFFH

      source_dph_buf equ 30H
      source_dpl_buf equ 31H
      dest_dph_buf equ 32H
      dest_dpl_buf equ 33H

      mov source_dph_buf, #HIGH(source_add)
      mov source_dpl_buf, #LOW(source_add)
      mov dest_dph_buf, #HIGH(dest_add)
      mov dest_dpl_buf, #LOW(dest_add)

AGAIN:
     mov dph, source_dph_buf
     mov dpl, source_dpl_buf 
     movx A, @dptr
     inc dptr
     mov source_dph_buf, dph
     mov source_dpl_buf, dpl

     mov dph, dest_dph_buf
     mov dpl, dest_dpl_buf
     movx @dptr, A
     inc dptr 
     mov dest_dph_buf, dph
     mov dest_dpl_buf, dpl

     mov A,dph
     cjne A,#HIGH(last_dest_add+1), AGAIN
     nop
     end
如果要複製上方程式碼,請點擊程式碼上方的    圖示會跳出一個視窗,複製即可
請注意一下,老師在(09.12.04)課堂上打的code程式碼中與上面程式碼有點不同,老師的程式碼在 uv3 上無法執行,因為老師打的程式碼: 
cjne    dph,#HIGH(last_dest_add+1), AGAIN
這段 dph 應改為 A才對,否則可能在uv3上Build時會出現以下錯誤碼
1.a(30): error A39: REGISTER OPERAND EXPECTED
為了方便說明先在 external Data RAM中存放一些值,但是因為此題範圍有點大,所以並不全部輸入,用部分的值來說明,如下圖所示。






















前面定義的程式碼就不說明了,所以我從AGAIN後面開始說明起
因為DPTR是由 dph dpl 兩個組成所以我們可以先將3000H dph dpl表示
     mov dph, source_dph_buf    ;將30放到dph
     mov dpl, source_dpl_buf       ;將00放到dpl


























當我們執行完上面程式碼後接下來會執行movx A, @dptr
當此段程式碼執行結束之後
A會存放3000H裡面的值  (請看第一張圖,3000H的值我剛設定為01)

























A存放01之後,我們將dptr+1

做這個動作主要是做迴圈時的會用到(第16.17行)
  inc dptr
  mov dest_dph_buf, dph  ;將30H放到dest_dph_buf
  mov dest_dpl_buf, dpl    ;將31H放到dest_dpl_buf


























然後我們再來就是要將剛剛所存放在A的值把它移到7000H的地方
一樣我們利用 dphdpl 
執行 mov dph, dest_dph_buf 時(左圖)  ;因為原先dptr3001,執行完此行時會變7001H
執行 mov dpl, dest_dpl_buf    時(右圖) ;而變成7001之後再因dpl而變成7000H

PS:因為前面我們有寫下以下兩行程式碼,而dest_add7000H 
mov    dest_dph_buf, #HIGH(dest_add)
mov    dest_dpl_buf, #LOW(dest_add)
所以現在的dest_dph_bufdest_dpl_buf分別為7000
     



 






































然後執行movx @dptr, A
原本3000H01就會被我們轉移到7000H的地方











接下來我們要把dptr+1,然後做跟剛剛一樣的動作,
做這個動作主要是迴圈時的會用到 (第23.24行)
      inc dptr
      mov dest_dph_buf, dph  ;將70H放到dest_dph_buf
      mov dest_dpl_buf, dpl     ;將71H放到dest_dpl_buf


程式到這邊已經到一個段落
但是程式如果只寫迴圈,那麼它就會一直做下去不會停止
所以我們就要利用 cjne 來使程式停止
程式如果要停止表示程式已經把3000H-3FFFH記憶體裡的值全部移到 7000H-7FFFH中了
所以最後的 dptr 應該為8000H,所以我們只要判斷dph是否為80就可以達成停止程式。


所以我們將 dph 值存到 A
然後判斷如果 A 80 則跳出迴圈,不為 80 則跳到AGAIN繼續跑迴圈
      mov A,dph
      cjne A,#HIGH(last_dest_add+1), AGAIN

最後這段程式碼跟老師的不同
因為老師可能沒注意寫的語法有誤
 不過改過來就可以正常執行了


如果發現文章中有錯誤,歡迎留言告知


沒有留言:

張貼留言

俗話說
凡走過必留下痕跡,凡住過必留下鄰居
凡爬過必留下樓梯,凡來過必留下IP
看過文章之後歡迎留下您寶貴的意見喔!

 
 
无觅相关文章插件,迅速提升网站流量