Halaman

Sabtu, 10 Oktober 2020

STRING CHAR UNICODE UTF-32 UTF-16 DAN UTF-8

Dalam bahasa tingkat tinggi seperti java dan python, string mungkin tidak memerlukan perhatian khusus. Tapi pada bahasa c/c++ string perlu ditangani secara kusus. Terlebih lagi dalam bahasa assembly. Dulu ketika komputer hanya dijual di Amerika, tidak ada masalah encoding karena ASCII sudah cukup untuk  digunakan sebagai pengkodean karakter yang ukurannya cuma memerlukan 1byte. 

Seiring perkembangan komputer dan internet, hal tersebut menjadi masalah karena tidak dapat menampilkan karakter tertentu seperti huruf korea dan arab. Masalah tersebut diatasi dengan teknologi code page. Jadi setiap negara memiliki code page masing-masing dalam pengkodean karakternya. Tapi hal tersebut menimbulkan masalah baru lagi, karakter untuk bahasa berbeda tidak dapat ditampilkan dalam satu mesin yang sama. Maka lahirlah utf-16 dan utf-32. UTF-16 menyimpan karakter dengan ukuran 2byte sedangkan UTF-32 menyimpan karakter dalam ukuran 4byte. Masalah lain yang muncul adalah adanya pemborosan storage penyimpanan ketika karakter yang disimpan hanya ASCII dan harus disimpan dengan menghabiskan 2byte atau 4byte, ini dirasa overkill.

Sederet masalah diatas akhirnya terpecahkan dengan lahirnya UTF-8. UTF-8 menyimpan karakter dengan ukuran 1byte, 2byte, 3byte sampai 4byte tergantung kebutuhan. ASCII disimpan hanya menggunakan 1byte. Masalah dari sistem utf-8 ini adalah perlu identifikasi khusus untuk menentukan karakter. Misalnya "Aݔ" dalam hexadecimal "410754", bagaimana cara komputer membedakan karakter pertama adalah 0x41 dan karakter kedua dua byte 0x0754. Mengapa tidak 0x4107 dan 0x54 ? Nah, memang sulit dari sudut pandang bahasa tingkat tinggi. Tapi dari sudut pandang assembly semuanya menjadi jelas. Berikut tabel dari wikipedia bahasa indonesia :

Bit
code point
Code point
pertama
Code point
terakhir
Byte dalam
sequence
Byte 1Byte 2Byte 3Byte 4Byte 5Byte 6
  7U+0000U+007F10xxxxxxx
11U+0080U+07FF2110xxxxx10xxxxxx
16U+0800U+FFFF31110xxxx10xxxxxx10xxxxxx
21U+10000U+1FFFFF411110xxx10xxxxxx10xxxxxx10xxxxxx
26U+200000U+3FFFFFF5111110xx10xxxxxx10xxxxxx10xxxxxx10xxxxxx
31U+4000000U+7FFFFFFF61111110x10xxxxxx10xxxxxx10xxxxxx10xxxxxx10xxxxxx

Jadi, cara membedakan apakah karakter tersebut 1byte, 2byte, 3byte atau 4byte adalah dari bilangan biner yang digunakan. Jika awalnya adalah 0, berarti jumlah byte merepresentasikan karakter tersebut adalah 1byte. Jika awalnya adalah 110, berarti ukuran karakter tersebut 2byte, 1110 untuk 3byte, 11110 untuk 4byte dan seterusnya. Byte selanjutnya jika berisi 10 berarti sambungan dari byte sebelumnya. Maka dapat diidentifikasi 0100 0001 adalah karakter yang hanya 1byte (A) , dan 11011101 10010100 adalah karakter 2byte (ݔ). 

Minggu, 20 September 2020

TUTORIAL 1 : BELAJAR ASSEMBLY UNTUK ANDROID ARM

Ass. Wr. Wb.

