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