Div Dan Modulus Dalam Bahasa Assembly

Deskripsi

Pada kali ini saya akan menjelaskan sedikit tentang pembagian integer dalam konteks assembly, terutama di arsitektur x86_64. Div atau pembagian di assembly ini tentunya ngga seperti pemrograman biasa, kalau pemrograman biasa kan tinggal itung terus print kan udah selesai. Nah di assembly, kita perlu mengatur beberapa register sebagai penyimpan sisa bit peghitungan, kenapa perlu diingat? Karena di assembly kita melakukan operasi atau program itu benar benar low level, jadi sisa penghitungan saja perlu diingat menggunakan register.

Case Sederhana Pembagian Dengan Assembly

Misal di sini saya mau melakukan rumus pembagian sederhana, yaitu kecepatan = jarak / waktu. Di mana kecepatannya dalam bentuk register rax, jarak dalam bentuk register rdi, dan waktu dalam bentuk register rsi, dan pengingatnya tadi dalam bentuk register rdx, oiya pengingat ini usahakan nilai awalnya 0 ya, nanti saya ajarkan cara menjadikan 0 di reminder.

Langsung saja ke programnya, buat program dengan ekstensi .asm atau .s bebas. Setelah itu deklarasikan headernya, header untuk apa? untuk mengenalkan ke compiler kalau program kita itu program assembly.

.intel_syntax noprefix
.global _start
_start:

Intel syntax noprefix itu gunanya untuk ngasih tau ke compiler kalau program kita itu syntaxnya pakai assembly intel. Dan .global start: itu buat ngenalin ke compiler kalau program kita itu dimulai dari start itu. Nah langsung saja ke intinya. Yang pertama adalah kita ngisikan rax dengan value ‘0’ ada 2 cara, yang pertama kita langsung aja ngisikan pake mov, seperti gambar di bawah.

mov rax, 0

Jadi, instruksi di atas akan mengisikan atau memindahkan 0 ke dalam register rax. Dan cara kedua pake xor, xor itu apa? xor adalah gerbang logika yang akan mengembalikan nilai 0 ketika kedua inputnya sama, dan mengembalikan nilai 1 apabila kedua inputnya berbeda.

test

Jadi, dengan ngelakuin operasi xor rax dengan rax, akan menghasilkan 0 karena kedua inputnya sama (sama-sama rax), seperti di bawah ini.

xor rax, rax

Setelah kita buat rax bernilai 0, langsung saja ke perhitungannya yaitu kecepatan = jarak / waktu atau rax = rdi / rsi. Langkah pertama adalah memasukkan rdi ke rax (karena hasil akhirnya di rax).

mov rax, rdi

Setelah itu, langsung saja bagi dengan rsi dengan instruksi div.

div rsi

Dan berikut adalah final program pembagiannya.

.intel_syntax noprefix
.global _start
_start:
		xor rax, rax
		mov rax, rdi
		div rsi

Dan selesai.

Case Sederhana Perhitungan Modulus

Di sini kasusnya gw mau rdi modulus rsi, nah kalau modulus kan yang ditampilin bukan hasil pembagiannya tapi sisa pembagiannya, di sini gw mau nampilin sisa modulusnya ke dalem rax, maka sama kayak tadi, bedanya sisanya kan didapet dari remainder, terus dimasukkin ke rax, kelar.

.intel_syntax noprefix
.global _start
_start:
		xor rax, rax
		xor rdx, rdx
		mov rax, rdi
		div rsi
		mov rax, rdx

Kesimpulan

Kesimpulannya adalah di assembly kita perlu ngeset remaindernya manual aokwaowkaoaowkaoawkaow tengs udah baca semoga harimu indah selalu emuach :3

0%