Diretivas
Uma linha de diretiva contém comandos para o montador.
-
A definição de áreas de variáveis;
-
Endereços de memória onde a montagem deve ser feita.
-
Criar uma sub-rotina (procedure).
Uma diretiva (pseudo-instrução) desenvolve alguma função durante o processo de montagem. Não produz qualquer código executável. Pode reservar e inicializar
espaço e dados do programa.
Formato de Diretivas
Formato Geral:
[Nome] Diretiva [Operandos] [; Comentário]
Diretivas implementadas:
Diretiva DB
Função: reserva um byte para variáveis, permitindo opcionalmente inicializá-lo com um valor decimal. Formato:
[nomeVariavel] DB valorInicial [; Comentário]
Diretiva DW
Função: reserva dois bytes para variáveis, permitindo opcionalmente inicializá-los com um valor decimal. Formato:
[nomeVariavel] DW valorInicial [; Comentário]
Diretiva EQU
Função: define o valor de um símbolo a ser usado posteriormente, no lugar de um dado imediato, define uma constante. Formato:
[nomeConstante] EQU valorConstante [; Comentário]
Diretiva HLT
Função: usado para acabar com a execução (parar o processador). Formato:
HLT [; Comentário]
Diretivas PROC e ENDP, e Instruções CALL e RET
As diretivas PROC e ENDP servem para delimitar uma sub-rotina (intra-segmento). Para “chamar” esta sub-rotina, é utilizada a instrução CALL, seguido do nome da sub-rotina. A instrução RET indica o retorno do procedimento. Segue o exemplo:
ROTINA1 PROC ; inicio da sub-rotina ROTINA1
... ; instruções da sub-rotina ROTINA1
RET
ROTINA1 ENDP ; fim da sub-rotina ROTINA1
CALL ROTINA1 ; chamada intra-segmento
Labels(rótulo)
O rótulo deve ser definido uma única vez, e não pode ser redefinido. Deve ser escrito no início da linha e seguido de dois-pontos.
Instruções
Uma linha de instrução contém um mnemônico de uma instrução do simulador. Cada linha gera exatamente uma instrução de máquina. Formato geral:
Mnemônico [Operando1], [Operando2] [; Comentário]
Nos operandos instanciados na memória (variáveis) o acesso será feito de dois modos: endereço e conteúdo. Por exemplo, para acesso ao endereço da variável x usa-se somente o nome da variável, para acesso ao conteúdo de x usa-se colchetes, [x].
Conjunto de instruções suportadas:
-
Para movimentação de dados;
-
Para operações aritméticas/lógicas;
-
Desvio do fluxo do programa.
Movimentação de Dados
-
Mnemônico MOV: copia o segundo operando (fonte) para o primeiro operando (destino). Os tipos de operandos suportados são:
MOV REG, memória
MOV memória, REG
MOV REG, REG
MOV memória, imediato
MOV REG, imediato
Operações aritméticas/lógicas
-
Mnemônico ADD: soma o primeiro operando com o segundo, o resultado fica armazenado no primeiro operando.
-
Mnemônico SUB: subtrai o primeiro operando pelo segundo, o resultado fica armazenado no primeiro operando.
-
Mnemônico AND: “E” entre todos os bits de cada operando, o resultado fica armazenado no primeiro operando.
-
Mnemônico OR: “OU” entre todos os bits de cada operando, o resultado fica armazenado no primeiro operando.
-
Mnemônico XOR: “OU EXCLUSIVO” entre todos os bits de cada operando, o resultado fica armazenado no primeiro operando.
Os tipos de operandos suportados pelos mnemônicos acima são:
[Mnemônico] REG, memória
[Mnemônico] memória, REG
[Mnemônico] REG, REG
[Mnemônico] memória, imediato
[Mnemônico] REG, imediato
-
Mnemônico MUL: multiplicação não-sinalizada do primeiro operando pelo segundo, sendo que o primeiro operando obrigatoriamente é o registrador AL. O resultado da operação sempre será armazenado no registrador AX. Os tipos de operandos suportados são:
MUL memória
MUL REG
-
Mnemônico DIV: divisão não-sinalizada do primeiro operando pelo segundo, sendo que o primeiro operando obrigatoriamente é o registrador AX. O quociente da operação sempre será armazenado no registrador AL e o resto da operação no registrador AH. Os tipos de operandos suportados são:
DIV memória
DIV REG
-
Mnemônico NOT: inverte cada bit do operando.
Os tipos de operandos suportados são:
NOT REG
NOT memória
-
Mnemônico CMP: compara o primeiro operando com o segundo, e em seguida usa-se um "salto" para concluir a comparação (desviando o fluxo do programa).
Exemplo de utilização:
CMP AL, 2
JE label ; pode ser outro "salto" a ser utilizado, "saltosque serão tratados no tópico abaixo.
Desvio do Fluxo do Programa
-
Mnemônico JMP: Salto incondicional, precisa ser passado apenas o rótulo, que este jump transfere o controle para outra parte do programa.
JMP label
-
Mnemônicos JE, JNE, JG, JGE, JL e JLE: Saltos que representam as operações de comparação ==,!=,>,>=,<,<= respectivamente, sua utilização é a mesma da instrução JMP.
*Operações equivalentes a linguagem C.
-
Mnemônico CALL: transfere o controle para uma sub-rotina (procedure).
CALL procedure