---
title: TP_MBD2_DanishAlFayyadhSunarta_2406416951
---
---
title: Tugas Pendahuluan Modul 2
---
# Tugas Pendahuluan Modul 2
Pembuat soal : AX
```text
Nama: Danish Al Fayyadh Sunarta
NPM: 2406416951
```
## 1. Sebutkan beberapa perbedaan dari assembly yang kalian pernah belajar pada mata kuliah OAK dengan assembly yang digunakan pada arduino (5 poin)
| Poin | OAK | MBD |
|:-:|:-:|:-:|
| CPU / microcontroller | Intel 8086 | AVR Atmega328p (Arduino uno) |
| Arsitektur | Von Neumann (program & data memory berbagi bus yang sama) | Harvard (program & data memory masing-masing menggunakan bus terpisah)|
| bit size | 16-bit | 8-bit |
| Instruction Set| CISC (Complex Instruction Set Computer) | RISC (Reduced Instruction Set Computer) |
| Tipe | Microprocessor | Microcontroller |
| Register | 14 register 16-bit | 32 register 8-bit |
### Referensi
- "Intel 8086 Microprocessor," *TutorialsPoint*. [Online]. Available: https://www.tutorialspoint.com/microprocessor/microprocessor_8086_overview.htm. [Accessed: Feb. 06, 2026].
- Microchip Technology Inc., "ATmega328/P AVR Microcontroller with picoPower Technology Datasheet," 2018. [Online]. Available: https://static.datasheets.com/doc/27659350-microchip-atmega328p-pu-ds.pdf. [Accessed: Feb. 08, 2026].
- "Difference Between Microprocessor and Microcontroller," *Electronics Hub*, Aug. 13, 2023. [Online]. Available: https://www.electronicshub.org/difference-between-microprocessor-and-microcontroller/. [Accessed: Feb. 08, 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) | Data Register (Input Mode) | Mengatur sinyal logic High (1) / Low (0) pada pin | Bit = 0: Logika 0, Bit = 1: Logika 1 | `SBI PORTB, 5` |
| PORTx (saat DDRx = 1) | Data Register (Output Mode) | Mengeluarkan sinyal High (1) / Low (0) pada pin Output | Bit = 0: Logika 0, Bit = 1: Logika 1 | `SBI PORTB, 5` |
| PINx | Input Pins Address | membaca nilai sinyal logic yang masuk pada pin | Bit = 0: Terbaca Low, Bit = 1: Terbaca High | `SBI PINB, 5` |
### Referensi
- Microchip Technology Inc., "ATmega328/P AVR Microcontroller with picoPower Technology Datasheet," 2018. [Online]. Available: https://static.datasheets.com/doc/27659350-microchip-atmega328p-pu-ds.pdf. [Accessed: Feb. 08, 2026].
- "AVR I/O Port Programming," *AVR-Tutorials*. [Online]. Available: https://www.avr-tutorials.com/avr-io-ports. [Accessed: Feb. 08, 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` |
| ADD | Rd, Rr | Addition - Menjumlahkan 2 register atau register dan data yang disimpan dalam memori. | `ADD R16, R17` |
| SUB | Rd, Rr | Subtraction - Mengurangkan 2 register atau register dan data yang disimpan dalam memori. | `SUB R16, R18` |
| AND | Rd, Rr | Bitwise AND - Melakukan operasi logika AND antara 2 register atau register dan data memori. | `AND R16, R17` |
| OR | Rd, Rr | Bitwise OR - Melakukan operasi logika OR antara 2 register atau register dan data memori. | `OR R16, R17` |
| MUL | Rd, Rr | Multiplication - Melakukan operasi perkalian antara 2 register. | `MUL R16, R17` |
| JMP | label | Jump - Lompat ke alamat yang ditentukan. | `JMP LOOP_START` |
| RCALL | label | Relative Call - Memanggil subroutine secara relatif terhadap alamat instruksi saat ini. | `RCALL DELAY_MS` |
| RET | - | Return - Kembali dari subroutine setelah selesai dieksekusi. | `RET` |
| CPI | Rd, K | Compare Immediate - Membandingkan 2 bilangan (register dan nilai konstan) lalu memasukkan hasilnya ke register flag. | `CPI R16, 0x05` |
| BREQ | label | Branch if Equal - Melakukan percabangan ke alamat tertentu jika flag equal (Z) bernilai 1. | `BREQ TARGET_LABEL` |
| BRNE | label | Branch if Not Equal - Melakukan percabangan jika flag not equal (Z=0) bernilai 1. | `BRNE TARGET_LABEL`|
| MOV | Rd, Rr | Move - Memindahkan data dari 1 register ke register lain. | `MOV R16, R0` |
| IN | Rd, P | Input - Membaca data dari port I/O tertentu dan memasukkannya ke dalam register. | `IN R16, 0x23` |
| OUT | P, Rr | Output - Menulis data dari register ke port I/O tertentu. | `OUT 0x25, R16` |
| STS | k, Rr | Store to SRAM - Menyimpan data dari register ke memori SRAM. | `STS 0x0100, R16` |
| ROL | Rd | Rotate Left - Melakukan rotasi bit ke kiri. | `ROL R16` |
| CBI | P, b | Clear Bit in I/O - Set bit tertentu dalam port I/O menjadi 0. | `CBI 0x25, 5` |
| CLC | - | Clear Carry - Mengosongkan bit carry. | `CLC` |
| SWAP | Rd | Swap Nibbles - Menukar posisi nibble atas dan nibble bawah. | `SWAP R16` |
| ROR | Rd | Rotate Right - Memutar bit ke kanan pada register atau memori. | `ROR R16` |
| BREAK | - | Break - Memaksa program berhenti sementara dan memasuki mode debugging. | `BREAK` |
| NOP | - | No Operation - Menunjukkan bahwa tidak ada operasi yang harus dilakukan. | `NOP` |
| SLEEP | - | Sleep - Switch microcontroller ke mode sleep untuk menghemat daya. | `SLEEP` |
| WDR | - | Watchdog Timer Reset - Mereset watchdog timer pada microcontroller. | `WDR` |
| LDS | Rd, k | Load from SRAM - Memuat data dari alamat memori SRAM (k) ke register (Rd). | `LDS R16, 0x0100` |
| SBI | P, b | Set Bit in I/O - Set bit tertentu (b) dalam port I/O (P) menjadi 1. | `SBI PORTB, 5` |
| SBIC | P, b | Skip if Bit is Clear - Melewati instruksi berikutnya jika bit (b) pada I/O port (P) bernilai 0. | `SBIC PIND, 2` |
| SBIS | P, b | Skip if Bit is Set - Melewati instruksi berikutnya jika bit (b) pada I/O port (P) bernilai 1. | `SBIS PIND, 2` |
| DEC | Rd | Decrement - Mengurangi nilai pada register (Rd) sebesar 1. | `DEC R16` |
| INC | Rd | Increment - Menambah nilai pada register (Rd) sebesar 1. | `INC R17` |
| EOR | Rd, Rr | Exclusive OR - Melakukan operasi logika XOR antara dua register. | `EOR R16, R17` |
| PUSH | Rr | Push to Stack - Mendorong (menyimpan) isi dari sebuah register ke atas tumpukan (stack). | `PUSH R16` |
| POP | Rd | Pop from Stack - Menarik (mengambil) data dari atas tumpukan (stack) ke sebuah register. | `POP R16` |
### Referensi
- M. Harditya and M. N. Faza, "Introduction to Assembly & I_O Programming.pdf", Program Studi S1 Teknik Komputer, Fakultas Teknik, Universitas Indonesia, 2024.
- "AVR I/O Port Programming," *AVR-Tutorials*. [Online]. Available: https://www.avr-tutorials.com/avr-io-ports. [Accessed: Feb. 08, 2026].
## 4. Jelaskan salah satu cara untuk menerapkan delay tanpa library external, sertakan kode (5 poin)
salah satu metodenya adalah dengan menggunakan NOP (tidak melakukan apapun selama 1 cycle), lalu di-loop sesuai dengan durasi delay yang diperlukan. metode ini memerlukan perhitungan cycle dengan mempertimbangkan clock dari microcontroller yang digunakan. berikut adalah contoh untuk delay sekitar 10ms untuk atmega328o (16 MHz):
```ASM
; Danish Al Fayyadh Sunarta - 2406416951
ldi r18, 202 ; Byte Rendah
ldi r19, 208 ; Byte Tinggi, menggunakan 2 register karena masing-masing register hanya mampu menyimpan 8-bit (1 Byte)
nop ;
loop:
dec r18 ; decrement byte rendah
brne loop ; Jika r18 belum 0, ulang ke loop
dec r19 ; Jika r18 habis (0), kurangi byte tinggi
brne loop ; Jika r19 belum 0, ulang ke loop
```
history chat gemini:
https://gemini.google.com/share/2443dba7cc5f
### Referensi
- JH Coding, "AVR Tutorials - Assembly Delay Subroutine," RJH Coding, 2018. [Online]. Available: https://www.rjhcoding.com/avr-asm-delay-subroutine.php. [Accessed: Feb. 8, 2026].
- cường nguyễn, “AVR Assembler Programming Tutorial 3: Delay and I/O Configurations,” Studocu, Nov. 06, 2024. https://www.studocu.vn/vn/document/international-university-vnu-hcm/information-techonogy/avr-assembler-programming-tutorial-3/109853699. [Accessed: Feb. 8, 2026].
## 5. Jelaskan apa itu Memory Mapped Input Output (MMIO) dan hubungannya dengan AVR assembly yang akan kita lakukan. (5 poin)
Memory-Mapped Input/Output (MMIO) adalah sebuah metode di mana register dari hardware I/O (seperti port, timer, dan ADC) dipetakan ke dalam alamat memori. sehingga CPU dapat mengakses register-register I/O ini seolah-olah mereka adalah lokasi memori biasa. Hal ini memungkinkan CPU untuk menggunakan instruksi yang sama untuk mengakses memori dan perangkat I/O.
Semua register yang mengontrol fungsionalitas I/O, seperti DDRx, PORTx, dan PINx, memiliki alamat spesifik di dalam ruang data SRAM. Oleh karena itu, kita dapat menggunakan instruksi-instruksi akses memori dalam AVR assembly, seperti LDS (Load Direct from Data Space) dan STS (Store Direct to Data Space), untuk membaca dan menulis ke register-register I/O tersebut.
Dengan MMIO, interaksi dengan perangkat keras dalam AVR assembly menjadi lebih sederhana dan terintegrasi, karena tidak ada set instruksi terpisah yang diperlukan untuk I/O.
### Referensi
- "Memory Mapped I/O and Isolated I/O," *GeeksforGeeks*, Sep. 08, 2022. [Online]. Available: https://www.geeksforgeeks.org/memory-mapped-i-o-and-isolated-i-o/. [Accessed: Feb. 06, 2026].
- G. Schmidt, "Beginners Introduction to the Assembly Language of ATMEL-AVR-Microprocessors," *University of Campinas*. [Online]. Available: http://www.ic.unicamp.br/~celio/mc404-2008/docs/beginner_avr.pdf. [Accessed: Feb. 08, 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)
rangkaian:

