


Лампанель написать команду
Напишите программу, которая решает следующую задачу, используя логические операции:
В регистрах R1, R2 и R3 записаны коды трех десятичных цифр, составляющих трехзначное число
(соответственно сотни, десятки и единицы). Построить в регистре R0 это число. Например, если
R1=3116, R2=3216 и R3=3316, в регистре R0 должно
получиться десятичное число 123
Ты имеешь в виду **Лампанель** — симулятор микропроцессора с очень низкоуровневыми командами. Там не арифметика как в обычных языках, а операции на **логических уровнях** — AND, OR, SHL, SHR, загрузка в регистр и т.п.
---
### 🔧 Условие:
- В `R1`, `R2`, `R3` — коды **десятичных цифр** (то есть, от `0x30` до `0x39`), как в **ASCII**.
- `R1` = сотни, `R2` = десятки, `R3` = единицы.
- Нужно собрать число `X = (R1 - 0x30)*100 + (R2 - 0x30)*10 + (R3 - 0x30)` и поместить в `R0`.
---
### ✅ Что надо сделать:
1. Вычесть `0x30` из каждого регистра.
2. Умножить `R1` на 100, `R2` на 10.
3. Сложить всё в `R0`.
В Лампанели нет обычных вычитаний или умножений, так что **всё делаем через логические сдвиги и сложения**.
---
### 💻 Пример программы:
```asm
; Исходное:
; R1 = 0x31 ; '1' = 49
; R2 = 0x32 ; '2' = 50
; R3 = 0x33 ; '3' = 51
; R0 = результат = 123
LD R4, #0x30 ; вычтем 0x30 из всех
; --- R1 = R1 - 0x30 (сотни) ---
LD R5, R1
SUB R5, R4 ; R5 = цифра сотен
; умножим на 100: x * 100 = x * (64 + 32 + 4)
SHL R6, R5, #6 ; R6 = R5 << 6 = x * 64
SHL R7, R5, #5 ; R7 = R5 << 5 = x * 32
SHL R8, R5, #2 ; R8 = R5 << 2 = x * 4
ADD R9, R6, R7 ; R9 = x * 96
ADD R9, R9, R8 ; R9 = x * 100
LD R0, R9 ; пока в R0 только сотни
; --- R2 = R2 - 0x30 (десятки) ---
LD R5, R2
SUB R5, R4 ; R5 = цифра десятков
; умножим на 10: x * 10 = (x << 3) + (x << 1)
SHL R6, R5, #3
SHL R7, R5, #1
ADD R6, R6, R7 ; x * 10
ADD R0, R0, R6 ; прибавим десятки
; --- R3 = R3 - 0x30 (единицы) ---
LD R5, R3
SUB R5, R4
ADD R0, R0, R5 ; прибавим единицы
; Готово — R0 = итоговое число
```
---
### 💬 Объяснение:
- Все цифры хранятся в **ASCII-коде**, то есть `'0' = 0x30`, `'1' = 0x31` и т.д.
- Мы «вычитаем» `0x30`, чтобы получить нормальные цифры.
- Умножаем сдвигами (нет умножения напрямую).
- Складываем всё в `R0`.
--