Assembly Language for Intel-Based Computers, 5 th Edition Capítulo 6: Processamento Condicional (c)...
Transcript of Assembly Language for Intel-Based Computers, 5 th Edition Capítulo 6: Processamento Condicional (c)...
Assembly Language for Intel-Based Assembly Language for Intel-Based Computers, 5Computers, 5thth Edition Edition
Capítulo 6: Processamento Condicional
(c) Pearson Education, 2006-2007. All rights reserved. You may modify and copy this slide show for your personal use, or for use in the classroom, as long as this copyright statement, the author's name, and the title are not changed.
Slides prepared by the author
Revision date: June 4, 2006
Kip R. Irvine
Web site Examples 2
índiceíndice
• Instruções Booleanas e de Comparação• Jumps condicionais• Instruções de loop condicionais• Estruturas condicionais• Aplicação: máquinas de estado finito• Diretivas de decisão
Web site Examples 3
Instruções booleanas e de comparaçãoInstruções booleanas e de comparação
• Flags de status da CPU • Instrução AND • Instrução OR • Instrução XOR • Instrução NOT • Aplicações• Instrução TEST • Instrução CMP
Web site Examples 4
Flags de Status - RevisãoFlags de Status - Revisão
• O flag Zero é acionado quando o resultado de uma operação igual a zero.
• O flag de Carry é acionado quando uma instrução gera um resultado que é
muito grande (ou muito pequeno) para o operando destino.
• O flag de sinal é acionado quando o operando destino é negativo, e zerado
quando o operando destino é positivo.
• O flag de Overflow é acionado quando uma instrução gera um resultado de
sinal inválido ( carry do MSB XOR carry para o MSB).
• O flag de paridade é acionado quando uma instrução gera um número par
de bits 1 no byte mais à direita do operando destino;
• O flag Auxiliary Carry é acionado quando uma operação produz um vai-um
do bit 3 para o bit 4
Web site Examples 5
Instrução AND Instrução AND
• Realiza uma operação booleana AND entre os bits correspondentes em dois operandos
• Sintaxe:AND destino, fonte
(tipos de operando iguais a MOV)AND
Web site Examples 6
Instrução OR Instrução OR
• Realiza uma operação booleana OR entre os bits correspondentes de dois operandos
• Sintaxe:OR destino, fonte
OR
Web site Examples 7
Instrução XOR Instrução XOR
• Realiza uma operação booleana OU-exclusivo entre os bits correspondentes de dois operandos
• Sintaxe:XOR destino, fonte XOR
0 0 1 1 1 0 1 10 0 0 0 1 1 1 1
0 0 1 1 0 1 0 0
XOR
invertedunchanged
XOR é uma forma útil de inverter (toggle) os bits de um operando.
Web site Examples 8
Instrução NOT Instrução NOT
• Realiza uma operação booleana NOT no operando destino
• Sintaxe:NOT destino NOT
0 0 1 1 1 0 1 1
1 1 0 0 0 1 0 0
NOT
inverted
Web site Examples 9
Aplicações Aplicações (1 de 5) (1 de 5)
mov al,'a' ; AL = 01100001band al,11011111b ; AL = 01000001b
• Tarefa: Converter o caractere em AL em maiúsculo.
• Solução: Usar a instrução AND para zerar o bit 5.
Web site Examples 10
AplicaçõesAplicações (2 de 5) (2 de 5)
mov al,6 ; AL = 00000110bor al,00110000b ; AL = 00110110b
• Tarefa: Converter o valor binário de um byte no seu dígito decimal ASCII equivalente.
• Solução: Usar a instrução OR para acionar os bits 4 e 5.
Dígito ASCII '6' = 00110110b
Web site Examples 11
Aplicações Aplicações (3 de 5) (3 de 5)
mov ax,40h ; BIOS segmentmov ds,axmov bx,17h ; keyboard flag byteor BYTE PTR [bx],01000000b ; CapsLock on
• Tarefa: acionar a tecla CapsLock do teclado
• Solução: Usar a instrução OR para acionar o bit 6 no byte de flag do teclado em 0040:0017h na área de dados do BIOS.
Este código roda somente no modo de endereçamento real, e não roda sob Windows NT, 2000, ou XP.
Web site Examples 12
Aplicações Aplicações (4 de 5) (4 de 5)
mov ax,wordValand ax,1 ; low bit set?jz EvenValue ; jump if Zero flag set
• Tarefa: saltar a um label se um inteiro é par.
• Solução: fazer AND do bit menos significativo com 1. Se o resultado é zero, o número é par.
JZ (jump se Zero)
Escrever um código que salta a um label se um inteiro é negativo.
Web site Examples 13
Aplicações Aplicações (5 de 5) (5 de 5)
or al,aljnz IsNotZero ; jump if not zero
• Tarefa: salta para um label se o valor em AL não é zero.
• Solução: fazer o OR do byte consigo mesmo, e usar a instrução JNZ (jump se not zero) .
Fazer o OR consigo mesmo não altera o valor.
Web site Examples 14
Instrução TEST Instrução TEST
• Realiza uma operação AND não-destrutiva entre os bits correspondentes de dois operandos
• Nenhum operando é modificado, mas o flag de Zero é afetado.• Exemplo: salta a um label se bit 0 ou bit 1 em AL é um.
test al,00000011bjnz ValueFound
• Exemplo: salta a um label se nem bit 0 nem bit 1 em AL é um.
test al,00000011bjz ValueNotFound
Web site Examples 15
Instrução CMP Instrução CMP (1 de 3) (1 de 3)
• Compara o operando destino com o operando fonte• Subtração não-destrutiva , destino menos fonte (destino não é
alterado)
• Sintaxe: CMP destino, fonte• Exemplo: destino == fonte
mov al,5cmp al,5 ; Zero flag set
• Exemplo: destino < fonte
mov al,4cmp al,5 ; Carry flag set
Web site Examples 16
Instrução CMP Instrução CMP (2 de 3) (2 de 3)
• Exemplo: destino > fonte
mov al,6cmp al,5 ; ZF = 0, CF = 0
(ambos os flags Zero e Carry são zerados)
Web site Examples 17
Instrução CMP Instrução CMP (3 de 3) (3 de 3)
• Exemplo: destino > fonte
mov al,5cmp al,-2 ; Sign flag == Overflow flag
As comparações mostradas aqui são realizadas em inteiros com sinal.
• Exemplo: destino < fonte
mov al,-1cmp al,5 ; Sign flag != Overflow flag
Web site Examples 18
Próxima seçãoPróxima seção
• Instruções Booleanas e de Comparação• Jumps condicionais• Instruções de loop condicionais• Estruturas condicionais• Aplicação: máquinas de estado finito• Diretivas de decisão
Web site Examples 19
Jumps condicionaisJumps condicionais
• Jumps são baseados em . . .• Flags específicos
• Igualdade
• Comparações sem sinal
• Comparações com sinal
• Aplicações• Encrypting de uma cadeia• Instrução de teste de bit (BT)
Web site Examples 20
Instrução JInstrução Jcondcond
• Uma instrução de jump condicional desvia a um label quando um valor específico de registrador ou condições de flag são encontrados
• Exemplos:• JB, JC jump se o Carry flag é acionado
• JE, JZ jump se o Zero flag é acionado
• JS jump se o Sign flag é acionado
• JNE, JNZ jump se o Zero flag é zerado
• JECXZ jump se ECX igual a 0
Web site Examples 21
Intervalo de JIntervalo de Jcondcond
• Antes de 386:• jump deve ser entre –128 a +127 bytes do valor
contido no ponteiro de instrução
• Processadores IA-32:• Offset de 32-bit offset permite jump em qualquer
localização na memória
Web site Examples 22
Jumps baseados em flags específicosJumps baseados em flags específicos
Web site Examples 23
Jumps baseados na igualdadeJumps baseados na igualdade
Web site Examples 24
Jumps baseados em comparações sem sinalJumps baseados em comparações sem sinal
Web site Examples 25
Jumps baseados em comparações com sinalJumps baseados em comparações com sinal
Web site Examples 26
AplicaçõesAplicações (1 de 5) (1 de 5)
cmp eax,ebxja Larger
• Tarefa: saltar ao label se o EAX sem sinal é maior que EBX
• Solução: Usar CMP, seguida de JA
cmp eax,ebxjg Greater
• Tarefa: saltar a um label se o EAX com sinal é maior que EBX
• Solução: Usar CMP seguida de JG
Web site Examples 27
AplicaçõesAplicações (2 de 5) (2 de 5)
cmp eax,Val1jbe L1 ; below or equal
• Saltar para o label L1 se EAX sem sinal é menor ou igual a Val1
cmp eax,Val1jle L1
• Saltar para o label L1 se EAX com sinal é menor ou igual a Val1
Web site Examples 28
AplicaçõesAplicações (3 de 5) (3 de 5)
mov Large,bxcmp ax,bxjna Nextmov Large,ax
Next:
• Comparar AX com BX sem sinal e copiar o maior entre eles na variável denotada Large
mov Small,axcmp bx,axjnl Nextmov Small,bx
Next:
• Compare AX com BX com sinal e copiar o menor dentre eles numa variável denotada Small
Web site Examples 29
AplicaçõesAplicações (4 de 5) (4 de 5)
cmp WORD PTR [esi],0je L1
• Saltar para o label L1 se a palavra de memória apontada por ESI é igual a Zero
test DWORD PTR [edi],1jz L2
• Saltar para o label L2 se o doubleword de memória apontado por EDI é par
Web site Examples 30
AplicaçõesAplicações (5 de 5) (5 de 5)
and al,00001011b ; clear unwanted bitscmp al,00001011b ; check remaining bitsje L1 ; all set? jump to L1
Tarefa: saltar para o label L1 se os bits 0, 1 e 3 em AL estão todos acionados.
• Solução: Zerar todos os bits, exceto 0, 1 e 3. Então, comparar o resultado com 00001011 b.
Web site Examples 31
Sua vez . . .Sua vez . . .
• Escrever um código que salta ao label L1 se ou bit 4, 5 ou 6 é acionado no registrador BL.
• Escrever um código que salta ao label L1 se bits 4, 5 e 6 estão todos acionados no registrador BL.
• Escrever um código que salta ao label L2 se AL tem paridade par.
• Escrever um código que salta ao label L3 se EAX é negativo.
• Escrever um código que salta ao label L4 se a expressão (EBX – ECX) é maior que zero.
Web site Examples 32
CriptografiaCriptografia de uma cadeia de uma cadeia
KEY = 239 ; can be any byte valueBUFMAX = 128.databuffer BYTE BUFMAX+1 DUP(0)bufSize DWORD BUFMAX
.codemov ecx,bufSize ; loop countermov esi,0 ; index 0 in buffer
L1:xor buffer[esi],KEY ; translate a byteinc esi ; point to next byteloop L1
O seguinte loop usa a instrução XOR para transformar cada caractere da cadeia num novo valor.
Web site Examples 33
Programa de criptografia de uma cadeiaPrograma de criptografia de uma cadeia
• Tarefas:• Entrar com uma mensagem (cadeia) pelo teclado
• criptografia da mensagem
• Mostrar a mensagem criptografada
• Decriptografia da mensagem
• Mostrar a mensagem decriptografada
Enter the plain text: Attack at dawn.
Cipher text: «¢¢Äîä-Ä¢-ïÄÿü-Gs
Decrypted: Attack at dawn.
Web site Examples 34
Instrução BT (Bit Test)Instrução BT (Bit Test)
• Copia bit n de um operando no flag Carry
• Sintaxe: BT bitBase, n
• bitBase pode ser r/m16 ou r/m32
• n pode ser r16, r32 ou imm8
• Exemplo: saltar ao label L1 se bit 9 é acionado no registrador AX:
bt AX,9 ; CF = bit 9jc L1 ; jump if Carry
Web site Examples 3535
Próxima seçãoPróxima seção
• Instruções Booleanas e de Comparação• Jumps condicionais• Instruções de loop condicionais• Estruturas condicionais• Aplicação: máquinas de estado finito• Diretivas de decisão
Web site Examples 36
Instruções de loop CondicionalInstruções de loop Condicional
• LOOPZ e LOOPE• LOOPNZ e LOOPNE
Web site Examples 37
LOOPZ e LOOPELOOPZ e LOOPE
• Sintaxe: LOOPE destinoLOOPZ destino
• Lógica: • ECX ECX – 1• se ECX > 0 e ZF=1, salta para o destino
• Útil quando rastreia um vetor para encontrar o primeiro elemento que não coincide com um dado valor.
Web site Examples 38
LOOPNZ e LOOPNELOOPNZ e LOOPNE
• LOOPNZ (LOOPNE) é uma instrução de loop condicional • Sintaxe:
LOOPNZ destinoLOOPNE destino
• Lógica: • ECX ECX – 1; • se ECX > 0 e ZF=0, salta para o destino
• Útil quando se rastreia um vetor em busca do primeiro elemento que coincide com um dado valor.
Web site Examples 39
LOOPNZ ExemploLOOPNZ Exemplo
.dataarray SWORD -3,-6,-1,-10,10,30,40,4sentinel SWORD 0.code
mov esi,OFFSET arraymov ecx,LENGTHOF array
next:test WORD PTR [esi],8000h ; test sign bitpushfd ; push flags on stackadd esi,TYPE arraypopfd ; pop flags from stackloopnz next ; continue loopjnz quit ; none foundsub esi,TYPE array ; ESI points to value
quit:
O seguinte código encontra o primeiro valor positivo num vetor:
Web site Examples 40
Sua vez . Sua vez . . .. .
.dataarray SWORD 50 DUP(?)sentinel SWORD 0FFFFh.code
mov esi,OFFSET arraymov ecx,LENGTHOF array
L1: cmp WORD PTR [esi],0 ; check for zero
(fill in your code here)
quit:
Localizar o primeiro valor diferente de zero no vetor. Se nenhum valor for encontrado, fazer com que ESI aponte para o valor de sentinel:
Web site Examples 41
. . . (solução). . . (solução)
.dataarray SWORD 50 DUP(?)sentinel SWORD 0FFFFh.code
mov esi,OFFSET arraymov ecx,LENGTHOF array
L1: cmp WORD PTR [esi],0 ; check for zeropushfd ; push flags on stackadd esi,TYPE arraypopfd ; pop flags from stackloope L1 ; continue loopjz quit ; none foundsub esi,TYPE array ; ESI points to value
quit:
Web site Examples 4242
Próxima seçãoPróxima seção
• Instruções Booleanas e de Comparação• Jumps condicionais• Instruções de loop condicionais• Estruturas condicionais• Aplicação: máquinas de estado finito• Diretivas de decisão
Web site Examples 43
Estruturas ConditionaisEstruturas Conditionais
• Comando IF estruturado em blocos
• Expressões compostas com AND
• Expressões compostas com OR
• Loops WHILE
• Seleção baseada em tabela
Web site Examples 44
Comando IF estruturado em blocosComando IF estruturado em blocos
Programadores de linguagem Assembly podem facilmente traduzir
comandos lógicos em C++/Java para linguagem Assembly. Por
exemplo:
mov eax,op1cmp eax,op2jne L1mov X,1jmp L2
L1: mov X,2L2:
if( op1 == op2 ) X = 1;else X = 2;
Web site Examples 45
Sua vez . . .Sua vez . . .
Implementar o código em linguagem Assembly. Todos
os valores são sem sinal:
cmp ebx,ecxja nextmov eax,5mov edx,6
next:
if( ebx <= ecx ){ eax = 5; edx = 6;}
(existem várias soluções corretas para esse problema)
Web site Examples 46
Sua vez . . .Sua vez . . .
Implementar o seguinte código em linguagem assembly.
Todos os valores são inteiros com sinal de 32-bits:
mov eax,var1cmp eax,var2jle L1mov var3,6mov var4,7jmp L2
L1: mov var3,10L2:
if( var1 <= var2 ) var3 = 10;else{ var3 = 6; var4 = 7;}
(existem várias soluções corretas para esse problema.)
Web site Examples 47
Expressão composta com ANDExpressão composta com AND (1 de 3) (1 de 3)
• Quando se implementa o operador lógico AND, considerar que
HLL’s usam avaliações simplificadas.
• No exemplo seguinte, se a primeira expressão é falsa, a segunda
expressão é desviada:
if (al > bl) AND (bl > cl) X = 1;
Web site Examples 48
Expressão composta com ANDExpressão composta com AND (2 de 3) (2 de 3)
cmp al,bl ; first expression...ja L1jmp next
L1:cmp bl,cl ; second expression...ja L2jmp next
L2: ; both are truemov X,1 ; set X to 1
next:
if (al > bl) AND (bl > cl) X = 1;
Essa é uma possível implementação . . .
Web site Examples 49
Expressão composta com ANDExpressão composta com AND (3 de 3) (3 de 3)
cmp al,bl ; first expression...jbe next ; quit if falsecmp bl,cl ; second expression...jbe next ; quit if falsemov X,1 ; both are true
next:
if (al > bl) AND (bl > cl) X = 1;
Mas a seguinte implementação usa 29% (2/7) menos código revertendo o primeiro operador relacional. Permite-se ao programa desviar da segunda expressão:
Web site Examples 50
Sua vez . . .Sua vez . . .
Implementar o seguinte pseudocódigo em linguagem
assembly. Todos os valores são sem sinal:
cmp ebx,ecxja nextcmp ecx,edxjbe nextmov eax,5mov edx,6
next:
if( ebx <= ecx && ecx > edx )
{ eax = 5; edx = 6;}
(existem várias soluções corretas para esse problema.)
Web site Examples 51
Expressão composta com ORExpressão composta com OR (1 de 2) (1 de 2)
• Ao implementar o operador lógico OR, considerar que a HLL’s
usam avaliação simplificada
• No exemplo seguinte, se a primeira expressão é verdadeira, a
segunda expressão é desviada:
if (al > bl) OR (bl > cl) X = 1;
Web site Examples 52
Expressão composta com ORExpressão composta com OR (2 de 2) (2 de 2)
cmp al,bl ; is AL > BL?ja L1 ; yescmp bl,cl ; no: is BL > CL?jbe next ; no: skip next statement
L1: mov X,1 ; set X to 1next:
if (al > bl) OR (bl > cl) X = 1;
Pode-se usar a lógica "fall-through" fazendo o código mais curto possível:
Web site Examples 53
Loops WHILELoops WHILE
while( eax < ebx)eax = eax + 1;
Um loop WHILE é na verdade um comando IF seguido de um corpo de loop, seguido de um salto incondicional ao topo do loop. Considerar o seguinte exemplo:
top:cmp eax,ebx ; check loop conditionjae next ; false? exit loopinc eax ; body of loopjmp top ; repeat the loop
next:
Essa é uma possível implementação:
Web site Examples 54
Sua vez . . .Sua vez . . .
top:cmp ebx,val1 ; check loop conditionja next ; false? exit loopadd ebx,5 ; body of loopdec val1jmp top ; repeat the loop
next:
while( ebx <= val1){
ebx = ebx + 5;val1 = val1 - 1
}
Implementar o seguinte loop, usando inteiros de 32-bits sem sinal:
Web site Examples 55
Seleção baseada em tabelaSeleção baseada em tabela (1 de 3) (1 de 3)
• A seleção baeada em tabela (Table-driven selection) usa uma tabela de múltiplas opções de consulta
• Cria uma tabela contendo opções e os endereços de procedimentos
• Usa um loop para pesquisar a tabela
• Adequado para um número grande de comparações
Web site Examples 56
Seleção baseada em tabelaSeleção baseada em tabela (2 de 3) (2 de 3)
.dataCaseTable BYTE 'A' ; lookup value
DWORD Process_A ; address of procedureEntrySize = ($ - CaseTable)BYTE 'B'DWORD Process_BBYTE 'C'DWORD Process_CBYTE 'D'DWORD Process_D
NumberOfEntries = ($ - CaseTable) / EntrySize
passo 1: criar uma tabela contendo itens de consulta
e endereços de procedimentos:
Web site Examples 57
Seleção baseada em tabelaSeleção baseada em tabela (3 de 3) (3 de 3)
mov ebx,OFFSET CaseTable ; point EBX to the tablemov ecx,NumberOfEntries ; loop counter
L1: cmp al,[ebx] ; match found?jne L2 ; no: continuecall NEAR PTR [ebx + 1] ; yes: call the procedurejmp L3 ; and exit the loop
L2: add ebx,EntrySize ; point to next entryloop L1 ; repeat until ECX = 0
L3:
passo 2: Usar um loop para procurar uma tabela. Quando uma coincidência ocorre, chama-se o endereço de procedimento contido na tabela:
required for procedure pointers
Web site Examples 5858
Próxima seçãoPróxima seção
• Instruções Booleanas e de Comparação• Jumps condicionais• Instruções de loop condicionais• Estruturas condicionais• Aplicação: máquinas de estado finito• Diretivas de decisão
Web site Examples 59
Aplicação: máquinas de estado finitoAplicação: máquinas de estado finito
• Uma máquina de estado finito (finite-state machine - FSM) é um grafo que muda de estado baseado em certa entrada.
• Usa-se um grafo para representar uma FSM, com quadrados ou círculos chamados nós, e linhas com direções entre os círculos chamadas arestas (ou arcos).
• Existem três estados básicos representados pelos nós:
• Estado inicial
• Estado (s) terminal (s)
• Estado (s) não-terminal (s)
Web site Examples 60
Máquina de estado finitoMáquina de estado finito
• Aceita qualquer seqüência de símbolos que resulta no estado terminal
• Pode ser usada para reconhecer ou validar uma seqüência de caracteres que é regida por regras gramaticais chamadas expressões regulares
• Vantagens:
• Provê rastreio visual de fluxo de controle de programas
• Fácil de modificar
• Facilmente implementada em linguagem assembly
Web site Examples 61
Exemplos de FSMExemplos de FSM
• FSM que reconhece cadeias começando com 'x', seguido de letras 'a'..'y', terminando com 'z':
• FSM que reconhece inteiros com sinal:
Web site Examples 62
Sua vez . . .Sua vez . . .
• Explicar por que a seguinte FSM não funciona tão bem para inteiros com sinal:
start
digit
+,-A B
digit
Web site Examples 63
Implementando um FSMImplementando um FSM
StateA:call ReadChar ; read next char into ALcmp al,'+' ; leading + sign?je StateB ; go to State Bcmp al,'-' ; leading - sign?je StateB ; go to State Bcall IsDigit ; ZF = 1 if AL = digitjz StateC ; go to State Ccall DisplayErrorMsg ; invalid input foundjmp Quit
O seguinte código implementa o estado A do FSM de inteiros:
Web site Examples 64
Procedimento IsDigit Procedimento IsDigit
IsDigit PROC cmp al,'0' ; ZF = 0 jb ID1 cmp al,'9' ; ZF = 0 ja ID1 test ax,0 ; ZF = 1
ID1: retIsDigit ENDP
Aciona o flag Zero se o caractere em AL é um dígito decimal.
Web site Examples 65
Flowchart para oFlowchart para oestado Aestado A
O estado A aceita um sinal mais ou menos, ou um dígito decimal.
Web site Examples 66
Sua vez . . .Sua vez . . .
• Desenhar um diagrama de FSM para constantes inteiros em hexadecimal de acordo com a sintaxe do MASM.
• Desenhar um flowchart para um dos estados do seu FSM.
• Implementar o seu FSM em linguagem assembly, fazendo com que o usuário digite uma constante hexadecimal no teclado.
Web site Examples 6767
Próxima seçãoPróxima seção
• Instruções Booleanas e de Comparação• Jumps condicionais• Instruções de loop condicionais• Estruturas condicionais• Aplicação: máquinas de estado finito• Diretivas de decisão
Web site Examples 68
Usando a diretiva .IF Usando a diretiva .IF
• Expressões de tempo de execução (Runtime)• Operadores relacionais e lógicos• Código gerado pelo MASM• Diretiva .REPEAT • Diretiva .WHILE
Web site Examples 69
Expressões de tempo de execução (Runtime) Expressões de tempo de execução (Runtime)
.IF eax > ebxmov edx,1
.ELSEmov edx,2
.ENDIF
• .IF, .ELSE, .ELSEIF e .ENDIF podem ser usados para avaliar expressões de tempo de execução e criar comandos IF estruturados em blocos .
• Exemplos:
• MASM gera um código “escondido" que consiste de labels de código, instruções CMP e salto condicional.
.IF eax > ebx && eax > ecxmov edx,1
.ELSEmov edx,2
.ENDIF
Web site Examples 70
Operadores relacionais e lógicosOperadores relacionais e lógicos
Web site Examples 71
Código gerado pelo MASMCódigo gerado pelo MASM
mov eax,6cmp eax,val1jbe @C0001 mov result,1
@C0001:
.data
val1 DWORD 5
result DWORD ?
.code
mov eax,6
.IF eax > val1
mov result,1
.ENDIF
Código gerado:
MASM automaticamente gera um salto sem sinal porque val1 é sem sinal.
Web site Examples 72
Código gerado pelo MASMCódigo gerado pelo MASM
mov eax,6cmp eax,val1jle @C0001 mov result,1
@C0001:
.data
val1 SDWORD 5
result SDWORD ?
.code
mov eax,6
.IF eax > val1
mov result,1
.ENDIF
Código gerado:
MASM automaticamente gera um salto com sinal (JLE) porque val1 é com sinal.
Web site Examples 73
Código gerado pelo MASMCódigo gerado pelo MASM
mov ebx,5mov eax,6cmp eax,ebxjbe @C0001 mov result,1
@C0001:
.data
result DWORD ?
.code
mov ebx,5
mov eax,6
.IF eax > ebx
mov result,1
.ENDIF
Código gerado :
MASM automaticamente gera um salto sem sinal (JBE) quando ambos os operandos são registradores . . .
Web site Examples 74
Código gerado pelo MASMCódigo gerado pelo MASM
mov ebx,5mov eax,6cmp eax,ebxjle @C0001 mov result,1
@C0001:
.data
result SDWORD ?
.code
mov ebx,5
mov eax,6
.IF SDWORD PTR eax > ebx
mov result,1
.ENDIF
Código gerado:
. . . a menos que um dos operandos de registradores seja prefixado com o operador SDWORD PTR . Então, um salto com sinal é gerado.
Web site Examples 75
Diretiva .REPEAT Diretiva .REPEAT
; Display integers 1 – 10:
mov eax,0.REPEAT
inc eaxcall WriteDeccall Crlf
.UNTIL eax == 10
Executa o corpo do loop antes do teste da condição associado com a diretiva .UNTIL .
Exemplo:
Web site Examples 76
Diretiva .WHILE Diretiva .WHILE
; Display integers 1 – 10:
mov eax,0.WHILE eax < 10
inc eaxcall WriteDeccall Crlf
.ENDW
Teste a condição do loop antes de executar o corpo do loop. A diretiva .ENDW marca o fim do loop.
Exemplo:
Web site Examples 77
SumárioSumário
• Instruções de bits (AND, OR, XOR, NOT, TEST) • Manipula bits individuais em operandos
• CMP – compara operandos usando subtração implícita• modifica flags de condição
• Jumps & Loops condicionais• Igualdade: JE, JNE• Valores de flag : JC, JZ, JNC, JP, ...• Com sinal: JG, JL, JNG, ...• Sem sinal: JA, JB, JNA, ...• LOOPZ, LOOPNZ, LOOPE, LOOPNE
• Flowcharts • Máquinas de estado finito
Web site ExamplesIrvine, Kip R. Assembly Language for Intel-Based Computers 5/e, 2007. 78
The EndThe End