Documentos de Académico
Documentos de Profesional
Documentos de Cultura
2.1 Op - Basicas
2.1 Op - Basicas
Registros de segmento (Solo se pueden usar para los usos mencionados a excepción de ES)
MOV es bastante flexible en el uso de sus operandos, siempre y cuando se observen las siguientes
reglas:
He aquí una lista de las variantes generales de MOV, excluyendo los registros de segmento:
Memoria a memoria: Una sola instrucción MOV no puede usarse para mover datos
directamente de una ubicación de memoria a otra. En vez de ello, puede mover el valor del
operando de origen a un registro, antes de mover su valor a un operando de memoria:
.data
var1 WORD ?
var2 WORD ?
.code
mov ax,var1
mov var2,ax
2.3.3 Operandos de desplazamiento directo
Para crear un operando de desplazamiento directo podemos sumar un desplazamiento al nombre
de una variable. Esto nos permite acceder a ubicaciones de memoria que tal vez no tengan
etiquetas explícitas. Empecemos con un arreglo de bytes llamado arregloB:
Si utilizamos MOV con arregloB como el operando de origen, moveremos de manera automática
el primer byte en el arreglo:
mov al,arregloB ; AL = 10h
Al encerrar una dirección efectiva entre corchetes, indicamos que la expresión se utiliza para
hacer referencia a una dirección de memoria para obtener su contenido. MASM no requiere los
corchetes, por lo que las siguientes instrucciones son equivalentes:
mov al, [arregloB+2]
mov al, arregloB+2
Comprobación de rango MASM no tiene comprobación de rango integrada para las direcciones
efectivas. Si ejecutamos la siguiente instrucción, el resultado es un traicionero error lógico, por
lo que debemos ser muy cuidadosos al comprobar las referencias a arreglos:
De manera similar, el segundo elemento en un arreglo tipo doble palabra se encuentra a 4 bytes
más adelante del primero:
.data
arregloD DWORD 10000h,20000h
.code
mov eax, arregloD ; EAX = 10000h
mov eax, [arregloD+4] ; EAX = 20000h
2.3.6 Suma y resta
La aritmética es un tema bastante extenso en el lenguaje ensamblador, por lo que lo dividiremos
en pasos. Primero nos enfocaremos en la suma y resta de enteros y más adelante estudiaremos
la multiplicación y división de enteros.
Las banderas Desbordamiento, Signo, Cero, Acarreo auxiliar y Paridad cambian de acuerdo al
valor del operando de destino. No afectan a la bandera Acarreo (lo cual es un poco sorprendente).
.data
var1 DWORD 10000h
var2 DWORD 20000h
.code
mov eax,var1 ; EAX = 10000h
add eax,var2 ; EAX = 30000h
Banderas Las banderas Acarreo, Cero, Signo, Desbordamiento, Acarreo auxiliar y Paridad cambian
de acuerdo con el valor del operando de destino.
.data
var1 DWORD 30000h
var2 DWORD 10000h
.code
mov eax, var1 ; EAX = 30000h
sub eax, var2 ; EAX = 20000h
Una manera sencilla de realizar una resta sin tener que crear nuevos circuitos digitales es negar
y después sumar. Por ejemplo, 4- 1 puede interpretarse como 4+ (-1). Para los números
negativos se utiliza la notación de complementos a dos, por lo que 1 se representa mediante
11111111:
Banderas: Las banderas Acarreo, Cero, Signo, Desbordamiento, Acarreo auxiliar y Paridad
cambian de acuerdo con el valor del operando de destino.
NEG reg
NEG mem
(Recuerde que para encontrar el complemento a dos de un número se invierten todos los bits en
el operando de destino y se le suma 1).
Banderas Las banderas Acarreo, Cero, Signo, Desbordamiento, Acarreo auxiliar y Paridad
cambian de acuerdo con el valor del operando de destino.
valR SDWORD ?
valX SDWORD 26
valY SDWORD 30
valZ SDWORD 40
Al traducir una expresión, evalúe cada término por separado y combine los términos al final.
Primero, negamos una copia de valX:
Después, valY se copia a un registro y se resta valZ: segundo término: (valY – valZ)
mov ebx,valY
sub ebx,valZ ; EBX = -10