Na aula de hoje começamos o estudo e uso da linguagem de montagem da MVN, o ASM (assembly), e da função de pilha implementada na MVN. A partir desta aula você só escreverá códigos em ASM, e para isso precisamos usar os módulos Montador, Ligador e Relocador.
Diferentemente do monitor, essas ferramentas foram escritas em uma linguagem compilada (Rust), então é somente necessário instalar um executável. Instruções sobre esse processo e sobre as opções disponíveis nas ferramentas estão disponíveis em seu repositório
Executar o código MVN gerado deve ser feito da mesma forma que com o código MVN escrito manualmente.
| OPCODE | MNEMONIC | function |
|---|---|---|
| 0 | JP | Jumps to the operand address |
| 1 | JZ | Jumps to the operand address if AC is 0 |
| 2 | JN | Jumps to the operand address if AC is negative |
| 3 | LV | Load the operand to AC |
| 4 | AD | Save in AC the value AC+value stored in operand address |
| 5 | SB | Save in AC the value AC-value stored in operand address |
| 6 | ML | Save in AC the value AC*value stored in operand address |
| 7 | DV | Save in AC the value AC/value stored in operand address |
| 8 | LD | Save in AC the value stored in operand address |
| 9 | MM | Save in the operand address the value AC |
| A | SC | Call subroutine in operand address |
| B | RS | Return the subroutine that started in operand address |
| C | HM | Halt machine |
| D | GD | Save in AC a pair of nibbles from operand device |
| E | PD | Send value in AC to operand device |
| F | SO | Calls the supervisor to deal with specific codes, which are given by the operand |
ATENÇÃO: os entregáveis desta semana deverão estar em formato ASM.
Você pode (e deve) utilizar o Assembler do utilitário mvn-cli para
gerar os executáveis e testá-los localmente em seu simulador.
No laboratório 4, você escreveu a sub-rotina fatorial. Agora, você irá reescrevê-la, mas na linguagem de montagem da MVN. Considere os rótulos N e RES, localizados nas posições de memória 0x100 e 0x102, que representam respectivamente o argumento e o resultado do fatorial.
Desenvolva um programa para a MVN que calcule e tabele, a partir da posição de memória 0x100, os quadrados perfeitos dos 64 primeiros números naturais (0x0, 0x1, 0x2, ..., 0x3F). O cálculo deverá ser realizado aplicando a seguinte interessante propriedade:
Cada quadrado calculado deverá ser armazenado como um inteiro de dois bytes, iniciando na posição de memória 0x100, ou seja, ao final da execução, os valores das posições de memória serão:
| Posição (hexa) | Valor (hexa) | Valor (decimal) | N |
|---|---|---|---|
| 100 | 0000 | 0 | 0 |
| 102 | 0001 | 1 | 1 |
| 104 | 0004 | 4 | 2 |
| ... | ... | ... | |
| 1?? | 0??? | 3969 | 63 |
OBS.: caso você encontre problemas em algum exercício devido ao evitador de loops infinitos, você pode mudar o valor do número máximo de passos acionando a flag "-s [valor]" ou "--max_step [valor]", trocando "[valor]" pelo limite de passos que você queira definir, ao chamar o módulo "mvnMonitor.py".
*:mostração intuitiva da fórmula
Escrever um programa que lê dois números do teclado
(x e y), e imprime o valor de x+y. Observações:
-
0 <= x,y <= 99 -
Os números devem ser lidos do teclado, em uma única linha, no formato
<x-d1><x-d2><s><s><y-d1><y-d2>, onde:-
<x-d1>é o primeiro dígito de x. Sex < 10, o dígito informado deve ser0. -
<x-d2>é o segundo dígito dex. -
<s>é um espaço em branco -
<y-d1>é o primeiro dígito dey. Sey < 10, o dígito informado deve ser0. -
<x-d2>é o segundo dígito dey.
-
Por exemplo, "07 54" é uma entrada válida, e o programa deve imprimir "61" na saída. Lembrando que em ASCII 07 é 0x3037 e 54 é 0x3534, enquanto 61 é 0x3631.
Para realizar esse exercício, utilize o seguinte algoritmo:
- Subtraia 0x3030 de ambos os números obtidos pelo teclado.
- Some esses números.
- Caso o dígito menos significativo do número resultante da soma, seja maior ou igual a A, subtraia 0x000A e some 0x0100 para realizar o "vai-um".
- Soma 0x3030 ao número resultante do passo anterior.
- Imprima esse número no monitor.
OBS.: Consulte a tabela ASCII
