Majelis - Angka

Data numerik umumnya direpresentasikan dalam sistem biner. Instruksi aritmatika beroperasi pada data biner. Ketika angka ditampilkan di layar atau dimasukkan dari keyboard, angka tersebut dalam bentuk ASCII.

Sejauh ini, kami telah mengubah data masukan ini dalam bentuk ASCII menjadi biner untuk kalkulasi aritmatika dan mengubah hasilnya kembali ke biner. Kode berikut menunjukkan ini -

section	.text
   global _start        ;must be declared for using gcc
	
_start:	                ;tell linker entry point
   mov	eax,'3'
   sub     eax, '0'
	
   mov 	ebx, '4'
   sub     ebx, '0'
   add 	eax, ebx
   add	eax, '0'
	
   mov 	[sum], eax
   mov	ecx,msg	
   mov	edx, len
   mov	ebx,1	         ;file descriptor (stdout)
   mov	eax,4	         ;system call number (sys_write)
   int	0x80	         ;call kernel
	
   mov	ecx,sum
   mov	edx, 1
   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 "The sum is:", 0xA,0xD 
len equ $ - msg   
segment .bss
sum resb 1

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The sum is:
7

Konversi semacam itu, bagaimanapun, memiliki overhead, dan pemrograman bahasa assembly memungkinkan pemrosesan angka dengan cara yang lebih efisien, dalam bentuk biner. Angka desimal dapat direpresentasikan dalam dua bentuk -

  • Formulir ASCII
  • BCD atau bentuk Desimal Berkode Biner

Representasi ASCII

Dalam representasi ASCII, bilangan desimal disimpan sebagai string karakter ASCII. Misalnya, nilai desimal 1234 disimpan sebagai -

31	32	33	34H

Dimana 31H adalah nilai ASCII untuk 1, 32H adalah nilai ASCII untuk 2, dan seterusnya. Ada empat instruksi untuk memproses angka dalam representasi ASCII -

  • AAA - ASCII Sesuaikan Setelah Penambahan

  • AAS - ASCII Sesuaikan Setelah Pengurangan

  • AAM - ASCII Sesuaikan Setelah Perkalian

  • AAD - ASCII Sesuaikan Sebelum Divisi

Instruksi ini tidak menggunakan operand apa pun dan menganggap operand yang diperlukan ada di register AL.

Contoh berikut menggunakan instruksi AAS untuk mendemonstrasikan konsep -

section	.text
   global _start        ;must be declared for using gcc
	
_start:	                ;tell linker entry point
   sub     ah, ah
   mov     al, '9'
   sub     al, '3'
   aas
   or      al, 30h
   mov     [res], ax
	
   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	edx,1	        ;message length
   mov	ecx,res	        ;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 'The Result is:',0xa	
len equ $ - msg			
section .bss
res resb 1

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The Result is:
6

Representasi BCD

Ada dua jenis representasi BCD -

  • Representasi BCD yang tidak dikemas
  • Representasi BCD yang dikemas

Dalam representasi BCD yang tidak dikemas, setiap byte menyimpan ekuivalen biner dari digit desimal. Misalnya, angka 1234 disimpan sebagai -

01	02	03	04H

Ada dua instruksi untuk memproses angka-angka ini -

  • AAM - ASCII Sesuaikan Setelah Perkalian

  • AAD - ASCII Sesuaikan Sebelum Divisi

Empat instruksi penyesuaian ASCII, AAA, AAS, AAM, dan AAD, juga dapat digunakan dengan representasi BCD yang tidak dikemas. Dalam representasi BCD yang dikemas, setiap digit disimpan menggunakan empat bit. Dua digit desimal dikemas menjadi satu byte. Misalnya, angka 1234 disimpan sebagai -

12	34H

Ada dua instruksi untuk memproses angka-angka ini -

  • DAA - Penyesuaian Desimal Setelah Penambahan

  • DAS - Desimal Sesuaikan Setelah Pengurangan

Tidak ada dukungan untuk perkalian dan pembagian dalam representasi BCD yang dikemas.

Contoh

Program berikut menjumlahkan dua bilangan desimal 5-digit dan menampilkan jumlahnya. Ini menggunakan konsep di atas -

section	.text
   global _start        ;must be declared for using gcc

_start:	                ;tell linker entry point

   mov     esi, 4       ;pointing to the rightmost digit
   mov     ecx, 5       ;num of digits
   clc
add_loop:  
   mov 	al, [num1 + esi]
   adc 	al, [num2 + esi]
   aaa
   pushf
   or 	al, 30h
   popf
	
   mov	[sum + esi], al
   dec	esi
   loop	add_loop
	
   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	edx,5	        ;message length
   mov	ecx,sum	        ;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 'The Sum is:',0xa	
len equ $ - msg			
num1 db '12345'
num2 db '23456'
sum db '     '

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

The Sum is:
35801