Evaluarea expresiilor aritmetice

Instructiuni folosite (a se vedea Norton Guide pentru detalii): mov, add, sub, cbw, cwd, adc, sbb, mul, imul, div, idiv.

Registrii de 8 biti: ah, al, bh, bl, ch, cl, dh, dl.

Registrii de 16 biti: ax, bx, cx, dx, si, di.

Atentie! Registrul ax este format prin juxtapunerea registrilor ah si al. Asta inseamna ca modificarea continutului unuia din registrii ah sau al conduce la modificarea bitilor corespunzatori din ax si reciproc. De exemplu, in urma instructiunilor

  mov al, 10 ;10 = 0Ah
  mov ah, 1
registrul ax va contine valoarea 266 (010Ah).

Declaratii de date: db (1 octet = 8 biti), dw (2 octeti = 16 biti), dd (4 octeti = 32 biti).

Adunari si scaderi

Putem folosi oricare dintre registrii numiti mai sus, precum si variabile auxiliare.

Exemplu: sa se evalueze expresia r=(a+b)-(c+d)-(e+20) unde toate veriabilele sunt reprezentate pe 16 biti cu semn.

Rezolvare

Date:

a dw 1000
b dw 500
c dw 20
d dw 300
e dw -300
r dw ?

Cod:

    mov ax, a
    add ax, b ; ax = a+b
    mov si, c
    add si, d ; si = c+d
    sub ax, si ; ax = (a+b) - (c+d)
    mov si, e
    add si, 20 ; si = e+20
    sub ax, si ; ax = (a+b) - (c+d) -(e+20)
    mov r, ax

Aritmetica pe 32 de biti

Daca avem de adunat/scazut numere reprezentate pe 32 de biti (sau mai multi), nu avem instructiune de adunare/scadere corespunzatoare. In scopul efectuarii operatiei, vom aduna cate o "felie" de 16 biti o data. Astfel, vom aduna cei 16 biti mai putin semnificativi din cei doi operanzi, apoi vom aduna cei 16 biti mai semnificativi din cei doi operanzi impreuna cu transportul de la "felia" anterioara.

O a doua problema ce apare este faptul ca nu putem transfera 32 de biti o data.

Fie urmatorul exemplu: sa se calculeze r=a+b, unde r, a si b sunt reprezentate pe 32 de biti.

Rezolvare

Date:

a dd 1000000
b dd 500000
r dd ?

Cod:

    mov ax, word ptr a
    mov dx, word ptr a +2
    add ax, word ptr b
    adc dx, word ptr b+2
    mov word ptr r, ax
    mov word ptr r+2, dx

Constructii folosite:

Exercitii

  1. Calculati suma r=a+b, adunand doar cate 8 biti o data.
  2. Calculati r=a+b-c-20, r, a,b si c fiind reprezentate pe 32 de biti cu semn.

Conversii de lungime

Daca operanzii pentru adunare si scadere nu au lungimile egale este necesara modificarea lungimii reprezentarii cel putin pentru unul dintre ei.

Lungirea reprezentarii pentru intregii cu semn se face cu ajutorul instructiunilor cbw si cwd. Lungirea reprezentarilor pentru numere fara semn se face prin completare cu zerouri.

Exemple

  1. r=a-b, r si a fiind reprezentate pe 16 de biti cu semn, iar b pe 8 biti cu semn

    Rezolvare

    Date:

    a dw 2000
    b db -4
    r dw ?
    

    Cod:

      mov al, b
      cbw ; ax = b
      mov si, a
      sub si, ax ; si = a-b
      mov r, si
    
  2. r=a+b, r si b fiind pe 16 biti fara semn, iar a pe 8 biti fara semn.

    Rezolvare

    Date:

    a dw 2000
    b db 4
    r dw ?
    

    Cod:

      mov al, b
      mov ah, 0 ; ax = b
      add ax, b ; ax = a+b
      mov r, ax
    

Exercitii

  1. Calculati r=a+b-c, unde r si b sunt pe 32 de biti cu semn, a este pe 16 biti cu semn, iar c este pe 8 biti cu semn.
  2. Ca la exercitiul precedent, dar numerele sunt reprezentate fara semn.

Inmultiri si impartiri

Trebuie avute in vedere restrictiile de lungime, registrii specifici pentru unii operanzi, precum si diferenta intre instructiunile pentru numere reprezentate cu semn (imul si idiv) si fara semn (mul si div).

Exemplu

Sa se evalueze r=(a-b*c)/d, unde a, b, c, d, r vor fi reprezentate pe 16 biti cu semn.

Rezolvare

Date

a dw 1000
b dw -500
c dw 30000
d dw 10000
r dw ?

Cod

    mov ax, b
    imul c ; dx:ax = b*c
    mov bx, dx
    mov cx, ax ; bx:cx = b*c , avem nevoie de dx:ax pt. conversia lui a
    mov ax, a
    cwd ; dx:ax = a
    sub ax, cx
    sbb dx, bx ; dx:ax = a-b*c
    idiv d ; ax = (a-b*c)/d
    mov r, ax


Arhitectura Calculatoarelor

21 Nov 2001
Radu-Lucian LUPSA