Div Dalam Konteks 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 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.
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. Jadi, dengan ngelakuin operasi xor rax dan rax, akan menghasilkan 0 karena kedua inputnya sama (sama-sama rax), seperti di bawah ini.