Laborator 2 - Exemple

Exemple simple

  1. Puneți o valoare în registrul AL. Analizați acea valoare făcând debug.
    mov AL, 7
    mov AL, 12
  2. Puneți o valoare în registrul AX. Analizați acea valoare făcând debug.
    mov AX, 256
    mov AX, -1
  3. Puneți o valoare în registrul EAX. Analizați acea valoare făcând debug.
    mov EAX, 40000
    mov EAX, -2
  4. Puneți două valori în doi regiștri. Adunați cele două valori. Scădeți cele două valori. Analizați rezultatele obținute făcând debug.
    mov AX, 300
    mov BX, 256
    add AX, BX
    sub AX, BX
  5. Calculați 5 - 6. Analizați rezultatul obținut făcând debug.
  6. Calculați AL * BL. Analizați rezultatul obținut făcând debug.
  7. Calculați AX / BL. Analizați rezultatul obținut făcând debug.

Exemple complexe

	
; Scrieți un program în limbaj de asamblare care să rezolve expresia aritmetică, considerând domeniile de definiție ale variabilelor
; a - byte, b - word
; (b / a * 2 + 10) * b - b * 15;
; ex. 1: a = 10; b = 40; Rezultat: (40 / 10 * 2 + 10) * 40 - 40 * 15 = 18 * 40 - 1600 = 720 - 600 = 120
; ex. 2: a = 100; b = 50; Rezultat: (50 / 100 * 2 + 10) * 50 - 50 * 15 = 12 * 50 - 750 = 600 - 750 = - 150
bits 32 ;asamblare si compilare pentru arhitectura de 32 biti
; definim punctul de intrare in programul principal
global  start 

extern  exit ; indicam asamblorului ca exit exista, chiar daca noi nu o vom defini
import  exit msvcrt.dll; exit este o functie care incheie procesul, este definita in msvcrt.dll
        ; msvcrt.dll contine exit, printf si toate celelalte functii C-runtime importante
segment  data use32 class=data ; segmentul de date in care se vor defini variabilele 
	a  db 10
	b  dw 40
segment  code use32 class=code ; segmentul de cod
start: 
	mov  AX, [b] ;AX = b
	div  BYTE [a] ;AL = AX / a = b / a și AH = AX % a = b % a
	
	mov  AH, 2 ;AH = 2
	mul  AH ;AX = AL * AH = b / a * 2	
	
	add  AX, 10 ;AX = AX + b = b / a * 2 + 10
	
	mul  word [b] ;DX:AX = AX * b = (b / a * 2 + 10) * b
	
	push  DX ;se pune pe stiva partea high din double word-ul DX:AX
	push  AX ;se pune pe stiva partea low din double word-ul DX:AX
	pop  EBX ;EBX = DX:AX = (b / a * 2 + 10) * b
	
	mov  AX, [b] ;AX = b
	mov  DX, 15 ;DX = 15
	mul  DX ;DX:AX = b * 15
	
	push  DX ;se pune pe stiva partea high din double word-ul DX:AX
	push  AX ;se pune pe stiva partea low din double word-ul DX:AX
	pop  EAX ;EAX = DX:AX = b * 15
	
	sub  EBX, EAX ;EBX = EBX - EAX = (b / a * 2 + 10) * b - b * 15
	
	push   dword 0 ;se pune pe stiva codul de retur al functiei exit
	call   [exit] ;apelul functiei sistem exit pentru terminarea executiei programului