54 lines
1.2 KiB
YAML
54 lines
1.2 KiB
YAML
id: 6
|
||
title: 移位操作
|
||
subtitle: 位的舞蹈
|
||
description: 学习 LSL 和 LSR 指令
|
||
|
||
tutorial:
|
||
- title: LSL —— 逻辑左移
|
||
text: >
|
||
所有位向左移,右边补0。**左移1位 = 乘以2**,左移3位 = 乘以8:
|
||
code: |
|
||
; 5 = 00000101
|
||
LSL R0, R0, #1 ; 00001010 = 10 (×2)
|
||
LSL R0, R0, #1 ; 00010100 = 20 (×2)
|
||
- title: LSR —— 逻辑右移
|
||
text: >
|
||
所有位向右移,左边补0。**右移1位 = 除以2**:
|
||
code: |
|
||
MOV R0, #40
|
||
LSR R0, R0, #1 ; 20 (÷2)
|
||
LSR R0, R0, #2 ; 5 (÷4)
|
||
- title: 程序员的技巧
|
||
text: >
|
||
在真实的 ARM 处理器中,移位比乘除快得多!
|
||
`LSL R0, R0, #3` 比 `MUL R0, R0, #8` 高效。
|
||
|
||
goal: R0 = **5**,只用**移位操作**把它变成 **40**(40 = 5 × 8 = 5 × 2³)
|
||
|
||
initialState:
|
||
registers:
|
||
R0: 5
|
||
|
||
testCases:
|
||
- init: {}
|
||
expected:
|
||
registers:
|
||
R0: 40
|
||
|
||
hints:
|
||
- "8 = 2³,乘以8就是左移3位"
|
||
- "LSL R0, R0, #3"
|
||
- "就这一条指令!"
|
||
|
||
starThresholds: [2, 3, 5]
|
||
blockedOps: [MUL, DIV]
|
||
|
||
starterCode: |
|
||
; R0 = 5
|
||
; 用 LSL 让 R0 变成 40(不能用 MUL)
|
||
|
||
|
||
HLT
|
||
|
||
showMemory: false
|