viernes, 3 de octubre de 2008

Instrucciones ( IV ) Aritmética binaria

El procesador ( mas bien la ALU ) puede solucionar problemas aritméticos para números binarios usando estas instrucciones; add , inc , sbb , dec , cmp , neg , xadd , mul , imul , div , idiv.


ADD y SBB sumar y restar


  • add ax,bx añade el registro BX a AX,el resultado queda en AX
  • add ax,[si] añade un dato de la memoria al registro AX
  • add [di],al añade el registro AL a un dato en memoria
  • sbb al,48 substrae del registro AL el valor 48
  • sbb [char],48 substrae de un dato en memoria el valor 48

INC y DEC disminuir e incrementar

  • inc ax incrementa el contenido del registro AX en una unidad
  • dec byte [bx] resta de un dato de la memoria una unidad

CMP comparación

  • cmp ax,bx compara AX con BX, si son iguales el flag ZF = 1 si son diferentes ZF = 0

NEG invierte el signo

  • neg ax ; AX --> (-AX)

XADD

  • xadd intercambia el operador de destino con el operador de fuente, luego carga la suma de los dos valores en el operador de destino. Las reglas para este operador son las mismas que para la instruccion suma

MUL multiplicación sin asignar

Multiplicar es un poco mas complicado porque hay que hacer mas de una operación y varía segun el tamaño del multiplicando.


  • para 8 bits el valor que queremos que sea multiplicado se mete en el registro AL , se ejecuta la instrucción con el multiplicando y el resultado queda en el registro AX.
  1. multiplicador db 5
  2. multiplicado db 10
  3. mov al,multiplicado
  4. mul multiplicador ; 10 * 5 --> AX
  • para 16 bits el valor que queremos que sea multiplicado se mete en el registro AX , se ejecuta la instrucción con el multiplicando y el resultado queda en los registros DX:AX , la palabra de 16bits de mas peso queda en DX.
  1. multiplicador dw 5
  2. multiplicado dw 10
  3. mov ax,multiplicado
  4. mul multiplicador ; 10 * 5 --> DX:AX
  • para 32 bits el valor que queremos que sea multiplicado se mete en el registro EAX , se ejecuta la instrucción con el multiplicando y el resultado queda en los registros EDX:EAX , la palabra de 16bits de mas peso queda en EDX.
  1. multiplicador dq 5
  2. multiplicado dq 10
  3. mov eax,multiplicado
  4. mul multiplicador ; 10 * 5 --> EDX:EAX

DIV división sin asignar

En la práctica la forma de dividir es casi igual a la forma de multiplicar.

  • para 8 bits se mete el divisor en AL y se ejecuta la instrucción con el dividendo, el resultado quedará en AX y el resto en AH.
  1. divisor db 5
  2. dividendo db 10
  3. mov al,divisor
  4. div dividendo ; 10 / 5 --> AX ; mod --> AH
  • para 16 bits se mete el divisor en DX:AX y se ejecuta la instrucción con el dividendo, el resultado quedará en AX y el resto en DX.
  1. mov dx,10 ;los 8b de mas peso del dividendo en DX
  2. mov ax,20 ; los 8b de menor peso en AX
  3. mov cx,5 ;el divisor por ejemplo en CX
  4. div cx ; DX:AX / CX --> AX ; mod --> DX
  • para 32 bits se mete el divisor en EAX:EDX y se ejecuta la instrucción con el dividendo, el resultado quedará en EAX y el resto en EDX.
  1. mov edx,10 ;los 16b de mas peso del dividendo en EDX
  2. mov eax,20 ; los 16b de menor peso en EAX
  3. mov ecx,5 ;el divisor por ejemplo en ECX
  4. div ecx ; EDX:EAX / ECX --> EAX ; mod --> EDX

IMUL multiplicar con datos asignados

  • imul bl ;acumulador * BL --> acumulador
  • imul word [si] ;acumulador * [si] --> acumulador
  • imul bx,cx ;BX * CX --> BX
  • imul bx,[si] ;BX * [si] --> BX
  • imul bx,10 ;BX * 10 --> BX
  • imul ax,bx,10 ;BX * (AX <- 10 ) --> AX
  • imul ax,[si],10 ; [si] * ( AX <- 10 ) --> AX

IDIV dividir con datos asignados

  • idiv bX ;acumulador / BX --> acumulador
  • idiv word [si] ;acumulador / [si] --> acumulador
  • idiv bx,cx ;BX / CX --> BX
  • idiv bx,[si] ;BX / [si] --> BX
  • idiv bx,10 ;BX / 10 --> BX
  • idiv ax,bx,10 ;BX / (AX <- 10 ) --> AX
  • idiv ax,[si],10 ; [si] / ( AX <- 10 ) --> AX

El resto es procesado igual que para la instruccion div

No hay comentarios: