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 |

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