1
2
3
4
5
6
7
8
9
10
11
12

 

 

Linguagem de Alto Nível

Tabela ASCII

display: none;

 

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

0

ø

u

SP

0

@

P

`

p

Ç

É

á

α

1

t

!

1

A

Q

a

q

ü

æ

í

β

±

2

2

2

B

R

b

r

é

Æ

ó

T

3

!!

#

3

C

S

c

s

â

ô

ú

4

$

4

D

T

d

t

ä

ö

ñ

5

§

%

5

E

U

e

u

à

ò

Ñ

σ

6

-

&

6

F

V

f

v

å

û

ª

÷

7

2

7

G

W

g

w

ç

ù

º

8

#

(

8

H

X

h

x

ê

ÿ

¿

º

9

$

)

9

I

Y

i

y

ë

Ö

θ

¨

A

"

*

:

J

Z

j

z

è

Ü

Ω

.

B

!

+

;

K

[

k

}

ï

¢

½

δ

C

,

L

\

l

|

î

¼

3

D

1

-

=

M

]

m

{

ì

¥

¡

Ø

2

E

p

.

N

^

n

~

Ä

Pt

«

F

q

/

?

O

_

o

Ǻ

f

»

sp

Tabela com o código ASCII

                        41h à A  

Linguagem Assembly

Para calcular o espaço do endereço de memória, baseamo-nos no facto de os sistemas trabalharem na base 2, sistema binário.

2n à n é o número de linhas

20 linhas = 220 = 1048576 = 1 Megabyte

32 bits = 32 linhas = 232 = 4 Gigabytes de memória física

 

Programação no Debug

O Debug é um compilador de Assembly para programas pequenos, e está presente no DOS.

C:\Debug  8

–  F  100  10F  41  à esta linha fica preenchida com o código 41h (A)

–  F  100  10F  41  à esta linha fica preenchida com o código 61h (a)

–  F  à comando Fill, preenche a memória.

–  d 100  à comando Dump, serve para verificar o estado da memória

 

  • Todos os valores presentes são em hexadecimal.

  • –  F  100  117  41

F à comando Fill

0100h à endereço inicial

0117h à endereço final

41h à código a entrar na memória

 

Programação em Assembly

Comandos do Debug

Instruções do microprocessador 8086/88

Funções do DOS

E = Entry

MOV =Move

Display Output – INT 21h

A= Assemble

JMP = Salto

U = Unassemble

LOOP = Laço

Programe Terminate – INT 20h

G = Go

INT = Interrupt

Q = Quit

 

 

N = Name

W = Write

 

Para criarmos um programa no Debug utilizamos o comando E, Entry. (com este comando colocamos uma série de bytes diferentes, em hexadecimal).

C:\Debug  8

– E 100  8  à deve ser sempre neste offset, é o endereço onde o programa vai ser carregado.

293B : 0100   61. –   à 293b – base do segmento, e varia consoante os programas já carregados. 0100h – offset do segmento.

         – o cursor espera a entrada de dois valores na base 16, 1 byte.

À frente do cursor digite, B2 [espaço], 1 [espaço], B4 [espaço], 2 [espaço], CD [espaço], 21 [espaço], CD [espaço], 20 [enter]

 

293B : 0100   61.b2  61.1 …

 

Executamos o programa com o comando G, Go

–  G  100             à   (este símbolo aparece no ecrã)

Vamos carregar em memória o mesmo programa mas com o comando A, Assemble. (permite a entrada de bytes em memória, mas não em hexadecimal, é em código ou símbolos da linguagem Assembly, que é traduzido para linguagem de maquina.

C:\Debug  8

–  A 100  8 

293B : 0100 - à espera a primeira linha

293B : 0100 MOV DL,01  8

293B : 0102 MOV AH,02  8

293B : 0104 INT 21  8

293B : 0106 INT 20  8

293B : 0108         8

–  D 100  8

293B : 0100  B2 01 B4 02 CD …

 

Com o comando U, Unassemble, a partir do código de máquina podemos obter os códigos correspondentes, da linguagem assembly.

 

–  U 100  8 

293B : 0100 MOV DL,01 

293B : 0102 MOV AH,02 

293B : 0104 INT 21 

293B : 0106 INT 20 

293B : 0108        

 

Este comando envia para o monitor os endereços lógicos, o código em hexadecimal e a tradução.

A instrução JMP é um salto incondicional, neste caso salta para o endereço 0100h, mas devido à falta da condição, torna-se um ciclo infinito.

 

0100 MOV DL,01 

0102 MOV AH,02 

0104 INT 21 

0106 JMP  100

 

o fazer Unassemble ao programa, uma parte do código é diferente, a instrução JMP é convertida a  EBF8h.

EBh à JMP

F8h à é a distância em bytes para o qual o programa vai saltar.

 

08h à 8 bytes para a frente

F8h à 8 bytes para trás    

 

Caso pretendamos controlar ou modificar o conteúdo dos registos internos do processador, utilizamos o comando R, register, do Debug.

 

–  R CX  8 

      : 0000 -  F

 

–  R  8 

 

Primeiro Programa

Vamos criar um programa que preencha o monitor com toda a tabela ASCII.

–  A 100  8 

293B : 0100 MOV CX, 100  8               à neste valor, é descontado uma unidade

293B : 0103 MOV DL, 00  8                   sempre que a função loop é executada.

293B : 0105 MOV AH, 02  8                à  100(h) = 256(10)

293B : 0107 INT 21  8

293B : 0109 INC DL  8

293B : 010B LOOP 105  8

293B : 010D INT 20  8

293B : 010F         8

–  G  8 

 

Para guardar o ficheiro utilizamos o comando N, Name, no Debug

–  N  ASCII.com  8 

 

Após este procedimento, o programa ainda não está guardado, apenas temos um nome em memória, temos de contar o número de bytes que serão necessários reservar para guardar o programa, este valor é a diferença entre 0100h e 010Eh, que é Fh bytes.

É nos registos CX e BX do processador, que está a informação do número de bytes, se o tamanho for <64K só é utilizado o registo CX, caso contrario, se for >64K, o registo BX também é utilizado.

–  R BX  8 

: 0000 -  0  8

–  R CX  8 

: 0000 -  (F)  8

 –  R  8 

BX = 0000 e CX = 000F

 

Gravamos finalmente o programa com o comando W, Write,

–  R  8 

A escrever 000F bytes

–  Q  8 

Segundo Programa

Para criarmos este programa, precisamos de compilador, o MASM, Macro Assembler da Microsoft.

Para isso escreve-se o código em MS-DOS ou no “Bloco de Notas” do Windows, guarda-se com o nome pretendido, mas com a extensão ASM ( ASCII.ASM ). Todo o processo é descrito no gráfico seguinte.

 

MASM – Macro Assembler da Microsoft

 

No editor de texto escreve-se:

 

Tabela Segment                 ; inicio do segmento

            Assume           CS: Tabela               ; aponta o code segment para o programa

                                   MOV CX, 100h          ; com o MASM, temos de indicar que é em hexadecimal

                                   MOV DL, 0               ; o 1º carácter da tabela

            Proximo

                                   MOV AH, 2               ; função 2 do INT 21, Display Output

                                   INT 21h

                                   INC DL                      ; próximo carácter

                                   LOOP Proximo

                                   INT 20h

Tabela ENDS                    ; encerra o segmento

                                   END                          ; encerra o programa

 

Depois de termos escrito o programa, deve-se guardar com a extensão ASM.

Invoca-se o programa MASM, seguido do nome do programa.

 

C:\»MASM ASCII2.ASM 8

...

Object filename [ASCII2.OBJ] 8

Source listing [NUL.LST] 8                           auxilio para corrigir erros

Cross reference [NUL.CRF] 8                         auxilio para corrigir erros

 

Depois, para converter o ficheiro OBJ para EXE, utiliza-se o Link.

C:\»LINK ASCII2.OBJ 8

...

Run file [ASCII2.EXE] 8

List file [NUL] 8

Libraries [ .LIB] 8

 

Como o programa só ocupa um segmento de memória, (64Kbytes), deve ser convertido para COM, com o programa EXE2BIN

C:\» EXE2BIN ASCII2.EXE ASCII.COM  8

Com o comando DIR em Dos, podemos ver as diferenças de tamanho, o ficheiro .com (15 bytes) é igual o programa criado no Debug (F bytes).

Para ver o código deste novo programa, utiliza-se o comando U.

C:\» Debug ASCII2.com  8

–  U  8