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