Professional Documents
Culture Documents
Regis Mainframe
example menu
MVS
Introducao
Comandos
Mensagens
Tasks de MVS
JES
Search
contact
O que Assembler?
Assembler conseguiu ser uma das minhas linguagens favoritas para trabalhar.
No que seja uma linhguagem fcil no incio, mas quando voc fica familiar com ela,
voc entende o quo lgica ela .
Introduo
Comandos
Mensagens
IMS
IMS Introduo
Ferramentas
Mensagens de IMS
Assembler uma linguagem de baixo nvel, que voc pode usar em seus programas
para acelerar tarefas lentas. Basicamente ela consite de sentenas que representam
instrues em linguagem de mquina, e, como ela est prxima ao cdigo de mquina,
ela rpida.
H muito tempo atrs, quando o 8086 apareceu (sim, existiam humanos na Terra nessa
poca:), programar no era uma tarefa fcil. Quando os primeiros computadores foram
desenvolvidos, a programao tinha que ser feita em cdigo de mquina, que _no_ era
uma tarefa fcil, e assim o Assembler nasceu.
CICS
Por que us-lo?
CICS Introduo
Mensagens
Comandos
DB2
DB2 Introduo
Mensagens
JOB
Introduo
JCL
Ferramentas de
Schedule
Como eu disse antes, Assembler veloz. Ele tambm permite a voc falar com a
mquina a nvel de hardware, e lhe d muito maior controle e flexibilidade sobre o PC.
Uma das outras vantagens do Assembler que ele permite a voc impressionar seus
amigos com pginas de cdigo aparentemente incompreensvel.
No est vendo eles aglomerados em volta de voc e impressionados/rindo de sua
nerdeza? :)
LIO 1 - Registradores
Quando voc est trabalhando com Assembler, voc tem que usar registradores.
Voc pode imagin-los como sendo vari veis j definidas para voc. Os mais comuns
esto listados abaixo:
AX - o acumulador. Compreende AH e AL, os bytes alto e baixo de AX. Comumente
usado em operaes matemticas e de E/S.
BX - a base. Compreende BH e BL. Comumente usado como uma base ou registrador
apontador.
Introduo
Autosys
Ca-7
Comandos de Ca-7
Control_M Mainframe
Control_M Desktop
Control_M Active Schedule
Jobmaster
OPC
http://regismain.wikidot.com/assembler
05/11/2014
ZEKE
Cdigos de Abend
FERRAMENTAS
DO SISTEMA
SDSF, ISPF, TSO e Dataset
IOF
SAM
SHUTDOWN e IPL
Introducao
Comandos e Procedimentos
HARDWARE
Tipos de Device
Configuracoes
Comandos
Mensagens
Tasks De Hardware
DASD Ref Codes
VTAM
Introduo
Tasks do VTAM
Mensagens
Comandos de VTAM
STORAGE
Storage
Mensagens Storage
HSM
Comandos HSM
VSAM
PRODUTOS CA
SEGURANA
Okay, ento voc j aprendeu sobre registradores, mas, como us-los, e como se
codifica em Assembler? Bem, primeiro voc precisa de algumas instrues. As seguintes
instrues podem ser usadas em todas as CPU's do 8086 para cima.
MOV <dest>, <valor> - MOVE. Esta instruo permite MOVER um valor para uma
posio na memria.
Ex.: MOV AX, 13h
Segurana
RACF
AUTOMAO
Isso deveria mover 13h (19 em decimal) para o registrador AX. Logo, se AX valia antes
0, ele agora seria 13h.
ISSO APENAS MOVE UM VALOR PARA UM REGISTRADOR, NO FAZ NADA MAIS.
Ex.: (Em Pascal) AX := $13;
Automao
INT <nmero> - INTERRUPO. Esta instruo gera uma interupo.
http://regismain.wikidot.com/assembler
2/22
05/11/2014
OUTRAS TASKS
DE SISTEMA
OUTRAS TASKS
MQ Series
MQ Series Introducao
MQ Series Comandos e
Mensagens
ASSEMBLER
Assembler
CONTADOR
Welcome page
SUB <dest> <valor> - SUBTRAI. Acho que d pra voc adivinhar o que isso faz.
Page tags
It seems you have no tags
attached to pages. To
attach a tag simply click
on the tags button at the
bottom of any page.
new page
edit this panel
http://regismain.wikidot.com/assembler
3/22
05/11/2014
End.
Ou: CALL F6E0h ; Chama subfuno em F6E0h
LOOP <rtulo/label> - Faz LOOPS (repetio) durante um certo tempo.
EG: MOV CX, 10h ; Isto o porque de CX ser
; chamado de registro CONTADOR.
; 10h = 16
@MyLabel:
; alguma coisa
; mais coisa
LOOP @MyLabel ; At que CX = 0
; Note: CX decrementado
; a cada vez. No decremente-o
; voc mesmo (DEC CX).
; ISSO DEVERIA SE REPETIR 16 vezes - i.e., 10 em hexadecimal.
LODSB - Carrega um byte
LODSW - Carrega uma word
STOSB - Armazena um byte
STOSW - Armazena uma word
Estas instrues so usadas para pr ou conseguir algo numa posio na memria. O
registrador DS:SI, (lembra que ns falamos sobre isso antes, sobre SI ser o ndice de
fonte?), aponta para a localizao de onde queremos obter os dados, e DS:DI aponta
para onde colocaremos informaes.
claro, no somos obrigados a usar DS - poderia ser ES por exemplo.
Meu procedimento PutPixel colocar um byte em ES:DI.
De qualquer modo, imagine que temos a seguinte configurao na memria:
Posio na memria 06 07 08 09 10 11 12
Valor 50 32 38 03 23 01 12
Quando ns usamos LODSB ou STOSB, ele retorna ou pega um nmero de AL.
Assim, se DS:SI apontava para 07 e executssemos uma instruo LODSB, AL seria
agora igual a 32.
Agora, se ns apontssemos DS:DI para 11, colocando, diria, 50 no registrador AL, e
executasse STOSB, ento teramos o seguinte resultado:
Posio na Memria 06 07 08 09 10 11 12
Valor 50 32 38 03 23 50 12
OBS.: Quando usamos LODSB/STOSB, usamos AL. Isto porque estaremos mexendo
com um nmero de 8 bits (um byte), apenas. Podemos
armazenar um nmero de 8 bits em AL, AH, ou AX, mas no podemos armazenar um
nmero de 16 bits em AH ou AL porque eles so
REGISTRADORES DE 8 BITS.
Como resultado, quando usarmos LODSW ou STOSW, ns devemos usar AX e no AL,
j que estaremos pegando/colocando um nmero de
16 bits.
MOVSB - Move um byte
MOVSW - Move uma word
Como exemplo vamos pegar um byte de DS:SI e mand-lo para ES:DI.
Em DS:SI:
http://regismain.wikidot.com/assembler
4/22
05/11/2014
Posio de Memria 06 07 08 09 10 11 12
Valor 50 32 38 03 23 50 12
Em ES:DI:
Posio de Memria 06 07 08 09 10 11 12
Valor 10 11 20 02 67 00 12
Se apontarmos DS:SI para a posio 07, apontarmos ES:SI para a posio 11 e
executarmos MOVSB, o resultado em ES:DI pareceria com:
Em ES:DI:
Posio de Memria 06 07 08 09 10 11 12
Valor 10 11 20 02 67 32 12
ESPERO QUE VOC PEGUE A IDIA GERAL. CONTUDO, CLARO, NO TO SIMPLES.
POSIES DE MEMRIA NO SO ARRUMADOAS EM FORMA DE ARRAY, EMBORA EU
DESEJASSE MUITO QUE FOSSEM. QUANDO FOR MOVER/PEGAR/COLOCAR, VOCE
ESTAR MEXENDO COM UMA POSIO TAL COMO: 100:102H. AINDA ASSIM, VOC
DEVERIA PEGAR A IDIA.
REP - REPETE o nmero de vezes especificado no registrador CX.
Um REP na frente de um MOVSB/LODSB/STOSB causaria a repetio da instruo.
Logo:
Se CX = 5, e se ES:DI apontava para 1000:1000h, ento REP STOSB armazenaria o que
estava no registrador AL na posio 1000:1000h 5 vezes.
De qualquer modo, no ltimo nmero eu disse que estaria discutindo sobre hexadecimal,
segmentos + offsets, mais algumas intrues e algumas procedures contendo assembler
que voc poderia realmente usar.
Ento, l vamos ns, com segmentos e offsets!
5/22
05/11/2014
hexadecimal.
A WORD - outra unidade comumente usada. Uma word um nmero de 16 bits, e
capaz de armazenar um nmero at 65535. Isso 1111111111111111 em binrio, e
FFFFh em hex.
Obs.: Por causa de uma word ser quatro nibbles, tambm representada por quatro
dgitos hexadecimais.
Obs.: Isto um nmero de 16 bits, e corresponde aos registradores de 16 bits. Ou seja,
AX, BX, CX, DX, DI, SI, BP, SP, DS, ES, SS e IP.
A DWORD, ou double word consiste de 2 words ou 4 bytes ou 8 nibbles ou 32 bits.
Voc no vai usar muito as double words nestes tutoriais, mas vamos mencion-las
mais tarde quando falarmos de PROGRAMAO EM 32 BITS.
Uma DWORD pode armazenar de 0 a 4,294,967,295, que FFFFFFFFh, ou
11111111111111111111111111111111. Espero que haja 32 um's l atrs.
A DWORD tambm o tamanho dos registradores extendiddos de 32 BITS, ou seja,
EAX, EBX, ECX, EDX, EDI, ESI, EBP, ESP e EIP.
O KILOBYTE, 1024 bytes, NO 1000 bytes. O kilobyte igual a 256 double-words,
512 words, 1024 bytes, 2048 nibbles ou 8192 BITS.
O MEGABYTE, ou 1024 kilobytes. Isso 1,048,576 bytes ou 8,388,608 bits.
Agora que j cobrimos a terminologia, vamos dar uma olhada mais de perto como
aqueles registradores so estruturados. Ns dissemos que AL e AH eram registradores
de 8 bits, logo, eles no deveriam se parecer com algo assim?
AH AL
Neste caso, ambos AH e AL = 0, OU 00h e 00h. Como resultado, para calcular AX
usamos: AX = 00h + 00h. Quando digo + eu quero dizer, 'ponha junto' no AX = AH
MAIS AL.
Assim, se AH era igual a 00000011 e AL era igual a 0000100, para calcular AX ns
devemos fazer o seguinte.
1) Pegue os valores hexadecimais de AH e AL.
00000011 = 03h 00010000 = 10h
2) Combine-os.
AX = AH + AL
AX = 03h + 10h
AX = 0310h
E a voc consegue o resultado. No to macetoso assim.
Okay, agora vamos ver os registradores de 16 bits:
AX
AH AL
De onde podemos ver que AX = 00000000 e 00000000, ou 0000000000000000.
Agora por ltimo, vejamos como um registrador de 32 bits se parece:
EAX
AX
AH AL
http://regismain.wikidot.com/assembler
6/22
05/11/2014
No muito difcil, espero. E se entendeu isso, voc est pronto para SEGMENTOS e
OFFSETS.
SEG OFS
Okay, aqui est a especificao:
Um OFFSET = SEGMENT X 16
Um SEGMENT = OFFSET / 16
Algums registradores de segmento so:
CS, DS, ES, SS e FS, GF - Obs.: Os ltimos 2 so registradores que s existem em 386
ou superiores.
Alguns registradores de offset so:
BX, DI, SI, BP, SP, IP - Obs.: Quando em modo protegido, voc pode usar qualquer
registrador de uso geral como um registrador de offset - EXCETO IP.
Alguns segmentos e offsets comuns so:
CS:IP - Endereo do cdigo executando no momento.
SS:SP - Endereo da posio atual da pilha.
OBS.: NO SE INTROMETA COM ELES !
Assim quando nos referirmos a segmentos e offsets, faremos dessa forma:
SEGMENTO:OFFSET
Um bom exemplo seria:
A000:0000 - que na verdade corresponde ao topo esquerdo da tela VGA em modo
colorido 320x200x256.
FATO ENGRAADO A RAM da VGA comea em A000h
Ufa! Isso foi muito para o segundo tutorial. Contudo, ainda no terminamos. Esse
negcio de AX, AH, AL um conceito que voc pode no ter sacado ainda, ento l
vamos ns:
MOV AX, 0 ; AX = 0
MOV AL, 0 ; AL = 0
MOV AH, 0 ; AH = 0
MOV AL, FFh ; AL = FFh
http://regismain.wikidot.com/assembler
7/22
05/11/2014
; AX = 00FFh
; AH = 00h
INC AX ; AX = AX + 1
; AX = 0100h
; AH = 01h
; AL = 00h
MOV AH, ABh ; AX = AB00h
; AH = ABh
; AL = 00h
-
A Pilha
A pilha uma caracterstica muito til de que podemos tirar vantagem. Pense nela como
uma pilha de papis numa bandeja de ENTRADA. Se voc pe algo no topo, ela ser a
primeira a ser tirada.
medida que voc adiciona algo pilha, o apontador de pilha DECREMENTADO, e
quando tira, INCREMENTADO.
E na prtica:
MOV AX, 03h ; AX = 03h
PUSH AX ; PUSH AX na pilha (coloca no topo)
MOV AX, 04Eh ; AX = 04Eh
; Faa alguma coisa uma soma?
POP AX ; AX = 03h
Ou:
MOV AX, 03h ; AX = 03h
PUSH AX ; Adiciona AX pilha
MOV AX, 04Eh ; AX = 04Eh
; Faa alguma coisa uma soma?
POP BX ; BX = 03h
Voc acabou de aprender duas instrues:
PUSH <registrador> - PUSH (coloca algo na pilha), e
POP <registrador> - POP (retira ele de volta).
tudo o que voc precisa de aprender sobre pilha - por enquanto.
Por ltimo, algumas procedures que demonstram algo disso tudo. Note que os
comentrios foram DELIBERADAMENTE REMOVIDOS. seu dever tentar coment-los.
Note tambm, que algumas novas instrues so introduzidas.
Procedure ClearScreen(A : Byte; Ch : Char); Assembler;
Asm { ClearScreen }
mov ax, 0B800h
mov es, ax
xor di, di
mov cx, 2000
mov ah, A
http://regismain.wikidot.com/assembler
8/22
05/11/2014
O que so flags?
As proceures acima com comentrios.
Um programa s em assembler. Voc vai precisar pelo menos do DEBUG, embora TASM
e TLINK sejam uma boa idia.
Bem-vindos ao terceiro tutorial da srie. No ltimo tutorial eu disse que estaramos
discutindo mais algumas instrues, flags e um verdadeiro programa em Assembly.
Durante este tutorial, voc achar os livros "Peter Norton's Guide to Assembler", "Peter
Norton's Guide to the VGA Card", ou qualquer
um dos livros "Peter Norton's Guide to" muito teis. Voc no pode programar em
Assembler sem saber pra que so todas as interrupes
e o que so todas as subfunes.
Eu lhe recomendo conseguir uma cpia desses livros assim que possvel.
Um Programa Assembly
http://regismain.wikidot.com/assembler
9/22
05/11/2014
10/22
05/11/2014
11/22
05/11/2014
12/22
05/11/2014
13/22
05/11/2014
Nota: H MUITO MAIS FLAGS PARA APRENDER. Eles sero vistos num Tutorial mais
frente.
Okay, no ltimo tutorial eu lhe dei algumas procedures, e pedi para voc coment-las.
Eu no queria uma explicao detalhada do que eles faziam - no se espera que voc
saiba isso ainda - apenas um sumrio do que cada comando faz.
Ex.:
MOV AX, 0003h ; AX agora igual a 03h;
ADD AX, 0004h ; AX agora igual a 07h;
Ento, aqui vai o conjunto completo das procedures com comentrios:
{ Esta procedure limpa a tela em modo texto }
Procedure ClearScreen(A : Byte; Ch : Char); Assembler;
Asm { ClearScreen }
mov ax, 0B800h { Move o endereo de vdeo para AX }
mov es, ax { Aponta ES para o segmento de vdeo }
xor di, di { Zera DI }
mov cx, 2000 { Move 2000 (80x25) para CX }
mov ah, A { Move o atributo para AH }
mov al, &Ch { Move o caracter a usar para AL }
rep stosw { Faz isso }
End; { ClearScreen }
Explicao:
Ns zeramos DI, logo igual a 0 - o canto esquerdo da tela. Isto de onde vamos
comear a encher a tela.
Movemos 2000 para CX porque vamos colocar 2000 caracteres na tela.
{ Esta procedure move o cursor para a posio X, Y }
Procedure CursorXY(X, Y : Word); Assembler;
Asm { CursorXY }
mov ax, Y { Move o valor Y para AX }
mov dh, al { Y vai para DH }
dec dh { rotina baseada em ajustar para zero }
mov ax, X { Move o valor de X para AX }
mov dl, al { X vai para DL }
dec dl { rotina baseada em ajustar para zero }
mov ah, 2 { Chama a funo correspondente }
xor bh, bh { Zera BH }
int 10h { faz isso (pe o cursor na posio) }
End; { CursorXY }
Explicao:
A ' rotina baseada em ajustar para zero' realizada porque a BIOS refere-se posio
(1, 1) como (0, 0), e igualmente (80, 25) como (79, 24).
Procedure PutPixel(X, Y : Integer; C : Byte; Adr : Word); Assembler;
Asm { PutPixel }
mov ax, [Adr] { Move o endereo do VGA em AX }
mov es, ax { Joga AX em ES }
mov bx, [X] { Move o valor de X para BX }
mov dx, [Y] { Move o valor de Y para DX }
xchg dh, dl { Daqui pra frente calcula o }
mov al, [C] { offset do pixel a ser plotado }
mov di, dx { e pe este valor em DI. Vamos }
http://regismain.wikidot.com/assembler
14/22
05/11/2014
ShiftS
Primeiramente porm, devemos terminar aquela coisa de CMP/JMP, e falar de shifts.
Quando se est programando em Assembler, a gente acha que comparaes, shifts e
testar bits so operaes muito comuns.
Um Exemplo de Comparao
Eu no vou perder tempo explicando minuciosamente o seguinte exemplo - ele muito
fcil de entender e voc deve pegar a idia basica seja l como for.
DOSSEG
.MODEL SMALL
.STACK 200h
.DATA
FirstString DB 13, 10, "Este um grande tutorial ou o qu? :) - $"
SecondString DB 13, 10, "NO? NO? O que voc quer dizer, NO?$"
ThirdString DB 13, 10, "Excelente, vamos ouvir voc dizer isso de novo.$"
FourthString DB 13, 10, "Apenas um Y ou N j basta.$"
ExitString DB 13, 10, "Bem, deixa pra l!$"
.CODE
START:
MOV AX, @DATA ; Novo modo de dizer:
MOV DS, AX ; DS -> SEG segmento de dados
KeepOnGoing:
MOV AH, 9
MOV DX, OFFSET FirstString ; DX -> OFFSET FirstString
INT 21h ; Escreve a primeira mensagem
http://regismain.wikidot.com/assembler
15/22
05/11/2014
16/22
05/11/2014
Nmero Binrio 1 1 0 0 1 1 0 1
76543210
Equivalente Decimal 2 2 2 2 2 2 2 2
Equivalente Decimal 128 64 32 16 8 4 2 1
Valor Decimal 128 + 64 + 0 + 0 + 8 + 4 + 0 + 1 = 205
Pegou a idia? Note que para a ltima linha, seria mais preciso escrever:
1 x 128 + 1 x 64 + 0 x 32 + 0 x 16 + 1 x 8 + 1 x 4 + 0 x 2 + 1 x 1
128 + 64 + 0 + 0 + 8 + 4 + 0 + 1
205
Desculpe se isto um pouco confuso, mas difcil explicar sem demonstrar.
Aqui vai outro exemplo:
Nmero Binrio 0 1 1 1 1 1 0 0
76543210
Equivalente Decimal 2 2 2 2 2 2 2 2
Equivalente Decimal 128 64 32 16 8 4 2 1
Valor Decimal 0 + 64 + 32 + 16 + 8 + 4 + 0 + 0 = 124
Obs.:
Voc pode usar esta tcnica com palavras de 16 ou 32 bits tambm, apenas faa do
jeito certo. Ex: Depois de 128, voc escreveria 256, depois 512, 1024 e assim por
diante.
Voc pode dizer se o equivalente decimal ser par ou mpar pelo primeiro bit. Ex.: No
exemplo acima, o primeiro bit = 0, ento o nmero PAR.
No primeiro exemplo, o primeiro bit 1, ento o nmero MPAR.
FATO ENGRAADO: Caso voc no saiba ainda, bit vem de Binary digIT.
CONVERTENDO DE DECIMAL PARA BINRIO:
Isso provavelmente mais fcil que da base-2 para base-10. Para calcular o que 321
seria em binrio, voc faria o seguinte:
321 = 256 X 1
321 - 256 = 65 = 128 X 0
65 = 64 X 1
65 - 64 = 1 = 32 X 0
1 = 16 X 0
1=8X0
1=4X0
1=2X0
1=1X1
E voc obteria o nmero binrio - 101000001. Fcil, n? Vamos tentar outro para ter
certeza que sabemos fazer:
198 = 128 X 1
198 - 128 = 70 = 64 X 1
70 - 64 = 6 = 32 X 0
6 = 16 X 0
6=8X0
6=4X1
6-4=2=2X1
2-2=0=1X0
E isto nos d - 11000110. Note como voc pode checar o primeiro dgito para ver se
voc conseguiu sua converso certa. Quando eu escrevi o primeiro exemplo, eu notei
que eu fiz um erro quando eu chequei o primeiro bit. No primeiro exemplo, eu consegui
0 - no muito bom para um nmero mpar.
http://regismain.wikidot.com/assembler
17/22
05/11/2014
http://regismain.wikidot.com/assembler
18/22
05/11/2014
241 / 16 = 15 (decimal) = Fh
241 - (16 x 15) = 1
1 / 1 = 1 (decimal) = 1h
Assim, eventualmente temos 7FF1h como resposta. Este no particularmente um bom
processo e requer alguma explicao.
1) Quando voc divide 32753 por 4096 voc consegue 7.9963379 No estamos
interessados no lixo .9963379, s pegamos o 7, j que 7 o maior nmero inteiro que
podemos usar.
2) O resto da operao acima 4081. Devemos agora realizar a mesma operao nisso,
mas com 256. Dividindo 4081 por 256 nos d
15.941406 Novamente, pegamos s o 15.
3) Agora temos um resto de 241. Dividindo isto por 16 nos d 15.0625. Pegamos o 15, e
calculamos o resto.
4) Nosso ltimo resto acontece que um. Dividindo isso por um chegamos a, voc
advinhou - um. VOC NO DEVERIA CONSEGUIR UMA RESPOSTA COM MUITAS CASAS
DECIMAIS AQUI. SE VOC TEM - VOC CALCULOU ERRADO.
um processo muito imundo, mas funciona. Eu no uso isso, exceto quando eu tenho
que usar - eu no sou maluco. Eu uso uma calculadora cientfica, ou a calculadora do
Windows <brrrrr> se eu precisar.
OK, agora que j lidamos com os clculos horripilantes, voc j est pronto para os
shifts. H geralmente 2 formas da instruo shift - SHL (shift left/esquerda) e SHR (shift
right/direita). Basicamente, tudo o que essas instrues fazem deslocar uma
expresso para a esquerda ou direita um certo nmero de bits. Sua principal vantagem
a habilidade de lhe deixar substituir multiplicaes lentas com shifts mais rpidos.
Voc vai achar que isso acelerar pra caramba os algoritmos de pixel/linhas/crculo.
Os PC's esto ficando cada vez mais rpidos a cada dia - um pouco rpido demais pro
meu gosto. De volta aos dias do XT - a multiplicao era realmente lenta - talvez
levando at 4 segundos para certas operaes. Hoje em dia isso no acontece assim,
mas uma boa idia otimizar seu cdigo.
Quando ns plotamos um pixel na tela, temos que encontar o offset do pixel a plotar.
Basicamente, o que fazemos multiplicar a posio Y por 320, somar a posio X, e
somar isso ao endereo A000h.
Assim basicamente, temos: A000:Yx320+X
Agora, seja l quo rpido seu maravilhoso 486 ou Pentium , isso poderia se feito um
pouco mais rpido. Vamos reescrever aquela equao
acima, assim, vamos usar alguns nmeros diferentes:
86
Offset = Y x 2 + Y x 2 + X
Ou:
Offset = Y x 256 + y x 64 + X
Reconhece esses nmeros? Eles parecem terrivelmente com aqueles que ns vimos
naquela tabela de converso binrio-decimal.
Contudo, ns ainda estamos usando multiplicao.
Como podemos incorporar shifts?
Que tal:
Offset = Y SHL 8 + Y SHL 6 + X
Agora, isso _muito_ mais rpido, j que tudo o que o computador tem que fazer um
shift esquerda com o nmero - muito melhor.
http://regismain.wikidot.com/assembler
19/22
05/11/2014
Note que o shift esquerda AUMENTA o nmero, e o shift direita DIMINUI o nmero.
Aqui est um exemplo que pode te ajudar se voc ainda est em dvida no que est
acontecendo. Digamos que estamos trabalhando em base-10 - decimal. Agora
Peguemos o nmero 36 como exemplo. "Shiftando" este nmero esquerda de 1,
temos:
36 + 36 = 72
Agora SHL 2:
36 + 36 + 36 + 36 = 144
E SHL 3:
36 + 36 + 36 + 36 + 36 + 36 + 36 + 36 = 288
Notou os neros que se formaram? Havia 2 36's com SHL 1, 4 36's com SHL 2 e 8 36's
com SHL 3. Seguindo este padro, seria justo assumir que 36 SHL 4 equivaler a 36 x
16.
Note porm, o que est realmente acontecendo. Se voc fosse trabalhar com o valor
binrio de 36, que mais ou menos isso: 100100, e ento shiftasse 36 esquerda de 2,
voc teria 144, ou 10010000. Tudo o que a CPU faz na verdade colocar alguns 1's e 0's
extras na posio de memria.
Como outro exemplo, pegue o nmero binrio 1000101. Se fizermos um shift esquerda
de 3, terminaramos com:
1000101
<-- SHL 3
1000101000
Agora vamos deslocar o nmero 45 DIREITA de 2 unidades. Em binrio isso 101101.
De onde:
101101
SHR 2 >
1011
Notou o que ocorreu? muito mais fcil para a CPU apenas mover alguns bits
(aproximadamente 2 unidades de clock), do que multiplicar um nmero. (Pode demorar
at 133 unidades de clock).
Ns vamos usar bastante shifts quando estivermos programando a VGA, assim, tenha
certeza de que voc entendeu os conceitos por trs disso.
20/22
05/11/2014
seriamente embaraante para scroll e page-flipping. ns vamos cobrir mais tarde estes
assuntos, como entrar em seus prprios modos - e modo X que evitar esses
problemas.
Ento, como entrar no modo padro 13h?
A resposta simples. Usamos a interrupo 10h - interrupo de vdeo, e chamamos a
subfuno 00h - seleciona o modo. Em Pascal, voc poderia declarar uma procedure
como esta:
Procedure Init300x200; Assembler;
Asm { Init300x200 }
mov ah, 00h { Acerta o modo de vdeo }
mov al, 13h { Usa o modo 13h }
int 10h { Faz isso }
End; { Init300x200 }
voc tambm pode ver:
mov ax, 13h
int 10h
Isso perfeitamente correto, e provavelmente economiza um tempo de clock por no
colocar 00h em AH e ento 13h em AL, mas mais correto usar o primeiro exemplo.
OK, ento estamos no modo 13h, mas o que podemos realmente fazer nele, alm de
olhar para uma tela em branco? Poderamos voltar ao modo texto usando:
mov ah, 00h
mov al, 03h
int 10h
Mas isso um pouco idiota. Porque no pintar um pixel?
H inmeros modos de colocar um pixel na tela. O modo mais fcil em Assembler usar
interrupes. Voc faria mais ou menos assim em Pascal:
Procedure PutPixel(X, Y : Integer; Color : Byte); Assembler;
Asm { PutPixel }
mov ah, 0Ch { subfuno de desenhar pixel }
mov al, [Color] { Move a cor a plotar para AL }
mov cx, [X] { Move o valor X para CX }
mov dx, [Y] { Move o valor Y para DX }
mov bx, 1h { BX = 1, p gina 1 }
int 10h { Plota }
End; { PutPixel }
Contudo, mesmo isso sendo em Assembler, no particularmente rpido. Por qu?,
voc pergunta. Porque isso usa interrupo. Interrupes so timas para entar e sair
de modos de vdeo, ligar e desligar o cursor, etc mas no para grficos.
Voc pode imaginar interrupes como uma secretria eletrnica. "A CPU est ocupada
neste momento, mas se voc deixar sua subfuno aps o sinal - ns entraremos em
contato."
No bom. Vamos usar a tcnica que discutimos anteriormente durante shifts. O que
queremos fazer botar o valor da cor que desejamor plotar na VGA diretamente. Para
fazer isso, precisamos mover o endereo da VGA para ES, e calcular o offset do pixel
que queremos plotar. Um exemplo disso mostrado abaixo:
Procedure PutPixel(X, Y : Integer; Color : Byte); Assembler;
Asm { PutPixel }
mov ax, 0A000h { Move o segmento da VGA para AX, }
http://regismain.wikidot.com/assembler
21/22
05/11/2014
Fonte : http://www.saladoprogramador.hpg.ig.com.br/assembler1.htm
page revision: 4, last edited: 21 Mar 2011, 01:13 (1325 days ago)
Edit
Powered by Wikidot.com
Tags
History
Files
Site tools
+ Options
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License
Maegica Wiki
SCP
Roboticspedia
http://regismain.wikidot.com/assembler
22/22