---
# System prepended metadata

title: TP_MBD2_ReinathanEzkhielKurniawan_2406397675

---

# Tugas Pendahuluan Modul 2
Pembuat soal : AX
```text
Nama: Reinathan Ezkhiel Kurniawan
NPM: 2406397675
```


## 1. Sebutkan beberapa perbedaan dari assembly yang kalian pernah belajar pada mata kuliah OAK dengan assembly yang digunakan pada arduino (5 poin)

Pada *Assembly* OAK (Menggunakan **x86_64**), karakteristiknya adalah : 
- Format intruksinya bisa kompleks dan panjang bervariasi (*Complex Instruction Set Computer*). 
- Register sebagai tempat penyimpanan sementara relatif sedikit (RAX,RBX, dsbg.). 
- Pada **x86_64**, operasi 64-bit sangat umum untuk digunakan. 
- Mempunyai *flags* dan *branch* kondisional, tetapi detial instruksi dan definisi penggunaanya berbeda. Pada OAK lebih menggunakan `JMP`. 
- Pemetaan register sebagai akses **I/O** pada *Assembly* OAK lebih berlapis dan kompleks dibanding AVR(`DDRx/PORTx/PINx`). 

Pada *Assembly* AVR , perbedaannya daripada *Assembly* OAK adalah : 
- Format instruksinya jauh lebih sederhana (*Reduced Instruction Set Computer*). 
- Pada AVR, terdapat 32 register **8-bit** (`R0` - `R31`) dan terdapat pula batasan pada instruksi tertentu seperti `LDI` hanya untuk `R16` - `R31`. 
- AVR basis operasinya adalah **8-bit** sehingga operasi 16 dan 32 bit biasanya dilakukan per **byte** dan/atau **carry**.
- Mempunyai *flags* dan *branch* kondisional, tetapi detial instruksi dan definisi penggunaanya berbeda. Pada AVR lebih menggunakan `BRNE`,`BREQ`,`BRCS`.

### Referensi : 
- Microchip Technology Inc., “AVR® Instruction Set Manual.”, Microchip Technology [Online]. Available: https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-InstructionSet-Manual-DS40002198.pdf. [Diakses: 07-Feb-2026].

- Intel Corporation, “Intel® 64 and IA-32 Architectures Software Developer’s Manual (SDM).”, Intel [Online]. Available: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html. [Diakses: 07-Feb-2026].

## 2. Isi tabel berikut (Ini akan mempermudah anda pada praktikum kedepannya) (15 poin)

