Submit Search
Upload
Lab2在幹嘛
•
0 likes
•
616 views
F
F74011297
Follow
104學年度成功大學微微算機原理與應用實驗課 2015/10/05 乙班lab2 MSP430簡單語法解說 Addressing mode簡單解說
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 80
Download Now
Download to read offline
Recommended
系統程式 - 第二章
系統程式 - 第二章
鍾誠 陳鍾誠
系統程式 -- 第 11 章 嵌入式系統
系統程式 -- 第 11 章 嵌入式系統
鍾誠 陳鍾誠
系統程式 -- 第 9 章 虛擬機器
系統程式 -- 第 9 章 虛擬機器
鍾誠 陳鍾誠
Scala function-and-closures
Scala function-and-closures
wang hongjiang
functional-scala
functional-scala
wang hongjiang
系統程式 -- 第 2 章
系統程式 -- 第 2 章
鍾誠 陳鍾誠
第1章 入门
第1章 入门
Runa Jiang
系統程式 -- 附錄
系統程式 -- 附錄
鍾誠 陳鍾誠
More Related Content
What's hot
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
鍾誠 陳鍾誠
系統程式 - 附錄
系統程式 - 附錄
鍾誠 陳鍾誠
[若渴計畫]64-bit Linux Return-Oriented Programming
[若渴計畫]64-bit Linux Return-Oriented Programming
Aj MaChInE
系統程式 -- 第 3 章 組合語言
系統程式 -- 第 3 章 組合語言
鍾誠 陳鍾誠
第11章 目标代码生成
第11章 目标代码生成
tjpucompiler
黑客终极语言——Lisp
黑客终极语言——Lisp
Rui Peng
Php extension开发
Php extension开发
thinkinlamp
程式設計師的自我修養 Chapter 10 記憶體
程式設計師的自我修養 Chapter 10 記憶體
Shu-Yu Fu
Nio trick and trap
Nio trick and trap
dennis zhuang
系統程式 -- 第 5 章 連結與載入
系統程式 -- 第 5 章 連結與載入
鍾誠 陳鍾誠
Execution
Execution
Angel Boy
实验五 读者 写者问题
实验五 读者 写者问题
jason1114
What's hot
(12)
系統程式 -- 第 4 章 組譯器
系統程式 -- 第 4 章 組譯器
系統程式 - 附錄
系統程式 - 附錄
[若渴計畫]64-bit Linux Return-Oriented Programming
[若渴計畫]64-bit Linux Return-Oriented Programming
系統程式 -- 第 3 章 組合語言
系統程式 -- 第 3 章 組合語言
第11章 目标代码生成
第11章 目标代码生成
黑客终极语言——Lisp
黑客终极语言——Lisp
Php extension开发
Php extension开发
程式設計師的自我修養 Chapter 10 記憶體
程式設計師的自我修養 Chapter 10 記憶體
Nio trick and trap
Nio trick and trap
系統程式 -- 第 5 章 連結與載入
系統程式 -- 第 5 章 連結與載入
Execution
Execution
实验五 读者 写者问题
实验五 读者 写者问题
Viewers also liked
8086 instruction set
8086 instruction set
jemimajerome
Shift rotate
Shift rotate
fika sweety
[ASM]Lab7
[ASM]Lab7
Nora Youssef
Addressing mode of 8051
Addressing mode of 8051
Nitin Ahire
8051 addressing
8051 addressing
Sharique Mulla
8051 Microcontroller Notes
8051 Microcontroller Notes
Dr.YNM
Viewers also liked
(6)
8086 instruction set
8086 instruction set
Shift rotate
Shift rotate
[ASM]Lab7
[ASM]Lab7
Addressing mode of 8051
Addressing mode of 8051
8051 addressing
8051 addressing
8051 Microcontroller Notes
8051 Microcontroller Notes
Similar to Lab2在幹嘛
89S51電路板
89S51電路板
casiolike0531
系統程式 -- 附錄
系統程式 -- 附錄
鍾誠 陳鍾誠
9789572239940 試閱章節
9789572239940 試閱章節
TAAZE 讀冊生活
Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍
dennis zhuang
Excel vba實務應用 第3天
Excel vba實務應用 第3天
明和 蔡
Godson x86
Godson x86
bingbuidea
Serverless Event Streaming with Pulsar Functions-xiaolong
Serverless Event Streaming with Pulsar Functions-xiaolong
StreamNative
Bash入门基础篇
Bash入门基础篇
Zhiyao Pan
Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫
Kito Cheng
Erlang jiacheng
Erlang jiacheng
Air-Smile
Intro to svn
Intro to svn
Yingshiuan Pan
COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺
宗凡 楊
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺
hydai
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
ykdsg
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry by will zhou
Will Zhou
数字电路复习
数字电路复习
zhaowmm
6, awk
6, awk
ted-xu
文本序列标注模型:从Crf到rnn
文本序列标注模型:从Crf到rnn
Yunchao He
Similar to Lab2在幹嘛
(18)
89S51電路板
89S51電路板
系統程式 -- 附錄
系統程式 -- 附錄
9789572239940 試閱章節
9789572239940 試閱章節
Ihome inaction 篇外篇之fp介绍
Ihome inaction 篇外篇之fp介绍
Excel vba實務應用 第3天
Excel vba實務應用 第3天
Godson x86
Godson x86
Serverless Event Streaming with Pulsar Functions-xiaolong
Serverless Event Streaming with Pulsar Functions-xiaolong
Bash入门基础篇
Bash入门基础篇
Android C Library: Bionic 成長計畫
Android C Library: Bionic 成長計畫
Erlang jiacheng
Erlang jiacheng
Intro to svn
Intro to svn
COSCUP 2016 - LLVM 由淺入淺
COSCUP 2016 - LLVM 由淺入淺
COSCUP2016 - LLVM框架、由淺入淺
COSCUP2016 - LLVM框架、由淺入淺
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
Learning python in the motion picture industry by will zhou
Learning python in the motion picture industry by will zhou
数字电路复习
数字电路复习
6, awk
6, awk
文本序列标注模型:从Crf到rnn
文本序列标注模型:从Crf到rnn
Lab2在幹嘛
1.
Lab2在幹嘛? Lab2的部分大概10~15分鐘可以看完 Addressing mode那邊是複習計算機組 織,10~15分鐘
2.
目錄 • Lab2在幹嘛---2種程式比較 • Addressing
modes在幹嘛(p.59) • Lab2進階版---”1秒”亮與滅(p.79) • Lab2超進階版---調燈亮度(p.80)
3.
Lab2在幹嘛--第1種寫法 • 第2種寫法在p.44
4.
Lab2在幹嘛—會學到的指令 • BIS.B =
bis.b = bis.B = BIS.b != BIS • BIC.B = bic.b • XOR.B = 依此類推 • MOV = mov.w != mov.b • DEC = dec.w • JNZ = jnz • JMP = jmp • 簡單來說,指令大小寫都沒差,但有沒有.b 或.w有差
5.
Lab2在幹嘛--第1種寫法 有興趣再問,反正之後會教 看 不 懂 這 邊 是 正 常 的 每 次 開 頭 都 差 不 多
6.
Lab2在幹嘛--第1種寫法 這 個 是 本 體 一 行 一 行 解 釋 先 注 意 這 兩 行
7.
Lab2在幹嘛--第1種寫法 • BIS.B #00000001b,
P1DIR BIS:是 sets bits (Bit Set),就是設定 bit .B :是表示這個指令是用 Byte大小去執行 相對應的是.W,有興趣再問,反正之後會教 #00000001b:是指二進位的1,b代表binary P1DIR :是Port 1 的 Direction Register,有8個bits 整體來說,這行是設定 Port 1 的 Pin 0方向為輸出 看不懂上面的就繼續下一頁,放下執著
8.
Lab2在幹嘛--第1種寫法 • BIS.B #00000001b,
P1DIR 板子上面有寫P1.0 也就是Port 1的 Pin 0 剛好這個地方是LED燈 一旦我們設定P1.0是輸出,那麼之後只要對P1.0輸出1就會 發光 通常板子重新啟動時,P1.0或其他譬如P1.1, P4.0, P4.7都會 是初始化成輸入,這樣子我們如果對P1.0輸出1就會沒有 意義
9.
Lab2在幹嘛--第1種寫法 • BIS.B #00000001b,
P1DIR BIS.B這個指令會將後面指定的數字變成一個一個位元後, 把1的地方設定給後面的P1DIR 譬如P1DIR 原本是 0 0 0 0 0 0 0 0 這樣 8 個 bits #00000001b表示 0 0 0 0 0 0 0 1 這樣 8 個 bits 經過 BIS.B 設定後 P1DIR就會變成 0 0 0 0 0 0 0 1
10.
Lab2在幹嘛--第1種寫法 • BIS.B #10000000b,
P4DIR (這是下一行程式碼~) 所以程式碼下一行換成設定P4.7(LED2)為輸出 P4DIR 原本是 0 0 0 0 0 0 0 0 這樣 8 個 bits #10000000b表示 1 0 0 0 0 0 0 0 這樣 8 個 bits 經過 BIS.B 設定後 P4DIR就會變成 1 0 0 0 0 0 0 0
11.
Lab2在幹嘛--第1種寫法 • BIS.B #00000011b,
P2DIR (這一行只是舉例~) 換一個例子 如果P2DIR本來是 0 0 0 0 0 1 0 1 #00000011b表示 0 0 0 0 0 0 1 1 經過 BIS.B 設定後 P2DIR就會變成 0 0 0 0 0 1 1 1 也就是說,只有中間那個 #00000011b有1的地方,會把後 面相對應的位置設定成1,其他都不會變
12.
Lab2在幹嘛--第1種寫法 • BIS.B #00000011b,
P2DIR 這其實相當於 OR 的 Bitwise operation 00000101 (P2DIR原本的值) OR) 00000011 (你想要設定P2.0, P2.1 的方向是輸出) -------------------- 00000111 (P2現在的P2.0, P2.1, P2.2 方向都是輸出)
13.
Lab2在幹嘛--第1種寫法 講 完 這 邊 了
14.
Lab2在幹嘛--第1種寫法 換 這 邊
15.
Lab2在幹嘛--第1種寫法 • BIS.B #00000001b,
P1OUT BIS:這你應該懂 .B :這你應該懂吧 #00000001b:這你應該懂 P1OUT :是Port 1 的 Output Register,有8個bits 整體來說,這行是設定 Port 1 的 Pin 1 輸出 1 也就是 P1.0 剛剛設定成輸出,現在是給他輸出1,你不可 能輸出2,因為一個bit就只有0或者是1 #00000002b 組譯器不會讓你過,畢竟binary哪來2╮( ̄▽ ̄)╭
16.
Lab2在幹嘛--第1種寫法 • BIS.B #00000001b,
P1OUT 所以如果你是一行一行執行 (這四個差別有興趣再問,反正之後會教) 執行前 執行後 你的P1.0(LED1)就會亮亮的
17.
Lab2在幹嘛--第1種寫法 • BIS.B #00000001b,
P1OUT 不過也有可能你在執行這行以前P1.0就亮亮的,或是P4.7 亮亮的 因為類似於 C 當中 int i; 有可能P1OUT保存了一些上次留下來的值,或是樂透號碼 P1OUT可能本來是 0 0 0 1 0 0 0 1 (P1.4, P1.0) 因此就算沒有執行這行,LED1也會亮著 保險起見還是設定讓他亮
18.
Lab2在幹嘛--第1種寫法 • BIC.B #10000000b,
P4OUT (這是下一行程式碼~) BIC:是clears bits(Bit Clear) 整體來說,這行是設定 P4.7 的輸出為0,其他不變 BIC感覺很簡單,不過其實概念比較麻煩 他會先 NOT #10000000,之後AND P4OUT
19.
Lab2在幹嘛--第1種寫法 • BIC.B #10000000b,
P4OUT (這是下一行程式碼~) NOT) 10000000 (#10000000b) ---------------- 01111111 AND) 10010001 (假設P4OUT的值是這樣) ---------------- 00010001 (P4.7變成0,其它不會變)
20.
Lab2在幹嘛--第1種寫法 結 束 了
21.
Lab2在幹嘛--第1種寫法 先 看 這 兩 個
22.
Lab2在幹嘛--第1種寫法 • loop: …(略過程式碼) • JMP
loop loop:是標籤的意思,類似於 C 的 goto LABEL JMP:是 jump,不是漫畫,是跳到那一行執行 所以JMP loop就是執行完這行後,會跳到loop那一行執行
23.
Lab2在幹嘛--第1種寫法 • loop: …(略過程式碼) • JMP
loop 因為loop那一行沒有東西,所以就會跳到loop後面第一個 出現的程式碼 XOR.B #00000001b, P1OUT 如果改成這樣子 loop: XOR.B ….. 兩個結果都是一樣的
24.
Lab2在幹嘛--第1種寫法 看 這 邊 看 這 邊
25.
Lab2在幹嘛--第1種寫法 • XOR.B #00000001b,
P1OUT XOR:是exclusive or,跟BIS差不多,只是變成XOR 整體來說,就是這個指令會讓燈閃爍 下一頁看說明
26.
Lab2在幹嘛--第1種寫法 • XOR.B #00000001b,
P1OUT 剛剛我們設定P1.0亮(P1OUT = 00001001) 執行完這行後會變成 00001001 (P1OUT原本的值) XOR) 00000001 (#00000001b) -------------------- 00001000 (P1.0變成不亮,但是P1.3維持原樣)
27.
Lab2在幹嘛--第1種寫法 • XOR.B #00000001b,
P1OUT 當下一次又碰到這行時 執行完這行後會變成 00001000 (P1OUT原本的值) XOR) 00000001 (#00000001b) -------------------- 00001001 (P1.0變亮,但是P1.3維持原樣) 也就是每次執行到 XOR.B,就會把後面對應的位置從0->1 或是1->0
28.
Lab2在幹嘛--第1種寫法 • XOR.B #10000000b,
P4OUT 所以相對的,一開始我們設定P1.0亮,碰到XOR後就會暗 而P4.7一開始是暗,碰到XOR後就會亮 因此兩個燈就會交替亮
29.
Lab2在幹嘛--第1種寫法 最 後 一 段
30.
Lab2在幹嘛--第1種寫法 • MOV #50000,
R15 MOV:是一個move回來,把後面的值搬到更後面的那個 地方 組譯器會把它轉換成 MOV.W #50000:十進位的50000,注意沒有b R15: general purpose register 15,R4~R15可以自由使用 整體來說,就是把50000這個數值放到R15裡面
31.
Lab2在幹嘛--第1種寫法 • MOV #50000,
R15 0x:表示16進位,所以50000的16進位是0x0C350 另外,我們是16 bit的CPU 理論上register只有0x0000到0xFFFF,不過其實這塊版子上 面的register可以用到20 bit的資料,0xFFFFF 執行前 執行後
32.
Lab2在幹嘛--第1種寫法 • DEC R15 DEC:decrement,也就是把後面的R15減掉1 這個指令比較特別,他叫做模擬指令(emulated
instruction), 之後會教 事實上DEC這個指令相當於DEC.W,然後會被模擬成類似 SUB.W #1, R15 SUB:subtraction,把最後面的數值減掉前面的數值 也就是R15減掉1
33.
Lab2在幹嘛--第1種寫法 • JNZ delay JNZ:Jump
if not zero,類似jump,不過是有條件的 delay跟loop一樣都是標籤,JNZ是看上一行的結果有沒有 出現0,如果沒有出現0就會跳到delay那一行 DEC R15 所以這行執行後,如果R15 != 0,程式就會跳到delay:,然 後繼續執行 DEC R15 JNZ delay
34.
Lab2在幹嘛--第1種寫法 • JNZ delay 最後當R15
= 1時 DEC R15 R15 = 0 JNZ delay 執行這行後,因為出現了0,所以就不會跳回去delay,便 繼續執行下一行的 JMP loop
35.
Lab2在幹嘛--第1種寫法 • JNZ delay 事實上,JNZ是看SR(Status
Register, R3)當中的Zero bit有沒 有設定成1
36.
Lab2在幹嘛--第1種寫法 • JNZ delay
37.
Lab2在幹嘛--第1種寫法 • JNZ delay
38.
Lab2在幹嘛--第1種寫法 • JNZ delay
39.
Lab2在幹嘛--第1種寫法 • JNZ delay
40.
Lab2在幹嘛--第1種寫法 初始化 改變燈亮滅 時間延遲
41.
• 至於為什麼要有時間延遲? 因為我們的CPU是1M hz,每個指令執行速度很快,如果沒 有延遲就開關燈,那個燈閃爍的頻率會是1M
hz左右,超 過人眼可以辨識的程度(你會看起來一直亮著) 注意:並不是一行程式碼就是讓CPU跑一次cycle,有些程 式碼會讓CPU跑2~3次cycles,之後會教如何計算clock cycles clock cycle:CPU跑一個機器碼指令的單位,1M hz的CPU表 示1秒鐘CPU大概可以跑100萬個機器碼指令 Lab2在幹嘛--第1種寫法
42.
• 至於為什麼要有時間延遲? 所以我們用 MOV #50000,
R5 DEC R5 JNZ delay 就會讓CPU跑個大概15萬個機器碼指令(15萬個clock cycles) 也就是大概0.15秒,燈就會每0.15秒閃爍一次 dec -> 1 cycle jnz -> 2 cycles -> (1 + 2) x 50000 = 150000 Lab2在幹嘛--第1種寫法
43.
• 還有咧? 之後我們會學到PWM(Pulse Width
Modulation),他利用的 就是人眼分辨不出來燈閃爍的頻率,來讓燈可以調整亮度 另一個我們會學到的是interrupt,他同樣可以製作delay的 效果,但可以省電和其他功能 假設電池可以供應原本程式跑1小時,改成interrupt後,大 概可以跑1個星期或1個月吧…… Lab2在幹嘛--第1種寫法
44.
Lab2在幹嘛--第2種寫法 • 第2種寫法 • 第2種寫法 •
第2種寫法 • (前面就花了40頁在講第1種寫法QQ) • (後面比較少了但是我好懶得打QAQ)
45.
Lab2在幹嘛--第2種寫法 這 個 是 本 體 ㄏ ㄏ 變 好 長
46.
Lab2在幹嘛--第2種寫法 幾乎每行都不一樣喔
47.
Lab2在幹嘛--第2種寫法 • 這四行功能大致一樣,都是在做初始化 • 第一行是一樣的,指令大小寫都可以 但是P1DIR不能寫成p1dir
48.
Lab2在幹嘛--第2種寫法 • 第二行不太一樣,先看後面 #10000000b是2進位 #0x80是16進位 兩個寫法代表的值是一樣的 另外#0x80也可以寫成#80h,h代表hentai hexadecimal
49.
Lab2在幹嘛--第2種寫法 • 第二行不太一樣,看前面 之前介紹過bis, mov兩個指令了,所以基本上應該知道這 兩個動作會不一樣 假設說P4DIR原本是
0 1 0 0 1 0 0 1 bis.b 之後會變成 1 1 0 0 1 0 0 1 (or) mov.b之後會變成 1 0 0 0 0 0 0 0 (move)
50.
Lab2在幹嘛--第2種寫法 • 第二行要寫哪一種比較好? 因為這是在初始化的部分,我會傾向用右邊的mov.b 這樣可以確保其他的值都在我的掌控中,而不會殘留上次 的痕跡,造成非預期的後果譬如ㄎ_ㄖ 不過通常P4DIR會被初始化成 0
0 0 0 0 0 0 0,所以在這邊沒 差,但如果是P4OUT就有差了
51.
Lab2在幹嘛--第2種寫法 • 第三行 #00000001b是二進位的1 每次都要打很多0很煩 MSP430有給我們簡化的方式,也就是#BIT0 (要有#在前) #00000001b
= #BIT0 #01000000b = #BIT6 #10000010b = #BIT7 + BIT1 (mov.b #BIT7 + BIT1, P4DIR) 這個會交給組譯器自動幫我們轉換~
52.
Lab2在幹嘛--第2種寫法 • 第四行 #10000000b 是2進位的
10000000 #128就是他的10進位數值,也可以寫成#128d (decimal) 複習一下 #1b = #1d = #1h #10000000b = #128d = #80h 這三個表示方式都代表同一個數值
53.
Lab2在幹嘛--第2種寫法 • 第囧行所以該用哪一個比較好? #10000000b =
#128d = #80h 其實不一定,譬如如果我們要算128+57,就直接用#128就 好 但像是我們要設定某一個pin,譬如P4.7,那麼用 #10000000b 或用 #BIT7 會比較容易理解
54.
Lab2在幹嘛--第2種寫法 下面就自己看吧>//////<
55.
Lab2在幹嘛--第2種寫法 • 後半段的部分 第1種寫法會比第2種來的好,畢竟程式碼比較短,而且感 覺比較厲害兩種寫法跑的時間都一樣 注意:程式碼也會佔走記憶體空間,所以理想上比較短會 比較好,不過我們應該不至於寫到用完記憶體空間的大程 式
56.
Lab2在幹嘛--第2種寫法 • 後半段的部分,有驚嘆號
57.
Lab2在幹嘛--第2種寫法 • 後半段的部分,沒有驚嘆號
58.
Lab2在幹嘛--第2種寫法 • 後半段的部分 剛剛看的兩張圖差別在於有沒有warning 簡單來說 JMP
之類的 jump指令放在程式碼最後面有可能 造成非預期的後果,畢竟硬體有可能壞掉,不會一行一行 執行之類的,基本上就只是提醒你而已可以不用管他 阿覺得很煩可以加個 NOP: no operation,就是甚麼都不 做但是會浪費一個 cycle,就可以有一點保護作用
59.
Addressing modes在幹嘛 • 我懶得打了,有空再補XDDDD •
基本上跟計算機組織學的有關 • 而 mov.b #BIT0, P1OUT mov.b #BIT0, &P1OUT 感覺執行起來沒差,不過實際上產生的機 器碼不一樣,而且特殊狀況下會有差
60.
Addressing modes在幹嘛 • Addressing
modes 表示一個資料要怎麼取得 或放進去某個地方 Register mode: 資料在 register 裡面 其他 modes: 資料在 memory 裡面,必須先找到位置 不同mode可以混搭
61.
Addressing modes在幹嘛 • 混搭的範例 mov.w
#1000, R5 Immediate mode 資料在memory中 然後指令的這位置叫 data source 可以有7種modes register mode 資料要放到register裡 指令最後面的位置通常是 data destination 只能有4種modes
62.
Addressing modes在幹嘛 • 我們寫的語言是Assembly
code 實際上會再由組譯器翻譯成機器碼(machine code) 如果我們今天寫 C code i = i + 3; 編譯器會將它大概變成 add.w #3, R4 然後組譯器再變成這兩行 0101 0000 0 1 11 0100 000000000000000011
63.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 前面四碼叫做 Op-code:operation code 也就是說,他告訴CPU這行程式碼在幹嘛 0101表示我們要做 add
64.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 這四碼表示 Rsrc: Register source 也就是我們要相加,資料的來源 0000表示我們要相加的來源在 Register 0 而 Register 0 又叫做 PC: Program Counter
65.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 等等!資料來源不是Memory嗎? Immediate mode: 表示資料在 memory,剛剛說的來源是 Register 0,但因為他是Program Counter,在Immediate mode的情況下會把Program Counter指到的記憶體裡面放 的資料當成來源
66.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 Program Counter (Register 0) 我們程式都是放在memory裡面跑,而PC這個Register 會儲存的值就是程式碼在memory裡面的位置,也就是他 在掌管程式目前要跑到第幾行 在Immediate mode情況下,PC指到的位置裡面的值會 被當成是數值,而不是要執行的程式碼
67.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 PC->0xABCD 0101 0000 0 1 11 0100 0xABCF 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 上面表示我們程式碼放在記憶體的 0xABCD位置,這時候 Register 0 儲存的值就是 0xABCD,而0xABCD這個位置裡面 儲存的數值是0101 0000 0 1 11 0100 當執行完這一行時,PC會往下跳一格
68.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0xABCD 0101 0000 0 1 11 0100 PC->0xABCF 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 Immediate mode情況下,這時候CPU會把0xABCF裡面儲存 的值當成data source,也就是0000000000000011,#3 直到這行程式碼執行完,add.w #3, R4這一行才算是執行 結束,也就是add.w #3, R4需要讓CPU執行兩次才會執行 結束,clock cycle數是2
69.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 所以回來一下,這四碼表示Rsrc,也就是我們要相加的來 源是Register 0
70.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 這兩碼叫做 As: Addressing mode of source 11表示要用Immediate mode 也就是告訴你,剛剛 Rsrc雖然是 Register 0,可是我們要用 的資料來源不是 Register 0 裡面儲存的值,而是在這行程 式碼結束後,PC指到的那一行程式碼才是我們的資料來源 000000000000000011
71.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 這一碼叫做 Ad: Addressing mode of destination 也就是資料要放的地方,應該用甚麼方式放過去 0表示Register mode,資料就在Register裡面
72.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 這一碼叫做 B/W: Byte or Word 也就是 add.w 後面的 .w 1表示我們資料傳遞的時候是一個word(2 bytes, 16bits)
73.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就是CPU會讀到的程式碼 0101 0000 0 1 11 0100 最後四碼是Rdst: Register destination 也就是資料要去的地方 0100表示去到第四個register, R4
74.
複習計算機組織(可以跳過) • 這兩行是甚麼意思? add.w
#3, R4 0101 0000 0 1 11 0100 000000000000000011 這兩行就相當於下面那個樣子 延伸問題:Ad只有1個bit, As有2個bits 可是source可以有7種modes,destination 4種 為什麼呢?
75.
Addressing modes在幹嘛 • Addressing
modes 表示一個資料要怎麼取得 或放進去某個地方 所以複習完計算機組織,我們可以知道Addressing modes 影響的除了告訴CPU資料在那裡,也會影響到產生的機器 碼多寡,因此影響到程式執行的時間
76.
Addressing modes在幹嘛 • 舉個例子 add.w
R4, R5 source和destination都是register mode 會產生 0101 0100 0 1 00 0101 add.w #3, R5 會產生 0101 0000 0 1 11 0101 000000000000000011
77.
Addressing modes在幹嘛 • 進階例子 add.w
#1, R5 會產生 0101 0011 0 0 01 0101 add.w #3, R5 會產生 0101 0000 0 1 11 0101 000000000000000011 會不一樣是因為Constant Generator (R2, R3) 反正很神奇就是了, #0, #1, #2, #4, 這些值都很特別
78.
Addressing modes在幹嘛 • mov.b
#BIT0, P1OUT mov.b #BIT0, &P1OUT 所以這兩個的 Destination 的 Addressing mode不一樣,產 生的機器碼也會不一樣 一般情況下,兩個效果是沒差的 但特殊情況下有差 詳細就自己看 MSP430-UserGuide 或是Lab PPT~
79.
Lab2進階版---”1秒”亮與滅 • 試著自己讓燈可以接近1秒鐘亮滅 有很多方法可以做到,要看提示就反白下面 不過通常情況下 register最大只能到
#65535 所以如果打 mov.w #10000000, R15 組譯器不會讓你過~ 1.用很多loop來增加延遲 2.用巢狀loop來增加延遲 3.用特殊指令(movx.a)來增加延遲 4.用interrupt
80.
Lab2超進階版---調燈亮度 • 因為只要燈變換頻率過快,人眼就無法辨 識閃爍,但會因為亮跟暗的週期而感覺燈 亮度有變化,這就是PWM的應用之一 • 可能需要用到 •
JZ = jz:jump if zero, 是jnz的相反 • 目前學到的指令就可以辦到嚕~ • 範例會讓LED1慢慢亮或滅,LED2指示現在 是亮或暗
Download Now