Montagem - Condições
A execução condicional em linguagem assembly é realizada por várias instruções de loop e ramificação. Essas instruções podem alterar o fluxo de controle em um programa. A execução condicional é observada em dois cenários -
Sr. Não. | Instruções Condicionais |
---|---|
1 | Unconditional jump Isso é executado pela instrução JMP. A execução condicional frequentemente envolve uma transferência de controle para o endereço de uma instrução que não segue a instrução em execução no momento. A transferência de controle pode ser para frente, para executar um novo conjunto de instruções, ou para trás, para reexecutar as mesmas etapas. |
2 | Conditional jump Isso é executado por um conjunto de instruções de salto j <condição> dependendo da condição. As instruções condicionais transferem o controle interrompendo o fluxo sequencial e o fazem alterando o valor de deslocamento no IP. |
Vamos discutir a instrução CMP antes de discutir as instruções condicionais.
Instrução CMP
A instrução CMP compara dois operandos. Geralmente é usado em execução condicional. Essa instrução basicamente subtrai um operando do outro para comparar se os operandos são iguais ou não. Não perturba os operandos de destino ou origem. É usado junto com a instrução de salto condicional para a tomada de decisão.
Sintaxe
CMP destination, source
CMP compara dois campos de dados numéricos. O operando de destino pode estar no registro ou na memória. O operando de origem pode ser um dado constante (imediato), registro ou memória.
Exemplo
CMP DX, 00 ; Compare the DX value with zero
JE L7 ; If yes, then jump to label L7
.
.
L7: ...
CMP é frequentemente usado para comparar se um valor de contador atingiu o número de vezes que um loop precisa ser executado. Considere a seguinte condição típica -
INC EDX
CMP EDX, 10 ; Compares whether the counter has reached 10
JLE LP1 ; If it is less than or equal to 10, then jump to LP1
Salto Incondicional
Conforme mencionado anteriormente, isso é executado pela instrução JMP. A execução condicional frequentemente envolve uma transferência de controle para o endereço de uma instrução que não segue a instrução em execução no momento. A transferência de controle pode ser para frente, para executar um novo conjunto de instruções, ou para trás, para reexecutar as mesmas etapas.
Sintaxe
A instrução JMP fornece um nome de rótulo onde o fluxo de controle é transferido imediatamente. A sintaxe da instrução JMP é -
JMP label
Exemplo
O seguinte trecho de código ilustra a instrução JMP -
MOV AX, 00 ; Initializing AX to 0
MOV BX, 00 ; Initializing BX to 0
MOV CX, 01 ; Initializing CX to 1
L20:
ADD AX, 01 ; Increment AX
ADD BX, AX ; Add AX to BX
SHL CX, 1 ; shift left CX, this in turn doubles the CX value
JMP L20 ; repeats the statements
Salto Condicional
Se alguma condição especificada for satisfeita no salto condicional, o fluxo de controle é transferido para uma instrução de destino. Existem várias instruções de salto condicional, dependendo da condição e dos dados.
A seguir estão as instruções de salto condicional usadas em dados assinados usados para operações aritméticas -
Instrução | Descrição | Bandeiras testadas |
---|---|---|
JE / JZ | Jump Equal ou Jump Zero | ZF |
JNE / JNZ | Jump Not Equal ou Jump Not Zero | ZF |
JG / JNLE | Jump Greater or Jump Not Less / Equal | OF, SF, ZF |
JGE / JNL | Salto maior / igual ou não menor | OF, SF |
JL / JNGE | Salte menos ou não salte maior / igual | OF, SF |
JLE / JNG | Salto menos / igual ou não maior | OF, SF, ZF |
A seguir estão as instruções de salto condicional usadas em dados não assinados usados para operações lógicas -
Instrução | Descrição | Bandeiras testadas |
---|---|---|
JE / JZ | Jump Equal ou Jump Zero | ZF |
JNE / JNZ | Jump Not Equal ou Jump Not Zero | ZF |
JA / JNBE | Saltar acima ou não abaixo / igual | CF, ZF |
JAE / JNB | Saltar acima / igual ou não abaixo | CF |
JB / JNAE | Saltar abaixo ou não acima / igual | CF |
JBE / JNA | Saltar abaixo / igual ou não acima | AF, CF |
As seguintes instruções de salto condicional têm usos especiais e verificam o valor dos sinalizadores -
Instrução | Descrição | Bandeiras testadas |
---|---|---|
JXCZ | Pule se CX for Zero | Nenhum |
JC | Jump If Carry | CF |
JNC | Pule se não carregar | CF |
JO | Saltar se estouro | DO |
JNO | Saltar se não houver estouro | DO |
JP / JPE | Jump Parity ou Jump Parity Even | PF |
JNP / JPO | Jump No Parity ou Jump Parity Odd | PF |
JS | Sinal de salto (valor negativo) | SF |
JNS | Salto sem sinal (valor positivo) | SF |
A sintaxe para o conjunto de instruções J <condição> -
Exemplo,
CMP AL, BL
JE EQUAL
CMP AL, BH
JE EQUAL
CMP AL, CL
JE EQUAL
NON_EQUAL: ...
EQUAL: ...
Exemplo
O programa a seguir exibe a maior das três variáveis. As variáveis são variáveis de dois dígitos. As três variáveis num1, num2 e num3 têm valores 47, 22 e 31, respectivamente -
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ecx, [num1]
cmp ecx, [num2]
jg check_third_num
mov ecx, [num2]
check_third_num:
cmp ecx, [num3]
jg _exit
mov ecx, [num3]
_exit:
mov [largest], ecx
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,largest
mov edx, 2
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1
int 80h
section .data
msg db "The largest digit is: ", 0xA,0xD
len equ $- msg
num1 dd '47'
num2 dd '22'
num3 dd '31'
segment .bss
largest resb 2
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
The largest digit is:
47