Re: [問題] 新手學8051,請教各位

看板ASM (組合語言)作者 (Knives)時間16年前 (2008/03/23 03:45), 編輯推噓3(304)
留言7則, 6人參與, 最新討論串2/2 (看更多)
※ 引述《shen0410 (祐子)》之銘言: : 最近在學8051 : 看到書上有一篇程式碼 org 00h ;設定起始程式碼 jmp start ;無條件跳躍到start,不寫這行也會往下執行到start start: mov a,#00000001b ;丟八個燈,最右邊的暗(吧?)到A累加器,b代表二進位, ;一個二進位bit對應到一個P1.0,1.1這樣子過去 mov r0,#8 ;把R0丟數字八進去 loop: mov p1,a ;把你丟到a的那串二進位放到P1,你接LED燈的Port 1 ;你沒寫P1.0,P1.1 他就一次丟八個Bit call delay ;呼叫delay,因為你沒有delay,執行的速度非常的快 ;你看不出來是哪個有暗,因為他順移過去, ;人眼跟不到,所以才加Delay rl a ;將你剛剛丟到A的左移一個,A會變成00000010B ;所以你的燈下次,跑到p1的時候,暗的那個燈會 ;左邊移一格,(RL因該是不含進位旗標吧) djnz r0,loop ;R0-1判斷是否為零,如果是0的話就往下執行 ;不為0的時候跳到loop,因為你剛剛一開始設定 ;R0=8,所以他會跑八次,剛好暗的燈移到最左邊 delay: ;Delay這段就是設定讓他跑迴圈,可是我實在懶的算 mov r7,#200 ;你就以後都這樣Call就好,別太計較了XDXD d1: mov r6,#200 djnz r6,$ ;$這個用法好像怪怪的? djnz r7,d1 ret ;你執行了這堆空回圈以後回去call delay ;的那行繼續往下執行 end ;end結束,打完收工 : 可是對照書上的指令又看不懂 : 希望高手可以慢慢解釋給我聽,謝謝 我沒翻書 人腦單步執行 如果有錯不要怪我XDXD 還有搞懂一下間接定址,直接定址mov @,#那些所代表的意思 這樣子寫程式比較有幫助,暫存器沒這麼多可以給你用XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.229.79.23 ※ 編輯: Kniveschou 來自: 61.229.79.23 (03/23 03:46)

03/23 03:48, , 1F
這篇文章 居然是183元 ......囧
03/23 03:48, 1F

03/23 11:17, , 2F
$把它想像成 d2 djnz r6,d2 這樣就好了...
03/23 11:17, 2F

03/23 13:55, , 3F
jmp $+2 往下跳兩行 $-1網上跳一行 jmp $ 就是原地跳
03/23 13:55, 3F

03/23 14:27, , 4F
樓上 $+2 不是往下跳兩行 是跳兩個byte
03/23 14:27, 4F

03/28 09:52, , 5F
jmp $+2 剛好 2 byte 所以就是到下一個指令 , 當 delay 用
03/28 09:52, 5F

05/03 22:59, , 6F
delay 時間太短了. 最好r6,r7都用255. 必要時call 兩次.
05/03 22:59, 6F

05/03 23:00, , 7F
暫存器有32個, 還不夠? (4個rb分頁)
05/03 23:00, 7F
文章代碼(AID): #17vM7q4Y (ASM)
討論串 (同標題文章)
文章代碼(AID): #17vM7q4Y (ASM)