Fabri. J. A. slides de assembly

Propaganda
José Augusto Fabri
Assembly Básico
Aritmética em Modo Hexadecimal
• Operações da adição e subtração em hexadecimal (comando H)
Aritmética em Modo Hexadecimal
• Número negativos: Que número representa o FFFF?
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
Registradores de segmentos
DS – área de memória que está sendo utilizada
Ponteiros: IP = PC
FLAGS, por exemplo
overflow
Parênteses - Segmentação de Memória
216 segmentos
0000-0000
.
216endereços
.
0000-FFFF
.
.
.
.
FFFF-0000
.
.
Qual o tamanho memória?
FFFF-FFFF
Cálculo em Códigos de Máquina
• Somando valores
Endereços de memória
Código instrução de adição (utilização: 0000 0001 1100 1000)
Segmento de memória utilizado
Cálculo em Códigos de Máquina
• Como adicionar:
Operação:
Opcode
00d8
01d8
02d8
03d8
adição
Registradores gerais
AL, BL
AX,BX
BL,AL
BX,AX
operação
AL = AL + BL
AX = AX + BX
BL = BL + AL
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
• Correção do exercício (1)
Cálculo em Códigos de Máquina
• Correção do exercício (2)
Cálculo em Códigos de Máquina
• Como subtrair:
Operação:
Opcode
28d8
29d8
2ad8
2bd8
adição
Registradores gerais
AL, BL
AX,BX
BL,AL
BX,AX
operação
AL = AL - BL
AX = AX - BX
BL = BL - AL
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
• Correção do exercício (1)
Barra de espaço
Cálculo em Códigos de Máquina
• Correção do Exercício (2)
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
7d3c00
256
?
AX armazena os 16 bits menos significativos
DX armazena os 16 bits mais significativos
Cálculo em Códigos de Máquina
• Desenvolva a multiplicação com base nos opcodes:
Operação
Opcode
F6E3
F7E3
Multiplicação
Registradores Gerais
BL
BX
operação
AX = AL * BL
DX:AX = AX*BX
Cálculo em Códigos de Máquina
• Divisão
Operação
Opcode
F6F3
F7F3
Divisão
Registradores Gerais
BL
BX
operação
AX = AL / BL
DX:AX = AX/BX
• Faça um exemplo utilizando tais conceitos.
AL = quociente AH = resto
AX = quociente DX = resto
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.
AH = 02 - Indica ao SO que algo será apresentado na tela.
Se AH tivesse outro valor, o SO executaria outro valor.
Valor ASCII do caractere @ - DL = 40
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.
Código de máquina para interrupção 21
Questão – Por que não utilizar todos os bits do registrador DX
para apresentação dos caracteres? – tb. ascii
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
• O comando mov
DESCUBRA O CÓDIGO HEXA DO COMANDO MOV
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
• Abrindo programa
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?
Apresentação de Dados
• Salvando o programa “alô mundo”.
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)
10000
Estouro da capacidade máxima da representação numérica
1111 1111 1111 1111
+ 0000 0000 0000 0001
Apresentação de Dados
• Uma nova adição, sobreposta a anterior, gerou NC para o carry.
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
1
r IP
t
0100
2
r IP
t
0100
3
r IP
t
0100
4
r IP
t
0100
5
r IP
t
0100
6
r IP
t
0100
7
r IP
t
0100
8
r IP
t
0100
Flag
CY
Anotação
1
(BX)BL
0054
NC
0
00A9
CY
1
0052
NC
0
00A5
CY
1
004A
NC
0
0095
CY
1
002A
NC
0
0055
Apresentação de Dados
Veja o exemplo ilustrativo
1
10
101
1010
10101010
01010100
10101000 + 1 =
10101001
01010010
10100100 + 1 =
10100101
54
Carry não estoura, com isto realiza soma
A9
52
Carry não estoura com isto realiza soma
A5
Apresentação de Dados
• Desenvolvendo o mesmo programa com um loop:
Contador armazenado em CX – o loop decrementa-o, automaticamente
Apresentação de Dados
• Executando:
Apresentação de Dados
• Executando
E assim por diante – até zerar CX
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.
– 0aF
–
–
–
–
–
–
–
–
–
–
–
Tabela ASCII para esses valores
0
30
:
1
31
;
2
32
<
3
33
=
4
34
>
5
35
?
6
36
@
7
37
A
8
38
B
9
39
C
• Parte numérica – 30 a 39
• Parte alfabética de 41 a 46
3A
3B
3C
3D
3E
3F
40
41
42
43
D
E
F
44
45
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
Salta para 010f se
zf = zr
010F
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 = 31
DL - 9
Se zf = zr
DL - 7 = 2A
CL = 4
Move para esquerda (L) um nibble de DL
Nova leitura ex: A = 61
AL = AL – 30
AL - 9
Se zf = zr
AL – 7 = 2A
DL = A + 2A
Download