Intel 8086 modelo básico (primera parte) Registros: Uso general: AX, BX, CX, DX, SI, DI, BP. Uso con direccionamento especial: SP, IP. Registros de segmento: CS, SS, DS, ES. Modelo de los registros: 20 16 8 AH CS AX 0 AL IP CH -D I T S Z -A -P-C FLAGS DH CX DX CL DL DS Direccionamiento de memoria general: BH byte, word, double word (lds,les): BP EAoffset = Displ + SI BX SI + BX DI ES DI EA = EAoffset + 16 * Segment Por lo menos un elemento de EAoffset es obligatorio. SS BP Segmento por defecto: SS si BP participa, ES si op. String y [DI]. CS jmp y call DS todos los otros casos. SP BL Instrucciones básicas (por frecuencia del uso): Mnemonica Ingles Castellano Flags Movimiento MOV MOV XCHG LEA PUSH POP de datos A, DE As, Des REG, A reg16, M DATA16 DIR16 Move Mover Move Mover Exchange Reemplazar REG <-> MEM Load Efective Address reg16<-EA Push Push Pop Pop Aritmetica ADD ADC SUB SBB CMP NEG INC DEC A, A, A, A, A, A A A Add Añadir add with carry Añadir subtract Resta Subtact with borrow Resta Compare Compara . <- A-DE Negate Negativo Increment Incremento A++ Decrement Decremento A-- Logica AND OR XOR TEST NOT A, DE A, DE A, DE A, DE A DE DE DE DE DE And Or Exclusive Or XOr Test And Not A <- DE As <- DEs DATA16 -> [SS:SP], SP<-SP-2 SP<-SP+2, DIR16<- [SS:SP] A <- A+DE A <- A+DE+C A <- A-DE A <- A-DE-C OSCZAP A <- -A And Or A <- A Test - A <- A DE A <- A DE DE SZP/COA . <- A DE A <- -1 DE OSCZAP OSCZAP OSCZAP OSCZAP SZP/COA SZP/COA SZP/COA Otras instrucciones aritméticas de uso frecuente: MUL IMUL DIV DE DE DE IDIV DE Control JMP DEST Jump CALL RET RET DEST Call Return Jcc DISPL8 Multiply Multiplicar ACC <- ACC1 * SRC Int. Multiply Multiplicar ; con signo Divide Dividir ACC1 <- ACC / SRC ; ACC2 <- ACC % SRC Divide Dividir ; Con signo Ir a DEST Llamar a DEST Volver imm Jump if cc Ir si cc IP <- DEST (near) o CS:IP <-DEST (far) PUSH CS; (far) PUSH IP; JMP DEST POP IP; POP CS (far); SP <- SP+imm; POP CS (far); POP IP IP <- IP+DISPL8(con signo) Sumario de Jcc: Estimación de flags: C Z O S P Cc= { N } + Carry Zero Overf Sign Parity (PE, PO) Aritmética con números sin signo (Bellow/Above) CMP X, Y // Jcc dest: Jcc = Jump if N Not + B Below (X<Y) + A Above (X>Y) E (or) equal Aritmética con números sin signo (Greater/Less) CMP X,Y // Jcc dest: Jcc = Jump if N Not + G Greater X>Y + L Less X<Y E (or) equal Alias dentro de Jcc: Sinónimos JP, JPE JC, JB, JNAE JA, JNBE Antónimos JNP, JPO JNC, JNB, JAE JNA, JBE Sinónimos JZ, JE JG, JNLE JL, JNGE Leyenda: Reg8: Reg16 : Seg : Imm8: Imm16: Mem8: Mem16: Mem32: Acc8: Acc16: 8 bits 16 bits AH, AL, BH, BL, CH, CL, DH, DL; AX, BX, CX, DX, SI, DI, BP, SP; DS, ES, SS, CS 8 bits de data inmediatos 16 bits de data inmediatos direccionamiento general de un BYTE. direccionamiento general de un WORD. direccionamiento general de un DWORD. AL AX Acc Acc1 Acc2 AX DX:AX AL AX AH DX Antónimos JNZ, JNE JNG, JLE JNL, JGE Combinaciones validos de direccionamiento y ejemplos: DEST EA DISPL8 DISPL16 MEM16 MEM32 IP+DISPL8 JMP SHORT L1 // JMP L1 // JA L1 // JNGE MYLOOP IP+DISPL16 JMP NEAR L1 // JMP L2 WORD PTR [EA] JMP [BX] // JMP NEAR CS:[BX+DI] DWORD PTR [EA] JMP DWORD PTR [BX] // JMP DWORD PTR R Ejemplo RET y CALL se compilan del ensamblador según la declaración de PROG. Los PROGs declarados como NEAR se llaman con NEAR y los declarados con FAR como FAR. A DE Ejemplos ASM I8 I16 DB DW EQU 10h EQU 222h R DUP (20) X Reg8 reg8 ADD XOR MOV BH,AL BL,BL BH,AL Reg8 mem AND OR MOV MOV AL, R / CL,BYTE PTR X AL, R CL,BYTE PTR X Reg8 imm8 ADD SUB MOV MOV BL, I8 CL, 231 BL, I8 CL, 231 Reg16 reg16 SUB XOR MOV BX,SI AX,AX BX,SI Reg16 mem TEST XOR MOV MOV SI, X[BX] AX, WORD PTR R+3[SI] SI, X[BX] BX, WORD PTR R+3[SI+BX] Reg16 imm16 CMP TEST SBB MOV MOV MOV BX, I16 BX, I8 CX, OFFSET R BX,I16 BX,I8 CX, OFFSET R DEs As Seg reg16 reg16 seg mem16 seg seg mem16 MOV MOV MOV MOV ES,X // DS,AX CX,ES X, ES // MOV WORD PTR R, DS MOV ES,WORD PTR R[BX+SI] DATA16 Ejemplo Reg16 Seg Mem16 PUSH Imm16 PUSH AX PUSH ES // PUSH CS // POP DS X // PUSH WORD PTR R+2 PUSH 234 // 80286 y superiores. DIR16 reg16 mem16 seg POP POP POP SI WORD PTR R+6 // POP X DS Referencia completa de Jcc Comprobación de flags: Jcc Descripción Condición JC JNC JZ JNZ JS JNS JO JNO JP JPE JNP JPO Jump if carry Jump if no carry /C Jump if zero Jump if not zero /Z Jump if sign Jump if no sign /S Jump if overflow O Jump if no Overflow Jump if parity Jump if parity even Jump if no parity /P Jump if parity odd C Z S /O P P /P Jcc instrucciones para números sin signo (CMP A,B // Jcc DEST): (Below/Above) Jcc Descripción JA JNBE JAE JNB JE JNE JBE JNA JB JNAE Jump if above Jump if not below or equal Jump if above or equal Jump if not below Jump if equal Jump if not equal () Jump if below or equal Jump if not above Jump if below Jump if not above or equal Condición A>B A>B A>=B A>=B Flags /C./Z /C./Z /C /C A==B A != B A<=B A<=B Z /Z C or Z C or Z A<B A<B C C Jcc instrucciones para números con signo (CMP A, B // Jcc DEST): (Greater / Less) Jcc Descripción JG JNLE JGE JNL JE JNE JLE JNG JL JNGE Jump Jump Jump Jump Jump Jump Jump Jump Jump Jump if greater A>B if not less than or equal if greater than or equal A>=B if not less than if equal if not equal A !=B if less than or equal A<=B if not greater than A<=B if less than A<B if not greater or equal Condición Flags /S or Z A>B /S or Z /S A>=B A==B /S Z /Z S O or Z S O or Z S.O A<B S.O