INSTRUÇÕES DE TRANSFERÊNCIA Transferência de dados MOV destino, fonte PUSH fonte POP destino move fonte para destino (byte, word ou double word) coloca fonte na pilha (word ou double word) retira topo da pilha para destino (word ou double word) troca (exchange) operandos inverte a ordem dos bytes XCHG op1, op2 BSWAP r32 Detalhes: 1. Acesso a registros de segmento: MOV, PUSH e POP; 2. Endereçamento imediato para CS e IP: não permitido; 3. Operandos de PUSH e POP: 16 ou 32 bits 4. PUSH: decrementa SP (2 ou 4) e escreve; POP: lê e incrementa SP (2 ou 4) Transferência de flags PUSHF/PUSHFD POPF/POPFD LAHF SAHF coloca registrador de flags na pilha (16 bits para F ou 32 bits para EF) retira registrador de flags da pilha (16 bits para F e 32 bits para EF) carrega AH com flags (8 bits menos significativos do registrador F) carrega flags com AH (8 bits menos significativos do registrador F) Transferência sobre endereços LEA r16/r32, mem LDS r16/32, mem LES r16/32, mem LFS r16/32, mem LGS r16/32, mem Prof. Sérgio L. Cechin carrega endereço efetivo do operando mem para reg (16 ou 32 bits) carrega endereço de mem para reg (16 ou 32 bits) e DS (16 bits) carrega endereço de mem para reg (16 ou 32 bits) e ES (16 bits) carrega endereço de mem para reg (16 ou 32 bits) e FS (16 bits) carrega endereço de mem para reg (16 ou 32 bits) e GS (16 bits) 1 de 12 Tradução XLAT converte AL (translate byte) Detalhes: AL ← [BX+AL]. Entrada e Saída IN acumulador, porta OUT porta, acumulador leitura de byte, word ou dobleword para AL, AX ou EAX transfere byte, word ou doubleword de AL, AX ou EAX para a porta Detalhes: 1. Espaço de endereçamento separado da memória 2. Capacidade para 65536 endereços (portas) 3. Formatos possíveis: IN AL, im8 OUT im8, AL IN AL, DX OUT DX, AL IN AX, im8 OUT im8, AX IN AX, DX OUT DX, AX IN EAX, im8 OUT im8, EAX IN EAX, DX OUT DX, EAX INSTRUÇÕES ARITMÉTICAS Com dois operandos ADD ADC destino, fonte destino, fonte SUB destino, fonte SBB destino, fonte CMP destino, fonte soma (destino = destino + fonte) soma com carry (destino = destino + fonte + carry) subtrai fonte do destino (destino = destino – fonte) subtrai com borrow (destino = destino – fonte – borrow) compara destino – fonte (sem armazenar o resultado) Detalhes: 1. Registradores de segmento não podem ser operados 2. Os dois operandos devem ter a mesma largura 3. O registrador envolvido determina a largura (8, 16 ou 32) 4. No caso de mem ou imed., declarar explicitamente a largura Prof. Sérgio L. Cechin 2 de 12 Com um operando INC DEC NEG destino destino destino incrementa de 1 decrementa de 1 troca sinal (complemento de dois) Multiplicação e Divisão MUL fonte multiplica como inteiro sem sinal IMUL fonte multiplica como inteiro com sinal DIV fonte divide como inteiro sem sinal IDIV fonte divide como inteiro com sinal Detalhes: 1. Um dos operandos está implícito; 2. Multiplicação... ... de 8 bits AX ← AL x fonte ... de 16 bits DX:AX ← AX x fonte ... de 32 bits EDX:EAX ← EAX x fonte 3. Divisão... ... de 8 bits AL (AH = resto) ← AL / fonte ... de 16 bits AX (DX = resto) ← DX:AX / fonte ... de 32 bits EAX (EDX = resto) ← EDX:EAX / fonte 4. Outros formatos para IMUL (para >= 486) IMUL reg, imed reg = reg x imed IMUL reg1, reg2, imed reg1 = reg2 x imed IMUL reg, mem, imed reg = mem x imed IMUL reg1, reg2 reg1 = reg1 x reg 2 IMUL reg, mem reg = reg x mem Prof. Sérgio L. Cechin 3 de 12 Conversão e Ajuste CBW CWD CWDE CDQ converte byte para word (AL para AX) converte word para double word (AX para DX:AX) converte word para double word (AX para EAX) converte double word para quad word (EAX para EDX:EAX) DAA decimal adjust after addition (sobre AL) DAS decimal adjust after subtraction (sobre AL) AAA ASCII adjust after addition (sobre AL) AAS ASCII adjust after subtraction (sobre AL) AAM ASCII adjust after multiplication (sobre AX) AAD ASCII adjust before division (sobre AX) Detalhes: 1. Usadas em conjunto com as instruções ADD, SUB, MUL e DIV 2. Para ADD, SUB e MUL, aplicar o ajuste após a operação 3. Para DIV, aplicar o ajuste antes da operação 4. AAx, ajustam um BCD por byte; 5. DAx, ajustam dois BCD por byte. Conversão e Ajuste MOVSX MOVZX destino, fonte move fonte para destino com extensão do sinal (números com sinal) destino, fonte move fonte para destino com extensão de zeros (inteiros positivos) Detalhes: 1. Após o 80386 2. Formatos possíveis MOVSX r16, rm8 MOVSX r32, rm8 MOVSX r32, rm16 MOVZX r16, rm8 MOVZX r32, rm8 MOVZX r32, rm16 Prof. Sérgio L. Cechin 4 de 12 MANIPULAÇÃO DE BITS Instruções lógicas NOT AND OR XOR TEST destino destino, fonte destino, fonte destino, fonte destino, fonte (AND, sem armazenar resultado) Deslocamento SHR destino, contador shift logical right 0 SAR CF destino, contador shift arithmetic right CF SHL destino, contador shift left CF SAL 0 destino, contador shift left CF ROR 0 destino, contador rotate right CF RCR destino, contador rotate with carry right CF ROL destino, contador rotate left CF RCL destino, contador rotate with carry left CF Detalhes: 1. Codificações possíveis operação reg,1 operação reg, CL operação reg, im8 operação mem,1 operação mem, CL operação mem, im8 2. Número de deslocamentos: 0 até 31 (a partir do 286) Prof. Sérgio L. Cechin 5 de 12 Operações sobre bits BSF operand1, operand2 Bit Scan Forward BSR operand1, operand2 Bit Scan Reverse BT operand, bit_index Bit Test BTC operand, bit_index Bit Test and Complement BTR operand, bit_index Bit Test and Reset BTS operand, bit_index Bit Test and Set Detalhes: 1. A partir do 386 2. BSF e BSR procuram pelo primeiro bit em 1 BSF, a partir do LSB BSR, a partir do MSB 3. BT, BTC, BTR e BTS testam o bit indicado (copia p/ CF) BT, só testa BTC, testa e inverte BTR, testa e coloca 0 BTS, testa e coloca 1 INSTRUÇÕES DE DESVIO 1. desvios dentro do segmento de código corrente (não altera CS) near jump → instrução dentro do segmento; short jump → instrução localizada entre –128 e +127 da posição atual 2. desvios para fora do segmento de código corrente (altera o CS) far jump → desvio para instrução em outro segmento de código Incondicional JMP destino Detalhes: 1. Formas possíveis: Direto: short IP ← IP + offset (1 byte) near IP ← IP + offset (2 ou 4 byte) far CS:IP ← offset (4 bytes) Indireto near IP (ou EIP) ← conteúdo de registrador ou de memória far CS:IP (ou CS:EIP) ← conteúdo de registrador ou de memória Prof. Sérgio L. Cechin 6 de 12 Controle de Laço LOOP endereço loop LOOPE endereço loop while equal / zero (enquanto ZF=1) LOOPZ endereço loop while equal / zero (enquanto ZF=1) LOOPNE endereço loop while not equal / not zero (ZF=0) LOOPNZ endereço loop while not equal / not zero (ZF=0) JCXZ endereço jump if CX = 0 JECXZ endereço jump if ECX = 0 Detalhes: 1. LOOP e LOOPcc, utilizam o registro CX (ECX) como contador de laço 2. LOOPcc, além do contador, utilizam o ZF para decidir se desviam 3. Os desvios são short (8 bits) Subrotinas CALL endereço RET valor_opcional Interrupções de Software INT tipo INTO IRET Prof. Sérgio L. Cechin interrupção interrupção se overflow retorno de interrupção 7 de 12 Desvio condicional JG endereço greater ((SF XOR OF) OR ZF) = 0 JNLE endereço not less nor equal idem JGE endereço greater or equal (SF XOR OF) = 0 JNL endereço not less idem JL endereço less (SF XOR OF) = 1 JNGE endereço not greater nor equal idem JLE endereço less or equal ((SF XOR OF) OR ZF) = 1 JNG endereço not greater idem JO endereço overflow OF = 1 JS endereço sign SF = 1 JNO endereço not overflow OF = 0 JNS endereço not sign SF = 0 JA endereço above (CF OR ZF) = 0 JNBE endereço not below nor equal idem JAE endereço above or equal CF = 0 JNB endereço not below idem JB endereço below CF = 1 JNAE endereço not above nor equal idem JBE endereço below or equal (CF OR ZF) = 1 JNA endereço not above idem JC endereço carry CF = 1 JE/JZ endereço equal / zero ZF = 1 JP/JPE endereço parity / parity even PF = 1 JNC endereço not carry CF = 0 JNE/JNZ endereço not equal / not zero ZF = 0 JNP/JPO endereço not parity / parity odd PF = 0 Detalhes: 1. Todos os desvios condicionais são relativos 2. Podem ser short (8bits) ou near (16 bits ou 32 bits) 3. Desvios near, somente a partir do 386 Prof. Sérgio L. Cechin 8 de 12 MANIPULAÇÃO DE STRINGS Utilização implícita dos seguintes registros: [E]SI índice para string fonte [E]DI índice para string destino ES segmento do string destino [E]CX contador AL/AX/EAX valor de busca (destino p/ LODS, fonte p/ STOS) DF 0 (auto incremento p/ DI, SI), 1 (auto decremento p/ DI, SI) ZF condição de término para busca e comparação Instruções: (s, nas instruções, pode ser substituído por B, W ou D) MOVSs move source string to destination string Move um elemento: DS:SI → ES:DI CMPSs compare source string with destination string Compara dois elementos: DS:SI - ES:DI SCASs scan destination string Procura pelo elemento AL (AX ou EAX): AL - ES:DI LODSs load into AL/AX from source string Carrega elemento para AL (AX ou EAX): DS:SI → AL STOSs store AL/AX into destination string Armazena elemento de AL (AX ou EAX): ES:DI ← AL Detalhes: 1. Controle de auto incremento (decremento): flag DF=0 (1) 2. Controle de repetição REP repeat REPE / REPZ repeat while equal / zero REPNE / REPNZ repeat while not equal / not zero Colocadas como prefixo Utiliza ECX para o número de repetições Prof. Sérgio L. Cechin 9 de 12 CONTROLE DO PROCESSADOR Instruções sobre flags STC CLC CMC STD CLD STI CLI set carry flag clear carry flag complement carry flag set direction flag clear direction flag set interrupt-enable flag clear interrupt-enable flag Instruções condicionais sobre flags SETcc rm8 set byte on condition (>=386) CMOVcc destino, fonte conditional move (>= Pentium Pro) Detalhes 1. cc → todas as condições dos desvios condicionais 2. destino → registro (16 ou 32 bits); fonte → registro ou memória Instruções de prefixo SEG segreg override default segment register Detalhes: 1. Na linguagem simbólica, a instrução aparece como: MOV AX, ES:[BX] Prof. Sérgio L. Cechin 10 de 12 Exemplo de Programa PILHA PILHA SEGMENT STACK DB 32 DUP (‘STACK---’) ENDS CR: LF: EQU EQU 00DH 00AH DADOS MENSAGEM TAMANHO CONTADOR DADOS SEGMENT DB EQU DB ENDS ‘Hello World !’,CR,LF $-MENSAGEM ? CODIGO SEGMENT ASSUME CS:CODIGO,SS:PILHA,DS:DADOS MOV MOV AX, DADOS DS, AX ; Inicializa segmento de dados MOV CALL DEC JNZ CONTADOR, 10 FRASE CONTADOR DE_NOVO ; Loop de operação MOV MOV INT AH, 4CH AL, 0 21H ; DOS: Termina com código de retorno NEAR AH, 40H BX, 0001H DX, MENSAGEM CX, TAMANHO 21H FRASE PROC MOV MOV LEA MOV INT RET ENDP CODIGO ENDS START: DE_NOVO: FRASE ; DOS: Grava em arquivo ; Saída padrão END START Prof. Sérgio L. Cechin 11 de 12 Short Reference MOV destino, fonte PUSH fonte POP destino LEA r16/r32, mem Lrs r16/r32, mem rs=DS, ES, FS, GS XLAT AL ← [BX+AL] ADD destino, fonte ADC destino, fonte SUB destino, fonte SBB destino, fonte CMP destino, fonte INC destino DEC destino NEG destino MUL fonte AX ← AL x fonte; DX:AX ← AX x fonte; EDX:EAX ← EAX x fonte IMUL fonte DIV fonte IDIV fonte DAA (decimal-soma) AL DAS (decimal-subtração) AL AAA (ASCII-soma) AL AAS (ASCII-subtração) AL AAM (ASCII-multiplicação) AX AAD (ASCII-divisão) AX Prof. Sérgio L. Cechin 12 de 12