# 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)