Pada kesempatan ini kita akan belajar membuat code assembly untuk android ARM. Disini akan dipraktekkan bagaimana cara membuat aplikasi android tanpa gradle atau tanpa build system. Jadi kita akan membuat aplikasi android tanpa Android Studio. Mengapa kita perlu untuk belajar membuat aplikasi android tanpa Android studio dan gradle, ya karena koneksi internet di indonesia belum merata dan masih mahal. Jadi kita perlu cara untuk mendevelop aplikasi android secara offline. Peralatan yang diperlukan adalah  Android NDK r21 dari situs https://android-developers.googleblog.com cukup download sekali, sudah bisa dipakai di banyak komputer secara offline. System yang saya pakai adalah windows 64bit, jadi download NDKnya ya untuk windows64bit juga. 




Untuk teman-teman bisa sesuaikan dengan system yang dipakai, apakah linux atau mac. Adapun device yang digunakan untuk demo programnya adalah android ice cream sandwich atau ICS, bukan emulator. Alasannya adalah untuk memastikan apakah aplikasi benar-benar akan berjalan di android device smartphone. Perlu diperhatikan bahwa bahasa assembly ini harus dijalankan pada emulator yang bisa mengemulasi processor ARM. Bluestack, NOX, PrimeOS, PhoenixOS semuanya x86_64 tidak bisa ARM. Pada kesempatan lain kita akan menggunakan QEMU, karena qemu ini bisa mengemulasi perangkat keras seperti processor arm 32bit, arm 64bit, x86_64 dan lain-lain. Untuk mengetahui lebih dalam silahkan merujuk ke www.qemu.org.


; Code program sebaiknya diberi keterangan lengkap agar mudah di fahami

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Nama Program : Halo Dunia Robot
; Nama file : halo.s
; Dibuat oleh : Gunawan Jinnu
; Tanggal pembuatan : 20 September 2020
; Tanggal update : 20 September 2020
; Deskripsi
- Menampilkan pesan Halo Dunia Robot

; Compiler : NDK r21 x86_64 https://android-developers.googleblog.com
; Compile dengan cara :
; arm-linux-androideabi/bin/as -o halo.o halo.s
; Link dengan cara :
;
arm-linux-androideabi/bin/ld -o halo halo.o
;Link source code : https://re-pinrang.blogspot.com
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

.data
    pesan: .ascii "Halo Dunia Robot.\n"
    len_pesan = . - pesan

.bss

.text
.globl _start
_start:
mov %r0, $1 // file descriptor 1 (stdout)
ldr %r1, =pesan
mov %r2, $len_pesan
mov %r7, $4 // syscall 4 (syswrite)
swi $0                  //linux kernel syscall
mov %r0, $0         // exit status return 0
mov %r7, $1 // syscall 1 (exit)
swi $0                  //linux kernel syscall


Kalau kita perhatikan, kode assembly ini sama saja dengan assembly di linux. Mulai dari file descriptor yang digunakan 1 sebagai standard output di linux. Kemudian syscall 4 syswrite linux. Syscall 1 untuk exit. Yang agak beda adalah swi $0, kalau di linux itu intrupsi 0x80h, tapi artinya sama saja linux kernel syscall.

Cara compile :
Extrack NDK r21 yang sudah di download, cari lokasi folder android-ndk-r21b\toolchains\arm-linux-androideabi-4.9\prebuilt\windows-x86_64\arm-linux-androideabi\bin

as -o halo.o halo.s

menghasilkan file objek halo.o

link dengan cara:

ld -o halo halo.o

Cara running di android :
1. Hubungkan dengan kabel usb, buka cmd, ketik : adb push halo /sdcard/
2. Ketik : adb shell
3. mkdir /data/user/temp
4. mv /sdcard/halo /data/user/temp/
5. cd /data/user/temp
6. ./halo

Setelah itu harusnya muncul pesan Halo Dunia Robot.

Ok. Semoga bermanfaat. Terimakasih.

Dasar

TUTORIAL 1 : DASAR BAHASA ASSEMBLY WINDOWS 32bit MASM32 CONSOLE UNTUK PEMULA

Alhamdulillahirabbilalamin, pada saat ini kita semua masih diberi kesempatan untuk terus belajar, kita niatkan mudah-mudahan apa yang kita l...

Postingan Populer