simulasi:
https://drive.google.com/file/d/1rFG-XlLo1A18IhJ3W368TM2WzUFX1K1S/view?usp=drive_link
(pada video lupa diberikan nama & npm)
kode assembly:
```ASM
; Danish Al Fayyadh Sunarta - 2406416951
#define __SFR_OFFSET 0x00
#include "avr/io.h"
.global main
main:
SBI DDRB, 4 ; set PB4 (D12) as output (LED)
CBI DDRB, 0 ; set PB0 (D8) as input (button)
SBI PORTB, 0 ; set PB0 (D8) to high to activate internal pull-up resistor
checkButton:
IN R16, PINB ; copy all bit in port B to R16
ANDI R16, 0x01 ; AND immediate R16 with 0x01 to take the PB0 value
CPI R16, 0x00 ; compare R16 with 0 to check if the button is pressed or not
BREQ toggle ; branch to toggle if R16 == 0
JMP checkButton ; back to checkButton if R16 != 0
toggle:
SBI PINB, 4 ; toggle if PB0 == 0 (button is pressed)
checkRelease: ; loop if button is still being pressed. same logic as checkButton
IN R16, PINB
ANDI R16, 0x01
CPI R16, 0x00
BREQ checkRelease
JMP checkButton ; back to checkButton
```