Execução de Programas
Partes de um programa:
‣ Dados
‣ Código (instruções)
Um programa necessita estar carregado em memória RAM para ser executado,
sendo assim, cada variável e cada instrução do programa está localizado em
algum endereço na memória.
O conteúdo da memória onde estão localizados os dados, está mudando
constantemente e o local onde estão armazenados os código, permanece
sempre com o mesmo conteúdo.
A execução do programa é feita instrução por instrução até que a instrução de
finalização de programa seja executada.
Utilizando o DEBUG
-r , mostra o conteúdo dos registradores ou altera o conteúdo de um
registrador.
-r
AX=0000 BX=0000
DS=0B52 ES=0B52
0B52:0100 7312
-r ax
AX 0000
:8
-r bx
BX 0000
:2
-r
AX=0008 BX=0002
DS=0B52 ES=0B52
0B52:0100 7312
CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
SS=0B52 CS=0B52 IP=0100 NV UP EI PL NZ NA PO NC
JNB 0114
CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
SS=0B52 CS=0B52 IP=0100 NV UP EI PL NZ NA PO NC
JNB 0114
Utilizando o DEBUG
e - editar um endereço de memória
-e 100
0B52:0100 73.01
-e 101
0B52:0101 12.d8
-r
AX=0008 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0100 NV UP EI PL NZ NA PO NC
0B52:0100 01D8
ADD AX,BX
Utilizando o DEBUG
t – Execução passo a passo da instrução apontada por IP.
-r
AX=0008 BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0100 NV UP EI PL NZ NA PO NC
0B52:0100 01D8
ADD AX,BX
-t
AX=000A BX=0002 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0102 NV UP EI PL NZ NA PE NC
0B52:0102 2E
CS:
0B52:0103 A1AC95
MOV AX,[95AC]
CS:95AC=0000
Utilizando o Debug
Operação de Soma e Subtração com assembly.
ADD AX, BX
SUB AX, BX
O resultado da Soma do conteúdo de dois registradores é armazenado no
primeiro registrador, no exemplo acima ficaria AX = AX + BX
O resultado da subtração do conteúdo de dois registradores é armazenado no
primeiro registrador, no exemplo acima ficaria AX = AX - BX
Utilizando o DEBUG
A operação de Multiplicação utiliza sempre o registrador AX.
Mul BX
A instrução acima considera que o registrador bx será multiplicado por AX
A multiplicação de dois números de 16 bits, poderá gerar um número de 32 bits,
desta forma, o resultado da multiplicação é guardado em dois registradores no
formato DX:AX, onde parte mais significativa do resultado é armazenado em
DX e parte menos significativa é armazenado em AX
Exemplo:
AX = 7c4b
BX = 0100
AX * BX = 7C4B00
RESULTADO FINAL – DX=007C e AX=4B00
Utilizando o DEBUG
-r ax
AX 0000
:7c4b
-r bx
BX 0000
:0100
-r
AX=7C4B BX=0100 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0100 NV UP EI PL NZ NA PO NC
0B52:0100 BB0200
MOV BX,0002
-e 100
0B52:0100 BB.f7
-e 101
0B52:0101 02.e3
-r
AX=7C4B BX=0100 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0100 NV UP EI PL NZ NA PO NC
0B52:0100 F7E3
MUL BX
-t
AX=4B00 BX=0100 CX=0000 DX=007C SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0102 OV UP EI PL NZ NA PE CY
0B52:0102 00B80300 ADD [BX+SI+0003],BH
DS:0103=B8
Utilizando o DEBUG
A operação de divisão utiliza um número de 32 bits, desta forma, considera que
este número está armazenado no par de registrador DX:AX, onde o DX
armazena a parte mais significativa e AX a parte menos significativa
Div bx
A instrução acima assume que o número contido no par DX:AX será dividido
pelo conteúdo do registrado BX.
A parte inteira da divisão será armazenado no registrador AX e o resto da divisão
será armazenada no registrador DX.
Utilizando o DEBUG
-r dx
DX 0000
:007c
-r ax
AX 0000
:4b12
-r bx
BX 0000
:0100
-r
AX=4B12 BX=0100 CX=0000 DX=007C SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0100 NV UP EI PL NZ NA PO NC
0B52:0100 F7E3
MUL BX
-e 100
0B52:0100 F7.
-e 101
0B52:0101 E3.f3
-t
AX=7C4B BX=0100 CX=0000 DX=0012 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0102 NV UP EI PL NZ NA PO NC
0B52:0102 00B80300 ADD [BX+SI+0003],BH
DS:0103=B8
UTILIZANDO DEBUG
a – (assembly) escrever código em
assembler no endereço apontado pelo
registrador IP
F:\>debug
-a
0B52:0100 mov ax,0002
0B52:0103 mov bx,0003
0B52:0106 mov cx,0004
0B52:0109 mov dx,0005
0B52:010C add ax,bx
0B52:010E add bx,cx
0B52:0110 add cx,dx
0B52:0112 sub dx,1
0B52:0115
Utilizando o Debug
u – Mostra o código de máquina (unassembly) correpondente a posição apontado
pelo registrador IP.
-u
0B52:0100 B80200
0B52:0103 BB0300
0B52:0106 B90400
0B52:0109 BA0500
0B52:010C 01D8
0B52:010E 01CB
0B52:0110 01D1
0B52:0112 83EA01
MOV
MOV
MOV
MOV
ADD
ADD
ADD
SUB
AX,0002
BX,0003
CX,0004
DX,0005
AX,BX
BX,CX
CX,DX
DX,+01
Utilizando o Debug
Código de Multiplicação
-a
0B52:0100 mov ax,7c4b
0B52:0103 mov bx, 0100
0B52:0106 mul bx
0B52:0108
-u
0B52:0100 B84B7C
0B52:0103 BB0001
0B52:0106 F7E3
MOV
MOV
MUL
AX,7C4B
BX,0100
BX
Utilizando o Debug
Código da Divisão
F:\>debug
-a
0B52:0100 mov dx,007c
0B52:0103 mov ax,4b12
0B52:0106 mov bx,0100
0B52:0109 div bx
0B52:010B
-u
0B52:0100 BA7C00
MOV DX,007C
0B52:0103 B8124B
MOV AX,4B12
0B52:0106 BB0001
MOV BX,0100
0B52:0109 F7F3
DIV BX
Utilizando o DEBUG
Uma interrupção é uma situação que ocorre quando o código que está sendo
executado atualmente é paralisado e um outro programa entra em execução.
Uma interrupção é provocado por hardware ou por software (pode ser o
programa que está sendo executado atualmente).
A geração de interrupção por software no DOS é realizada através da instrução
INT.
Utilizando o Debug
g – Esta opção faz com que o debug execute todos os comandos entre o valor
atual contido no registrador IP até encontrar a instrução de encerramento de
programa (int 20)
0BB7:0100 BA7C00
0BB7:0103 B8124B
0BB7:0106 BB0001
0BB7:0109 F7F3
0BB7:010B CD20
-r ip
IP 0100
:100
-g
MOV DX,007C
MOV AX,4B12
MOV BX,0100
DIV BX
INT 20 (instrução de encerramento de programa)
O programa terminou de forma normal
Utilizando o DEBUG
Imprimindo uma letra através da interrupção INT 21
-r ax
AX 0041
:200
-r dx
DX 0041
:41
-e 100
0B52:0100 CD.cd
-e 101
0B52:0101 21.21
-r
AX=0200 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0102 NV UP EI PL NZ NA PO NC
0B52:0102 005300
ADD [BP+DI+00],DL
SS:0000=CD
0B52:0102 005300
ADD [BP+DI+00],DL
SS:0000=CD
Utilizando o DOS
-r ip
IP 0102
:100
-g 102
A --------------- Caracter que foi impresso pelo DOS
AX=0241 BX=0000 CX=0000 DX=0041 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0B52 ES=0B52 SS=0B52 CS=0B52 IP=0102 NV UP EI PL NZ NA PO NC
0B52:0102 005300
ADD [BP+DI+00],DL
SS:0000=CD
-
Utilizando o DEBUG
Para salvar um programa feito no debug, seguir os seguintes passos.
1 - Digitar o programa (com a instrução INT 20)
2 - Verificar o tamanho do programa (em bytes)
3 - Dar um nome para o programa
4 - Colocar o tamanho do programa no registrador CX
5 - Zerar o registrador BX
6 - Gravar o arquivo
Utilizando o DEBUG
Passo 1- Escrever programa que imprime * na tela.
-a
0B52:0100 mov ah,02
0B52:0102 mov dl,2A
0B52:0104 int 21
0B52:0106 int 20
0B52:0108
-u 100
0B52:0100 B402
0B52:0102 B22A
0B52:0104 CD21
0B52:0106 CD20
MOV AH,02
MOV DL,2A
INT 21
INT 20
Passo 2.
O programa possui 8 bytes de tamanho
Utilizando o Debug
Passo 3
-N imp_letra.com
Passo 4/5/6
-N IMPLETRA.COM
-r bx
BX 0000
:0
-r cx
CX 0000
:8
-w
Gravando 00008 bytes
Utilizando DEBUG
IMPRIMINDO UM STRING.
A Interrupção INT 21 com o valor 02 no registrador AH imprime um caracter na
tela, com o valor 09 no mesmo registrador, a interrupção irá realizar a impressão
de uma string (conjunto de caracters) até encontrar o simbolo ´$´ cujo valor
decimal ASCII é 24h.
Devemos informar para a Interrupção INT 21 qual é o endereço de memória
onde inicia a string.
Utilizando o DEBUG
F:\>debug
-e 200
0B52:0200 4F.4f 6C.6c 6F.6f 2C.2c 20.20 44.44 4F.4f 53.53
0B52:0208 69.20 21.61 24.71 69.75 6F.21 5C.24
-a 100
0B52:0100 mov ah,09
0B52:0102 mov dx,0200
0B52:0105 int 21
0B52:0107 int 20
0B52:0109
0B52:0109
-g
Olo, DOS aqu!
O programa terminou de forma normal
Utilizando o DEBUG
-D 200
0B52:0200
0B52:0210
0B52:0220
0B52:0230
0B52:0240
0B52:0250
0B52:0260
0B52:0270
4F 6C 6F 2C 20 44 4F 53-20 61 71 75 21 24 56 43 Olo, DOS aqu!$VC
39 38 5C 61 74 6C 5C 69-6E 63 6C 75 64 65 3B 43 98\atl\include;C
3A 5C 41 72 71 75 69 76-6F 73 20 64 65 20 70 72 :\Arquivos de pr
6F 67 72 61 6D 61 73 5C-4D 69 63 72 6F 73 6F 66 ogramas\Microsof
74 20 56 69 73 75 61 6C-20 53 74 75 64 69 6F 5C t Visual Studio\
56 43 39 38 5C 6D 66 63-5C 69 6E 63 6C 75 64 65 VC98\mfc\include
3B 43 3A 5C 41 72 71 75-69 76 6F 73 20 64 65 20 ;C:\Arquivos de
70 72 6F 67 72 61 6D 61-73 5C 4D 69 63 72 6F 73 programas\Micros
Execução do Programa
‣ Para a execução de um programa são utilizados os registradores de
propósito geral e específicos.
‣ Registradores de propósito geral: AX, BX, CX, DX
Registradores de propósito especifico: CS, DS, IP, ES, SS
‣ Durante a execução dos programas, os registradores são alterados a cada
execução de instrução.
‣ O registrador IP aponta para o endereço da próxima instrução a ser
executada
CICLO DE UM PROGRAMA
PROGRAMAÇÃO
MEMÓRIA LÓGICA
‣ Durante o processo de compilação as variáveis são transformadas em
endereços.
‣ Uma tabela de simbolos guarda o endereço de cada variável.
‣ Constantes Strings são armazenadas na área de dados do programa.
‣ O endereçamento começa sempre no zero.
‣ Um contador é incrementado a cada nova variável.
‣ O plano de endereçamento utilizado durante a compilação é chamado
de endereçamento Lógico.
TITLE PROGRAMA MODELO
DOSSEG
.MODEL SMALL
.STACK 100H
.DATA
;------ Tamanho da Pilha -------
;--- Definicao de variaveis e constantes
HelloMessage DB 'Hello, world',13,10,'$'
var
DW
.CODE
;------ Codigo do programa
Main: ;------ Rotina Principal
;-- Inicia Registradores de Dados (DS) e Extra (ES)
MOV AX, @DATA
MOV DS, AX
MOV ES, AX
; ----- Corpo do Programa ----mov ah,9
;DOS print string function
mov dx,OFFSET HelloMessage ;point to "Hello, world"
int 21h
;display "Hello, world"
; ------ Encerramento do Programa ----FIM:
;
call clrscr
MOV AX, 4C00h
PROGRAMA EM DISCO
PROGRAMA EM MEMÓRIA RAM
Download

Execução de Programas