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