19 Desember 2016 - 22:31:57 - Read: 443

Menulis Kode 8-bit, 16-bit, 32-bit, dan 64-bit "Hello World!" Dengan Assembly

Masih berkutat dengan "Hello World!" dulu. :)

Hanya saja bedanya kali ini kita akan menulis menggunakan code 8-bit, 16-bit, 32-bit, dan 64-bit.

Referensi dari http://www.cs.virginia.edu/~evans/cs216/guides/x86.html

dijelaskan tentang penamaan dan panjang masing-masing alamat Register general purpose .

x86 register

Hanya saja pada contoh gambar diatas hanya mengilustrasikan panjang bit sampe dengan 32. Sebagai contoh jika dengan 64-bit semacam ini:

0x1122334455667788
  ================ rax (64 bits)
          ======== eax (32 bits)
              ====  ax (16 bits)
              ==    ah (8 bits)
                ==  al (8 bits)

Sebagai contoh lagi, jika register RAX memiliki nilai 1010 0000 0000 0000 0000 0000 0000 0000 1111 0000 0000 0000 0000 0000 0000 0111, maka

RAX : 1010 0000 0000 0000 0000 0000 0000 0000 1111 0000 0000 0000 0000 0000 0000 0111
EAX : 1111 0000 0000 0000 0000 0000 0000 0111 AX : 0000 0000 0000 0111 AH : 0000 0000 AL : 0000 0111

 Jenis-jenis register juga bisa dilihat dari penjelasan dengan bahasa Indonesia pada blog ini http://zeisback.blogspot.co.id/2014/01/say-hello-world-with-assembly.html

Kategori Nama Penjelasan
General Purpose EAX, EBX, ECX, EDX Lebar data 32 bit, boleh diapakai untuk keperluan apa saja. E adalah Extended (karena awalnya register general purpose hanya 16 bit).
  AX,BX,CX,DX 16 bit bawah dari register 32 bit di atas. AX adalah bagian 16 bit bawah dari EAX.
  AH,AL,BH,BL,CH,CL,DH,DL Bagian 8 bit dari register 16 bit di atas . AH adalah 8 bit atas dari AX. AL adalah 8 bit bawah dari AX.
Segment Register CS, SS, DS, ES, FS, GS Digunakan untuk menunjuk 16 bit awal alamat memori. CS = Code, SS = Stack, DS = Data, ES,FS,GS = Extra segment register
Offset Register   Digunakan untuk menunjuk 16 bit akhir alamat memori. Alamat memori ditunjukkan dengan gabungan segment dan offset.
  EBP Dipakai sebagai offset frame dalam stack. Biasanya menunjuk pada bottom of stack frame di suatu fungsi. ESP menunjukkan puncak stack, EBP menunjuk dasar stack.
  ESI Biasanya dipakai untuk offset string sumber dalam operasi yang melibatkan blok memori.
  EDI Biasanya dipakai untuk offset string tujuan dalam operasi yang melibatkan blok memori.
  ESP Stack pointer, menunjukkan puncak dari stack.
Special EFLAGS Tidak bisa dipakai programmer, hanya dipakai prosesor untuk hasil operasi logical dan state.
  EIP Tidak bisa dipakai programmer, hanya dipakai prosesor untuk menunjukkan alamat memori yang berisi instruksi berikutnya yang akan dieksekusi.

Dan tambahan untuk register General Purpose 64-bit adalah RAX, RBX, RCX, RDX.

 Dimana pada masing-masing register bisa menampung nilai maksimum tergantung dari lebar bit nya.

Note: Penjabaran tentang masing-masing register akan kita bahas di artikel-artikel berikutnya. Ane belajar dulu gan :D

Tujuan kita pada artikel kali ini adalah contoh penulisan Hello World menggunakan contoh masing-masing bit, dari 8-bit hingga 64-bit.

Sebagai pengingat, RXX untuk 64-bit, EXX untuk 32-bit, AX untuk 16-bit, dan AH/AL untuk 8-bit. Berikut masing-masing codenya

64-bit

section	.text
   global _start     ;must be declared for linker (ld)
	
_start:	            ;tells linker entry point
   mov	rdx,len     ;message length
   mov	rcx,msg     ;message to write
   mov	rbx,1       ;file descriptor (stdout)
   mov	rax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	rax,1       ;system call number (sys_exit)
   int	0x80        ;call kernel

section	.data
msg db 'Hello, world!', 0xa  ;string to be printed
len equ $ - msg     ;length of the string

32-bit

section	.text
   global _start     ;must be declared for linker (ld)
	
_start:	            ;tells linker entry point
   mov	edx,len     ;message length
   mov	ecx,msg     ;message to write
   mov	ebx,1       ;file descriptor (stdout)
   mov	eax,4       ;system call number (sys_write)
   int	0x80        ;call kernel
	
   mov	eax,1       ;system call number (sys_exit)
   int	0x80        ;call kernel

section	.data
msg db 'Hello, world!', 0xa  ;string to be printed
len equ $ - msg     ;length of the string

16-bit

section .text
	global _start ;must be declared for linker (ld)
	
_start: ;tells linker entry point
	mov dx,len ;message length
	mov ecx,msg ;message to write
	mov bx,1 ;file descriptor (stdout)
	mov ax,4 ;system call number (sys_write)
	int 0x80 ;call kernel

	mov ax,1 ;system call number (sys_exit)
	int 0x80 ;call kernel

section .data
	msg db 'Hello World!', 0xa ;string to be printed
	len equ $ - msg ;length of the string

8-bit

section .text
	global _start ;must be declared for linker (ld)
	
_start: ;tells linker entry point
	mov dl,len ;message length
	mov ecx,msg ;message to write
	mov bl,1 ;file descriptor (stdout)
	mov al,4 ;system call number (sys_write)
	int 0x80 ;call kernel

	mov al,1 ;system call number (sys_exit)
	int 0x80 ;call kernel

section .data
	msg db 'Hello World!', 0xa ;string to be printed
	len equ $ - msg ;length of the string

Perbedaan file binary 64-bit diatas dengan file binary pada artikel Assembly First Code, Hello World! adalah pada artikel pertama 64-bit nya dibuild langsung format oleh "nasm" , sedangkan para artikel ini, file binarynya benar-benar dibuat menggunakan kode 64-bit.

Yarp, berikutnya coba kita membuat kasus yang lebih kompleks lagi.

Thx to: ArRay Arcahya, atas code 16-bit dan 8-bit nya :p