52
José Augusto Fabri Assembly Básico

José Augusto Fabri Assembly Básico - Engenharia de Software · Informa o SO para imprimir um caractere –armazenado em DL DL = 30 + Carry se Carry = NC então 30 + 0 se Carry =

  • Upload
    lenga

  • View
    212

  • Download
    0

Embed Size (px)

Citation preview

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

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

• 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: 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

• 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

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

• 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?

• 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

• 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 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

• 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.– 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