| Register | Nama Lengkap | Fungsi | Penjelasan Bit | Contoh Pemakaian |
| :--- | :--- | :--- | :--- | :--- |
| DDRx | Data Direction Register | Mengatur arah pin sebagai Input atau Output | Bit = 0: Input, Bit = 1: Output | `SBI DDRB, 5` |
| PORTx (saat DDRx = 0) | Port Data Register (Input Mode) | Mengatur **pull up** internal pada pin *input* | Bit = 0: *Pull up* **OFF**, Bit = 1: *Pull up* **ON**, |`SBI PORTD, 2` |
| PORTx (saat DDRx = 1) |Port Data Register (Output Mode) | Menulis level *output* ke pin |Bit = 0: *Output* **LOW**, Bit = 1: *Output* **HIGH** | `SBI PORTB, 5`  (`PORTB` **High**, `CBI PORTB, 5` `PORTB` **Low**|
| PINx |Pin Input Register| Membaca level logika /kondisi aktual pada pin | Bitnya adalah 0 dan 1 sesuai level pin. Pada banyak AVR, menulis `1` ke `PINx` akan men-**toggle** bit `PORTx` terkait  |`IN R16,PIND` (Baca status `PIND` dan simpan nilainya ke `R16`)|

### Referensi : 
- Microchip Technology Inc., “I/O Ports (AVR®).” , Microchip Technology [Online]. Available: https://onlinedocs.microchip.com/oxy/GUID-74F8229E-4C43-4FA0-BE7D-1AA303C6F8A4-en-US-6/GUID-6683EB1A-DA91-4C67-A041-2C6BE048D138.html. [Diakses: 07-Feb-2026].
- Microchip Technology Inc., “ATmega328P Data Sheet.” , Microchip Technology [Online]. Available: https://www.microchip.com/en-us/product/ATmega328P#Documentation. [Diakses: 07-Feb-2026].

## 3. Jelaskan Sebanyak - banyaknya Instruction Set dengan rinci pada tabel di bawah ini. (Ini akan mempermudah anda pada praktikum kedepannya) (15 poin)

| Mnemonic | Operand | Deskripsi | Contoh Pemakaian |
| :--- | :--- | :--- | :--- |
| LDI | Rd, K | Load Immediate - Memuat nilai konstanta 8-bit (K) ke register tujuan (Rd). Hanya bisa digunakan untuk register R16-R31. | `LDI R16, 0xFF` |
| MOV | Rd, Rr | *Copy* Register | `MOV R18,R16` |
| IN | Rd, A | Baca dari **I/O address** A ke Rd | `IN R16, PIND` |
|OUT | A, Rr | Tulis Rr ke **I/O address** A | `OUT PORTB, R16` |
|SBI | A, b | Set bit **b** pada  Register I/O (hanya untuk *range* tertentu) | `SBI DDRB, 5` |
|CBI |A,b |*Clear* bit **b** pada register I/O |`CBI PORTB, 5` |
|SBIS| A,b | Skip isntruksi berikutnya jika bit=1 | `SBIS PINB, 0` |
| SBIC | A,b | Skip instruksi berikutnya jika bit = 0 | `SBIC PINB, 2` |
|LDS| Rd, k | *Load* dari **data space** alamat `k` | `LDS R16, 0x0100` |
|STS | k, Rr |*Store* ke **data space** alamat `k` | `STS 0x0100, R16` |
|ST |X/Y/Z , Rr |*Store* via pointer (Terdapat varian `+` dan `-`) | `ST Z+ , R16`|
|LD |Rd, X/Y/Z|*Load* via pointer (Terdapat varian `+` dan `-`) | `LD R16 , Z-`|
|PUSH|Rr | *Push* register ke *stack*|`PUSH R16` |
|POP |Rd |*Pop stack* ke register |`POP R16` |
|RJMP |k | *Relative Jump* |`RJMP loop` |
| JMP |k |*Absolute Jump* (biasanya isntruksi **32-bit**) |`JMP main` |
| CALL | k | Panggil *subroutine* (`return addr` ke *stack*) |`CALL delay` |
|RET | -  | *Return* dari *subroutine* | `RET` |
|ADD |Rd,Rr | Tambah| `ADD R16,R17`|
|ADC |Rd,Rr | Tambah dengan *carry*| `ADC R16,R17`|
|SUB |Rd,Rr | Kurang | `SUB R16,R17`|
|SBC |Rd,Rr | Kurang dengan *carry* | `SBC R16,R17`|
|AND|Rd,Rr |AND *bitwise* | `AND R16,R17` |
|OR | Rd,Rr|OR *bitwise* | `OR R16,R17` |
|EOR| Rd,Rr|XOR *bitwise*| `EOR R16,R17` |
|COM |Rd |**1s Complement** |`COM R16`|
|INC |Rd |*Increment* |`INC R16` |
|DEC |Rd |*Decrement* |`DEC R16` |
|LSL |Rd |*Shift Left* |`LSL R16` |
|LSR |Rd |*Shift Right* |`LSR R16` |
|ROL |Rd |*Rotate Left* dengan *carry* |`ROL R16` |
|ROR |Rd |*Rotate Right* dengan *carry* |`ROR R16` |
|CPI|Rd,K|*Compare Immediate (set flags)*|`CPI R16, 10`|
|CP|Rd,K|*Compare register (set flags)*|`CP R16, R17`|
|BREQ|k|*Branch* jika Z = 1|`BREQ done`|
|BRNE|k|*Branch* jika Z = 0|`BREQ loop`|
|BRCS|k|*Branch* jika C = 1|`BRCS carry_case`|
|BRCC|k|*Branch* jika C = 0|`BRCS no_carry`|
|SEI|-|*Enable* **global interrupt**|`SEI`|
|CLI|-|*Disable* **global interrupt**|`CLI`|
|NOP|-|Tidak melakukan apa apa selama 1 siklus|`NOP`|

### Referensi :
- Microchip Technology Inc., “AVR® Instruction Set Manual.” , Microchip Technology [Online]. Available: https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-InstructionSet-Manual-DS40002198.pdf. [Diakses: 07-Feb-2026].
- Microchip Technology Inc., “ATmega328P Data Sheet.” , Microchip Technology [Online]. Available: https://www.microchip.com/en-us/product/ATmega328P#Documentation. [Diakses: 07-Feb-2026].

## 4. Jelaskan salah satu cara untuk menerapkan delay tanpa library external, sertakan kode (5 poin)

Salah satu caranya adalah dengan menggunakan **busy-wait loop**. Secara *detail*, kita akan merancang sebuah *decrement loop* dan *branch* sampai nol. Waktu *delay* bergantung kepada $fCPU$ (*Behaviour* dari CPU itu sendiri) dan jumlah siklus isntruksi (*cycle count*) dari instruksi *loop*.

Contoh : 
```asm 
; delay sederhana menggunakan *nested loop*
; R1 merupakan counter luar, R2 merupakan counter dalam

delay: 
LDI R1, 200
outer:
LDI R2, 255
inner: 
DEC R2
BRNE inner 
DECC R18 
BRNE outer
NET
```
### Referensi :
- Microchip Technology Inc., “AVR® Instruction Set Manual.” , Microchip Technology [Online]. Available: https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-InstructionSet-Manual-DS40002198.pdf. [Diakses: 07-Feb-2026].
- Microchip Technology Inc., “ATmega328P Data Sheet.” , Microchip Technology [Online]. Available: https://www.microchip.com/en-us/product/ATmega328P#Documentation. [Diakses: 07-Feb-2026].

## 5. Jelaskan apa itu Memory Mapped Input Output (MMIO) dan hubungannya dengan AVR assembly yang akan kita lakukan. (5 poin)

**MMIO** , *Memory-Mapped I/O* adalahs ebuah konsep bahwa register perangkat I/O ataupun *peripheral* (perangkat keras) diberi alamat di ruang alamat yang dapat diakses CPU seperti memori. Hal ini menyebabkan akses I/O dapat dilakukan dengan mekanisme *load* / *store* ke alamat tertentu.

Kaitannya dengan **AVR** *assembly* :
- Register seperti `DDRx`,`PORTx`,`PINx` adalah register periferal yang dipetakan ke ruang I/O dan terhubung dengan **data space mapping** perangkat. 
- Maka dari itu, pada **AVR** *assembly* , kita bisa mengakses register tersebut dengan : 
- - Instruksi khusus I/O : **IN/OUT** (untuk I/O *space*), dan operasi bit **SBI/CBI** pada alamat tertentu. 
- - Instruksi*data space* : **STS/LDS**, dengan mengakses alamat data secara lansgung.

### Referensi :
- Microchip Technology Inc., “Register Summary (AVR®).”, Microchip Technology  [Online]. Available: https://onlinedocs.microchip.com/oxy/GUID-74F8229E-4C43-4FA0-BE7D-1AA303C6F8A4-en-US-6/GUID-6683EB1A-DA91-4C67-A041-2C6BE048D138.html. [Diakses: 07-Feb-2026].
- Microchip Technology Inc., “ATmega328P Data Sheet.” , Microchip Technology [Online]. Available: https://www.microchip.com/en-us/product/ATmega328P#Documentation. [Diakses: 07-Feb-2026].

## 6. Buatlah sebuah proyek Arduino di https://wokwi.com/ atau dengan Proteus yang dapat men-toggle (kalau sedang menyala maka akan dimatikan, dan sebaliknya) sebuah LED saat sebuah button ditekan! Proyek memiliki file .ino yang kosong dan menerapkan kode assembly di file .S. Cantumkan screenshot rangkaian yang telah kalian buat serta copas kode ke dalam TP yang memiliki Nama&NPM serta komentar pada setiap barisnya. (55 poin)

### file `.ino`
```ino
//Nama : Reinathan Ezkhiel Kurniawan 
//NPM : 2406397675
extern "C" {
  void main_loop(); // Deklarasi agar tahu fungsi main_loop dari luar
}

void setup() {
    main_loop(); //panggil fungsi assembly
}

void loop() {
    // dibiarkan kosong sesuai instruksi TP
}
```

### file `.s`
```asm
#include <avr/io.h>

;Nama : Reinathan Ezkhiel Kurniawan 
;NPM  : 2406397675

.global main_loop
;set global biar bisa diambil sama .ino
main_loop: 

    sbi _SFR_IO_ADDR(DDRB), 5    ; Set PortB bit5 sebagai output , built in dari wokwi buat nulis bit1 ke register PIN yang bakal ngetoggle (Pin 13 / PORTB bit 5)
    cbi _SFR_IO_ADDR(DDRD), 7    ; Set PORTD bit 7 sebagai Input (Pin 7 , PORTD Bit 7)
    sbi _SFR_IO_ADDR(PORTD), 7   ; aktifin Pull-up Resistor pada Pin 7 (INTERNAL)
    

check_button: ;buat periksa status button

    sbic _SFR_IO_ADDR(PIND), 7   ; Skip instruksi berikutnya jika bit 7 bernilai 0 (ditekan), sbic instruksi khusus "Skip If bit In i/O register is cleared"
    rjmp check_button            ; Jika tidak ditekan (bit berubah jadi 1), balik lagi cek tombol

    ; instruksi berikutnya bakal akan lgsg mentoggle pin bit 5 sehingga LED nyala
    sbi _SFR_IO_ADDR(PINB), 5    

    call delay                   ; Delay singkat untuk debouncing
wait_release:
    sbis _SFR_IO_ADDR(PIND), 7   ; Skip jika bit 7 bernilai 1 (udah dilepas)
    rjmp wait_release            ; Jika masih ditekan (bit masih 0, belum transisi), tunggu di sini
    
    call delay                   ; fungsi delay abis dilepas
    rjmp check_button            ; Kembali menunggu pencetan berikutnya

delay: 
    ; Delay dengan fungsi busy wait
    ldi r18, 0xFF ;outer
    ldi r19, 0xFF ;inner
delay_loop: 
;pokoknya decrement terus sampai 0
    dec r18
    brne delay_loop
    dec r19
    brne delay_loop
    ret
```


### Screnshot Rangkaian
![image](https://hackmd.io/_uploads/BJBcLvEP-l.png)

