|
Linguagens
Tabela ASCII
|
|
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
|

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.
2 n à n é o número de linhas
20 linhas = 2 20 = 1048576 = 1 Megabyte
32 bits = 32 linhas = 2 32 = 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
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, (64K bytes
), 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
|