I dati numerici è generalmente rappresentato nel sistema binario. Istruzioni aritmetiche operano su dati binari. Quando i numeri sono visualizzati sullo schermo o immessi dalla tastiera, sono in formato ASCII.

Finora, abbiamo trasformato questi dati di input in formato ASCII a binario per calcoli aritmetici e convertito il risultato al binario. Il codice seguente mostra questo -

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
Quando il codice di cui sopra è compilato ed eseguito, esso produce il seguente risultato -

The sum is:
7
Tali conversioni, tuttavia, hanno un overhead e programmazione in linguaggio assembly permette l'elaborazione dei numeri in modo più efficiente, in forma binaria. I numeri decimali possono essere rappresentati in due forme -

Formato ASCII
BCD o in forma decimale codificato in binario
Rappresentazione ASCII
In rappresentazione ASCII, numeri decimali vengono memorizzati come stringa di caratteri ASCII. Ad esempio, il valore decimale 1234 è memorizzato come -

31 32 33 34H
Dove, 31H è valore ASCII per 1, 32H è valore ASCII per 2, e così via. Ci sono quattro istruzioni per l'elaborazione di numeri in rappresentazione ASCII -

AAA - ASCII Regolare dopo l'aggiunta

AAS - ASCII Regolare dopo la sottrazione

AAM - ASCII Regolare Dopo Moltiplicazione

AAD - ASCII Regolare Prima Divisione

Queste istruzioni non prendono alcun operandi e assumono l'operando richiesta per essere nel registro AL.

L'esempio seguente utilizza le istruzioni AAS per dimostrare il concetto -

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
Quando il codice di cui sopra viene compilato ed eseguito, produce il seguente risultato-

The Result is:
6
Rappresentazione BCD
Ci sono due tipi di rappresentazione BCD -

Unpacked rappresentazione BCD
Rappresentazione BCD Imballato
Nella rappresentazione BCD scompattato, ogni byte memorizza l'equivalente binario di una cifra decimale. Ad esempio, il numero 1234 viene memorizzato come -

01 02 03 04H
Ci sono due istruzioni di trattamento di questi numeri -

AAM - ASCII Regolare Dopo Moltiplicazione
AAD - ASCII Regolare Prima Divisione
I quattro ASCII regolare istruzioni, AAA, AAS, AAM, e AAD, può essere utilizzato anche con la rappresentazione BCD spacchettato. Nella rappresentazione BCD imballato, ogni cifra viene memorizzato utilizzando quattro bit. Due cifre decimali sono confezionati in un byte. Ad esempio, il numero 1234 viene memorizzato come -

12 34H
Ci sono due istruzioni di trattamento di questi numeri -

DAA - Decimale Regolare dopo l'aggiunta
DAS - Regolare decimale dopo la sottrazione
Non vi è alcun supporto per la moltiplicazione e la divisione nella rappresentazione BCD imballato.

Esempio
Il seguente programma aggiunge due numeri decimali 5 cifre e visualizza la somma. Esso utilizza i concetti di cui sopra -

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 ' '
Quando il codice di cui sopra è compilato ed eseguito, esso produce il seguente risultato -

The Sum is:
35801