Upload
lenga
View
212
Download
0
Embed Size (px)
Citation preview
Cálculo em Códigos de Máquina
• O comando register - r
Registradores de propósito geral – 16 bits
Acesso a parte alta e a parte baixa, por exemplo
AH ou AL
Ponteiros: IP = PC
Registradores de segmentos
DS – área de memória que está sendo utilizada FLAGS, por exemplo
overflow
Parênteses - Segmentação de Memória
0000-0000
.
.
0000-FFFF
.
.
.
.
FFFF-0000
.
.
FFFF-FFFF
216endereços
216 segmentos
Qual o tamanho memória?
Cálculo em Códigos de Máquina
• Somando valores
Código instrução de adição (utilização: 0000 0001 1100 1000)
Endereços de memória
Segmento de memória utilizado
Cálculo em Códigos de Máquina
• Como adicionar:
Operação: adição
Opcode Registradores gerais operação
00d8 AL, BL AL = AL + BL
01d8 AX,BX AX = AX + BX
02d8 BL,AL BL = BL + AL
03d8 BX,AX BX = BX + AX
• Utilizando o debug, desenvolva um programa que efetue todos os cálculos a
partir do endereço 0100 de memória.
Cálculo em Códigos de Máquina
• Como subtrair:
Operação: adição
Opcode Registradores gerais operação
28d8 AL, BL AL = AL - BL
29d8 AX,BX AX = AX - BX
2ad8 BL,AL BL = BL - AL
2bd8 BX,AX BX = BX - AX
• Utilizando o debug, desenvolva um programa que efetue todos os cálculos a
partir do endereço 0100 de memória.
Cálculo em Códigos de Máquina
• Como multiplicar:
Código da multiplicação
Multiplica AX por BX e armazena o resultado em AX
Cálculo em Códigos de Máquina
• No exemplo anterior, multiplicados poucos bits.
• Se multiplicarmos um número de 16 bits por outro número de 16 bits,
poderemos ter como resultado um número de 32 bits.
– Veja o exemplo com a multiplicação de 2 números com 2 bits cada:
– 11 * 11 = 1001.
• Implicação: Não temos um registrador de 32 bits para armazenar o valor do
resultado. E agora?
• Veja só o problema proposto: Cálculo em Códigos de Máquina
32060
256
7d3c00
?
DX armazena os 16 bits mais significativosAX armazena os 16 bits menos significativos
Cálculo em Códigos de Máquina
• Desenvolva a multiplicação com base nos opcodes:
Operação Multiplicação
Opcode Registradores Gerais operação
F6E3 BL AX = AL * BL
F7E3 BX DX:AX = AX*BX
Cálculo em Códigos de Máquina
• Divisão
Operação Divisão
Opcode Registradores Gerais operação
F6F3 BL AX = AL / BL AL = quociente AH = resto
F7F3 BX DX:AX = AX/BX AX = quociente DX = resto
• Faça um exemplo utilizando tais conceitos.
Apresentação de Dados
• Utilização do conceito de interrupção.
• int 21: interrupção utilizada para exibição de um caractere no vídeo.
Valor ASCII do caractere @ - DL = 40
AH = 02 - Indica ao SO que algo será apresentado na tela.
Se AH tivesse outro valor, o SO executaria outro valor.
Concluí-se então que a parte mais significativa de AX, quando
possui o valor 02 exibe o caractere ASCII, armazenado na
parte menos significativa de DX.
Questão – Por que não utilizar todos os bits do registrador DX
para apresentação dos caracteres? – tb. asciiCódigo de máquina para interrupção 21
Apresentação de Dados
Observe que utilizamos o comando g, ao invés de t. O comando T executa o programa
linha a linha, e isto gera uma execução inconveniente, pois aos ser executada a int 21,
é necessário executar uma sub-rotina interna na qual dará muito trabalho.
O comando g age de forma direta, porém ele necessita ser informado até que ponto do
deslocamento ele deve caminhar, em nosso caso 0102
Apresentação de Dados
• A interrupção 20 (int 20) – objetivo: retornar do controle do computador para
o sistema operacional (ou seja o encerramento do programa).
• Caso um programa não possua a interrupção int 20 o mesmo pode ficar em
estado de bloqueado, eternamente, pois para aquele processo o SO não
recebeu o comando de volta.
Continuando o programa – entrando
com a instrução int 20
?
Apresentação de Dados
• Apresentação do comando U
• Faça um programa para imprimir os seguintes caracteres: F E M A
Apresentação de Dados
• Gravando programa
Programa: O ele faz mesmo?
Tamanho do programa (bytes) = endereço final – endereço inicial
Armazenando o tamanho do programa no registrador CX. BX
será utilizado se CX ultrapassar o valor de 216
Avisando o shell sobre o nome do programa – w gravando
Apresentação de Dados
• Programa para imprimir na tela a string alo mundo!
‘Posicionado as informações na memória a partir do endereço 0200
Caracteres ASCII, referentes a sting “alo mundo”
AX = 0900, informa ao SO que será impresso uma
seqüência de caracteres, a partir do endereço,
armazenado em DX
Termina a String
Apresentação de Dados
• Veja só o que o comando D (dump) faz:
Fim da mensagem
É possível gerar um arquivo .com a partir deste programa?
• Salvando o programa “alô mundo”.
Apresentação de Dados
Início do programa:
Transparência 25
Desenvolva um programa em asm que escreva o seu primeiro nome na tela
Apresentação de Dados
• O flag carry (CY e NC)
1111 1111 1111 1111
+ 0000 0000 0000 0001
Estouro da capacidade máxima da representação numérica
10000
Apresentação de Dados
• Apresentando valores em binário:
– Comando RCL (Rotação, por meio do carry, para esquerda.
– Exemplo
– BX = 00AA tal que BL = AA.
– Em binário:
– BX = 0000 0000 1010 1010
– BL = 1010 1010
– RCL BL, 1
• Rotação para a esquerda
• Soma 1 em BL (quando não estoura flag CY)
Apresentação de Dados
CONTINUANDO
Valor inicial de BX: 00AA (ou apenas AAh)
Ação IP Execução Carry Flag Anotação (BX)BL
1 r IP t CY 1 0054
0100
2 r IP t NC 0 00A9
0100
3 r IP t CY 1 0052
0100
4 r IP t NC 0 00A5
0100
5 r IP t CY 1 004A
0100
6 r IP t NC 0 0095
0100
7 r IP t CY 1 002A
0100
8 r IP t NC 0 0055
0100
Apresentação de Dados
Veja o exemplo ilustrativo
10101010
1 01010100 54
10 10101000 + 1 =
10101001 A9
101 01010010 52
1010 10100100 + 1 =
10100101 A5
Carry não estoura, com isto realiza soma
Carry não estoura com isto realiza soma
Apresentação de Dados
• Desenvolvendo o mesmo programa com um loop:
Contador armazenado em CX – o loop decrementa-o, automaticamente
Apresentação de Dados
• Um versão um pouco melhor do mesmo programa:
Informa o SO para imprimir um caractere – armazenado em DL
DL = 30 + Carry se Carry = NC então 30 + 0
se Carry = CY então 30 + 1
30 é o caractere ASCII ZERO
31 é o caractere ASCII UM
Não esqueça de executar o comando G,
a partir de IP = 0100
Apresentação de Dados
• Outros Flag’s
– Zero Flag (ZF) – Sinalizado com ZR (zero) ou NZ (não zero)
– Sign Flag (SF) – Sinalizado com NG (negativo) ou PL (positivo)
– Over Flag (OF) – Sinalizado com OV – (overflow) ou NV – (não overflow)
Apresentação de Dados
• Analisando o Flag ZF
Operação executada zerou o valor do registrador de estado
Apresentação de Dados
• Analisando os Flags: Sign Flag (SF) e Over Flag (OF)
0111 0000 0000 0000
+ 0110 0000 0000 0000
Apresentação de Dados – Instruções de Saltos Condicionais
• Saltos a partir da verificação dos registradores de estados:
– Jump on Zero (JZ): Salta para um endereço caso o registrador Zero Flag
esteja sinalizado como zerado (ZR)
– Jump not Zero (JNZ): Salta para um endereço caso o registrador de
estado Zero Flag não esteja sinalizado com zero (NZ).
• Exemplo de programa: Apresentar na tela a letra A enquanto BL >
0, quando BL atingir Zero apresentar a letra B.
Apresentação de Dados – Instruções de Saltos Condicionais
• O Programa
Quantidade de letras que será apresentado
AX = 0200, vou imprimir alguma coisa, Hein!!!
DX = 0041, valor ASCII do caractere A
Interrupção utilizada para imprimir
BL = BL - 1
Salta para o endereço 106 eqto ZF = NZ
Valor ASCII do caractere B
Ajuste o IP 0100 e execute o comando G.
Saída emitida: AAAB
Apresentação de Dados – Verificando o CMP
• Configura seu computador da seguinte forma:
• Execute o comando T do shell
• Saia do debug e retorne com ele na memória.
• Entre com AAAA em AX e BX
• Adiciona o endereço 0100 a linha de código CMP AX, BX.
• Verifique o valor de IP
Apresentação de Dados – Instruções de Saltos Condicionais
• Veja só o que fizemos:
• Execute o comando T e veja o resultado
Apresentação de Dados – Instruções de Saltos Condicionais
• Executando ....
• Esta instrução também está presente no MIPS – como nome de SLT.
Apresentação de Dados
• Objetivo: mostrar um valor de um dígito expresso em notação hexadecimal.– 0 a F
– Tabela ASCII para esses valores
– 0 30 : 3A D 44
– 1 31 ; 3B E 45
– 2 32 < 3C F 46
– 3 33 = 3D
– 4 34 > 3E
– 5 35 ? 3F
– 6 36 @ 40
– 7 37 A 41
– 8 38 B 42
– 9 39 C 43
• Parte numérica – 30 a 39
• Parte alfabética de 41 a 46
Apresentação de Dados
• Utilizar dois grupos de caracteres
– 30 a 39
– 40 a 46
– Diferença de 7 posições.
Soma 30 em DL, pois 0 começa no trinta – vide tabela ASCII
DL – 39
010F
Salta para 010f se
zf = zr
Apresentação de Dados
• O comando SHR – Rotaciona para direita um número X de bits. Este número
deve estar armazenado em CL. Valor máximo da rotação = 16 (10hex).
Apresentação de Dados
• Exibindo valores em hexadecimal (nibble a esquerda da parte baixa de bx).
[Escreva em seu caderno qual o processamento realizado por cada linha].
Apresentação de Dados
• Utilizando comando e para exibir um valor em hexa (nibble a direita de part
baixa de bx).
0B45:0100 mov ah,02
Apresentação de Dados
• Exibindo dos dígitos em hexa na tela (toda parte baixa de bx).
Utilizando shr para exibir
o nibble mais a esquerda
Utilizando shr para exibir
o nibble mais a direira
Entrada de Dados
• Utilizar a int 21 com controle de entrada 01 em AH. Exemplo
Leitura e armazenamento
do valor hexadecimal,
armazenando em AL
Leitura do valor 05,
Armazenado em al com
35 (ascii ref a 5)
35 – 30 = 5
AL - 09
Salta para 010c se
zf = zr
Subtrai 07 em al, encontrando as
letras.
Entrada de Dados
• Leitura de dois caracteres em Hexa
Possibilita leitura
Realiza a leitura ex: A = 61
Realiza a leitura ex: DL = AL
Realiza a leitura ex: DL = 31DL - 9
Se zf = zr
DL - 7 = 2ACL = 4Move para esquerda (L) um nibble de DLNova leitura ex: A = 61
AL = AL – 30AL - 9
Se zf = zrAL – 7 = 2A
DL = A + 2A