程式碼如下
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 上無法執行,因為老師打的程式碼:為了方便說明先在 external Data RAM中存放一些值,但是因為此題範圍有點大,所以並不全部輸入,用部分的值來說明,如下圖所示。
cjne dph,#HIGH(last_dest_add+1), AGAIN
這段 dph 應改為 A才對,否則可能在uv3上Build時會出現以下錯誤碼
1.a(30): error A39: REGISTER OPERAND EXPECTED
前面定義的程式碼就不說明了,所以我從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的地方
一樣我們利用 dph 與 dpl
執行 mov dph, dest_dph_buf 時(左圖) ;因為原先dptr為3001,執行完此行時會變7001H
執行 mov dpl, dest_dpl_buf 時(右圖) ;而變成7001之後再因dpl而變成7000H
PS:因為前面我們有寫下以下兩行程式碼,而dest_add為7000H
mov dest_dph_buf, #HIGH(dest_add)mov dest_dpl_buf, #LOW(dest_add)
所以現在的dest_dph_buf 與dest_dpl_buf分別為70 與00
然後執行movx @dptr, A時
原本3000H的01就會被我們轉移到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
看過文章之後歡迎留下您寶貴的意見喔!