INSTRUÇÕES DE TRANSFERÊNCIA Transferência de dados MOV destino, fonte move fonte para destino (byte, word ou double word) PUSH fonte coloca fonte na pilha (word ou double word) POP destino retira topo da pilha para destino (word ou double word) XCHG op1, op2 troca (exchange) operandos BSWAP r32 inverte a ordem dos bytes 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 Transferência sobre endereços 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) LEA r16/r32, mem carrega endereço efetivo do operando mem para reg (16 ou 32 bits) LDS r16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e DS (16 bits) LES r16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e ES (16 bits) LFS r16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e FS (16 bits) LGS r16/32, mem carrega endereço de mem para reg (16 ou 32 bits) e GS (16 bits) Prof. Sérgio L. Cechin 1 de 12
Tradução XLAT converte AL (translate byte) AL [BX+AL]. Entrada e Saída IN acumulador, porta leitura de byte, word ou dobleword para AL, AX ou EAX OUT porta, acumulador transfere byte, word ou doubleword de AL, AX ou EAX para a porta 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 destino, fonte soma (destino = destino + fonte) ADC destino, fonte soma com carry (destino = destino + fonte + carry) SUB destino, fonte subtrai fonte do destino (destino = destino fonte) SBB destino, fonte subtrai com borrow (destino = destino fonte borrow) CMP destino, fonte compara destino fonte (sem armazenar o resultado) 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 destino incrementa de 1 DEC destino decrementa de 1 NEG destino 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 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 converte byte para word (AL para AX) CWD converte word para double word (AX para DX:AX) CWDE converte word para double word (AX para EAX) CDQ 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) 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 destino, fonte move fonte para destino com extensão do sinal (números com sinal) MOVZX destino, fonte move fonte para destino com extensão de zeros (inteiros positivos) 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 Deslocamento destino destino, fonte destino, fonte destino, fonte destino, fonte (AND, sem armazenar resultado) SHR destino, contador shift logical right 0 SAR destino, contador shift arithmetic right SHL destino, contador shift left SAL destino, contador shift left 0 ROR destino, contador rotate right 0 RCR destino, contador rotate with carry right ROL destino, contador rotate left RCL destino, contador rotate with carry left 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 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/ ) 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 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 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 interrupção INTO interrupção se overflow IRET retorno de interrupção Prof. Sérgio L. Cechin 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 ( OR ZF) = 0 JNBE endereço not below nor equal idem JAE endereço above or equal = 0 JNB endereço not below idem JB endereço below = 1 JNAE endereço not above nor equal idem JBE endereço below or equal ( OR ZF) = 1 JNA endereço not above idem JC endereço carry = 1 JE/JZ endereço equal / zero ZF = 1 JP/JPE endereço parity / parity even PF = 1 JNC endereço not carry = 0 JNE/JNZ endereço not equal / not zero ZF = 0 JNP/JPO endereço not parity / parity odd PF = 0 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 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 1. Na linguagem simbólica, a instrução aparece como: MOV AX, ES:[BX] Prof. Sérgio L. Cechin 10 de 12
PILHA PILHA Exemplo de Programa SEGMENT STACK DB 32 DUP ( STACK--- ) ENDS CR: EQU 00DH LF: EQU 00AH DADOS SEGMENT MENSAGEM DB Hello World!,CR,LF TAMANHO EQU $-MENSAGEM CONTADOR DB? DADOS ENDS CODIGO SEGMENT ASSUME CS:CODIGO,SS:PILHA,DS:DADOS START: MOV AX, DADOS ; Inicializa segmento de dados MOV DS, AX MOV CONTADOR, 10 ; Loop de operação DE_NOVO: CALL FRASE DEC CONTADOR JNZ DE_NOVO MOV AH, 4CH ; DOS: Termina com código de retorno MOV AL, 0 INT 21H FRASE PROC NEAR MOV AH, 40H ; DOS: Grava em arquivo MOV BX, 0001H ; Saída padrão LEA DX, MENSAGEM MOV CX, TAMANHO INT 21H RET FRASE ENDP CODIGO ENDS 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