Instrucciones Arquitectura x86 M. en C. Erika Vilches MOV • Mover datos (move data) • Sintaxis MOV dest, orig • Operación dest ← orig • Restricciones: • Los operandos deben ser del mismo tamaño (BYTE, WORD o DWORD) • dest debe ser un registro o una localidad de memoria • orig puede ser un registro, una localidad de memoria o un valor inmediato • dest y orig NO pueden ser localidades de memoria al mismo tiempo XCHG • Intercambiar datos (Exchange data) • Sintaxis XCHG op1, op2 • Operación temp ← op1 op1 ← op2 op2 ←temp • Restricciones: • Los operandos deben ser del mismo tamaño (BYTE, WORD o DWORD) • Al menos uno de los operandos tiene que ser un registro • El otro operando puede ser una localidad de memoria u otro registro • • • • • • • • • • Instrucciones Aritméticas CLC STC CMC ADD ADC INC SUB SBB DEC NEG • • • • • • • • • • • CMP MUL IMUL DIV IDIV CBW CWD CDQ CWDE MOVSX MOVZX CLC • Limpiar bandera de carry (Clear carry) • Sintaxis CLC • Operación CF ← 0 STC • Prender bandera de carry (Set carry flag) • Sintaxis STC • Operación CF ← 1 CMC • Complementar la bandera de carry (Complement carry flag) • Sintaxis CMC • Operación CF ← ~CF ADD • Sumar enteros (Add integers) • Sintaxis ADD dest, orig • Operación dest ← dest + orig • Restricciones (Las mismas de MOV): • Los operandos deben ser del mismo tamaño (BYTE, WORD o DWORD) • dest debe ser un registro o una localidad de memoria • orig puede ser un registro, una localidad de memoria o un valor inmediato • dest y orig NO pueden ser localidades de memoria al mismo tiempo • Banderas modificadas: OF SF ZF AF PF CF Ejemplo de ADD AX: 0075 CX: 01A2 ADD AX, CX Resultado: AX: 0217 CX: 01A2 SF = ZF = CF = OF = AF= 0 PF=1 Ejemplo de ADD AX: 77AC CX: 4B35 ADD AX, CX Resultado: AX: C2E1 CX: 4B35 AF = PF = SF = OF = 1 ZF = CF = 0 ADC • Suma con carry (Add with carry) • Sintaxis ADC dest, orig • Operación dest ← dest + orig + CF • Restricciones (Las mismas de MOV): • Los operandos deben ser del mismo tamaño (BYTE, WORD o DWORD) • dest debe ser un registro o una localidad de memoria • orig puede ser un registro, una localidad de memoria o un valor inmediato • dest y orig NO pueden ser localidades de memoria al mismo tiempo • Banderas modificadas: OF SF ZF AF PF CF INC • Incrementar entero (Increment integer) • Sintaxis INC dest • Operación dest ← dest + 1 • Restricciones: • dest debe ser un registro o localidad de memoria de tamaño BYTE, WORD o DWORD • Banderas modificadas: OF SF ZF AF PF Ejemplo de INC ECX: 00 00 01 A2 INC ECX Resultado: ECX = 00 00 01 A3 AF = SF = ZF = OF = 0 PF = 1 Ejemplo de INC EDX: 7F FF FF FF INC EDX Resultado: EDX: 80 00 00 00 SF = OF = AF = PF = 1 ZF = 0 SUB • Restar enteros (Substract Integers) • Sintaxis SUB dest, orig • Operación dest ← dest - orig • Restricciones (Las mismas de MOV): • Los operandos deben ser del mismo tamaño (BYTE, WORD o DWORD) • dest debe ser un registro o una localidad de memoria • orig puede ser un registro, una localidad de memoria o un valor inmediato • dest y orig NO pueden ser localidades de memoria al mismo tiempo • Banderas modificadas: OF SF ZF AF PF CF Ejemplo de SUB EAX: 00 00 00 75 ECX: 00 00 01 A2 SUB EAX, ECX Resultado: EAX: FF FF FE D3 ECX: 00 00 01 A2 AF = CF = SF = 1 ZF = PF = OF = 0 Ejemplo de SUB DX: FF 20 Valor: FF 20 SUB DX, Valor Resultado: DX: 00 00 Valor: FF 20 ZF = PF = 1 AF = CF = SF = OF = 0 SBB • Restar con préstamo (Substract with borrow) • Sintaxis SBB dest, orig • Operación dest ← dest - orig - CF • Restricciones (Las mismas de MOV): • Los operandos deben ser del mismo tamaño (BYTE, WORD o DWORD) • dest debe ser un registro o una localidad de memoria • orig puede ser un registro, una localidad de memoria o un valor inmediato • dest y orig NO pueden ser localidades de memoria al mismo tiempo • Banderas modificadas: OF SF ZF AF PF CF DEC • Decrementar entero (Decrement integer) • Sintaxis DEC dest • Operación dest ← dest - 1 • Restricciones (Las mismas de INC): • dest debe ser un registro o localidad de memoria de tamaño BYTE, WORD o DWORD • Banderas modificadas: OF SF ZF AF PF Ejemplo de DEC BX: 00 01 DEC BX Resultado: BX: 00 00 AF = PF = ZF = 1 SF = OF = 0 Ejemplo de DEC AL: F5 DEC AL Resultado: AL: F4 SF = AF = 1 OF = ZF = PF = 0 NEG • Negar (Negate) - Complemento a 2 • Sintaxis NEG dest • Operación dest ← - dest • Nota: Prende la bandera CF, a menos que el dest sea cero, en cuyo caso se apaga CF • Restricciones (Las mismas de INC): • dest debe ser un registro o localidad de memoria de tamaño BYTE, WORD o DWORD • Prende CF a menos que dest sea cero, en cuyo caso CF se apaga • Banderas modificadas: OF SF ZF AF PF CF Ejemplo de NEG BX: 01 A2 NEG BX Resultado: BX: FE 5E SF = CF = 1 AF = OF = PF = ZF = 0 Ejemplo de NEG DH: F5 NEG DH Resultado: DH: 0B CF = 1 PF = AF = OF = SF = ZF = 0 Ejemplo de NEG EAX: 00 00 00 00 NEG EAX Resultado: EAX: 00 00 00 00 AF = PF = ZF = 1 CF = SF = OF = 0 MUL • • Multiplicación Sintaxis MUL orig • Operación if (size(orig)== 8) { AX ← AL × orig } else if (size(orig)==16) { DX:AX ← AX × orig } else if (size(orig)==32) { EDX:EAX ← EAX × orig } • Restricciones: • Utilizado para multiplicaciones UNSIGNED. • orig debe ser un registro o localidad de memoria de tamaño BYTE, WORD o DWORD. IMUL • • Multiplicación Sintaxis IMUL orig • Operación if (size(orig)== 8) { AX ← AL × orig } else if (size(orig)==16) { DX:AX ← AX × orig } else if (size(orig)==32) { EDX:EAX ← EAX × orig } • Restricciones: • Utilizado para multiplicaciones SIGNED. • orig debe ser un registro o localidad de memoria de tamaño BYTE, WORD o DWORD. IMUL • Multiplicación • Sintaxis IMUL dest, orig • Operación dest ← dest × orig • Restricciones: • Los operandos deben ser del mismo tamaño (WORD o DWORD). • dest debe ser un registro. • orig puede ser un registro, localidad de memoria o valor inmediato. IMUL • Multiplicación • Sintaxis IMUL dest, orig, const • Operación dest ← orig × const • Restricciones: • Los operandos deben ser del mismo tamaño (WORD o DWORD). • dest debe ser un registro. • orig puede ser un registro o localidad de memoria. • const debe ser un valor inmediato.