abc Asembler - elektronski priručnik
X dio Aritmetičke instrukcije
Instrukcija ADD i SUB
Instrukcije ADD i SUB se koriste za izvršavanje jednostavnog sabiranja/oduzimanja binarnih podataka byte, word i doubleword veličine, tj., za sabiranje ili oduzimanje 8-bitnih, 16-bitnih ili 32-bitnih operanda, respektivno.
Sintaksa
Instrukcije ADD i SUB imaju sljedeću sintaksu:
ADD/SUB destination, source
Instrukcija ADD/SUB može biti između:
- Registra i registra
- Memorije i registra
- Registra i memorije
- Registra i konstantnog podatka
- Memorije i konstantnog podatka
Međutim, kao i kod drugih instrukcija, operacije memorija-u-memoriju nisu moguće za ADD/SUB instrukcije. ADD ili SUB operacija postavlja ili prazni overflow i carry flagove.
Primjer
Sljedeći primjer će zatražiti od korisnika da unese 2 cifre, spremiće te cifre u EAX i EBX registar, respektivno, sabraće vrijednosti, spremiće rezultat u memorijsku lokaciju 'res' i konačno prikazati rezultat.
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
segment .data
msg1 db "Unesite cifru ", 0xA,0xD
len1 equ $- msg1
msg2 db "Unesite drugu cifru", 0xA,0xD
len2 equ $- msg2
msg3 db "Suma je: "
len3 equ $- msg3
segment .bss
num1 resb 2
num2 resb 2
res resb 1
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_READ
mov ebx, STDIN
mov ecx, num1
mov edx, 2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, SYS_READ
mov ebx, STDIN
mov ecx, num2
mov edx, 2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg3
mov edx, len3
int 0x80
; moving the first number to eax register and second number to ebx
; and subtracting ascii '0' to convert it into a decimal number
mov eax, [number1]
sub eax, '0'
mov ebx, [number2]
sub ebx, '0'
; add eax and ebx
add eax, ebx
; add '0' to to convert the sum from decimal to ASCII
add eax, '0'
; storing the sum in memory location res
mov [res], eax
; print the sum
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, res
mov edx, 1
int 0x80
exit:
mov eax, SYS_EXIT
xor ebx, ebx
int 0x80
Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:
Unesite cifru:
3
Unesite drugu cifru:
4
Suma je:
7
Program sa varijablama unesenim u kod:
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 "Suma je:", 0xA, 0xD
len equ $ - msg
segment .bss
sum resb 1
Kada se gore navedeni kod kompajlira i izvrši, on će proizvesti sljedeći rezultat:
Suma je:
7
Instrukcija DEC < Index > Instrukcije MUL/IMUL
|
 |