ASM – Tutorial 1 – Adam Hyde | Krull's HomePage
Como eu disse antes, Assembler é veloz. Ele também permite a você falar com a máquina a nível 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 páginas de código aparentemente incompreensível. Não está vendo eles aglomerados em volta de você e impressionados/rindo de sua nerdeza? 🙂
LIÇÃO 1 – Registradores
AX – o acumulador. Compreende AH e AL, os bytes alto e baixo de AX. Comumente usado em operações matemáticas e de E/S.
BX – a base. Compreende BH e BL. Comumente usado como uma base ou registrador apontador.
CX – o contador. Compreende CH e CL. Usado frequentemente em loops.
DX – o deslocamento, similar ao registrador de base. Compreende DH e DL. Acho que você está pegando o espírito da coisa agora.
Os registradores de segmento: – ta da!
CS – o segmento de código. O bloco de mem¢ria onde o código ' armazenado. NÃO brinque com esse, a menos que saiba o que está fazendo.
DS – o segmento de dados. A área na memória onde os dados são armazenados. Durante operações de bloco, quando grandes blocos de dados são movidos, este é o segmento a que a CPU comumente se refere.
ES – o segmento extra. Apenas outro segmento de dados, mas este é comumente usado quando se quer acessar o vídeo.
SS – não, não é o exército alemão. É o segmento de pilha, em que a CPU armazena endere‡os de retorno de subrotinas. Tome cuidado com ele. 🙂
SI – o índice de fonte. Frequentemente usado para movimentações de blocos de instruções. Este é um ponteiro que, com um segmento, geralmente DS, é usado pela CPU para leitura.
DI – o índice de destino. Novamente, você o usará muito. Um outro ponteiro que, com um segmento, geralmente ES, é usado para escrita pela CPU.
BP – o apontador da base, usado em conjunto com o segmento de pilha. Nós não vamos usá-lo muito.
SP – o apontador da pilha, comumente usado com o segmento de pilha. NÃO brinque com isso de jeito nenhum.
2) Arrumar uma calculadora que suporte hexadecimal – ou pelo menos uma
tabela ASCII. Isso cobre 0 – 255, ou, de 0h a FFh.
LIÇÃO 2 – O conjunto de instruções do 8086:
Okay, então você já aprendeu sobre registradores, mas, como usá-los, e como se codifica em Assembler? Bem, primeiro você precisa de algumas instruções. As seguintes instruções podem ser usadas em todas as CPU's do 8086 para cima. (by Renato – da mesma família 80×86, né? Não tente fazer num PowerPC que não vai rodar.)
MOV <dest>, <valor> – MOVE. Esta instrução permite MOVER um valor para uma posição na mem¢ria.
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, NÃO FAZ NADA MAIS.
INT <número> – INTERRUPÇÃO. Esta instrução gera uma interupção.
AH seria igual a 00 – seleciona a subfunção do
AL seria igual a 13h – modo gráfico 320x200x256.
NÃO SE PREOCUPE COM ISSO POR ENQUANTO! NÓS FALAREMOS NISSO MAIS TARDE, COM MAIS DETALHES.
ADD <dest> <valor> – ADICIONA. Esta instrução soma um número ao valor
SUB <dest> <valor> – SUBTRAI. Acho que dá pra você adivinhar o que isso
DEC <registrador> – DECREMENTA algo.
INC <registrador> – INCREMENTA algo.
Ex: MOV AX, 13h ; Adivinha…
JMP <posição> – PULA para uma posição.
NÃO SE PREOCUPE SE ISTO É UM POUCO CONFUSO – VAI FICAR PIOR! HÁ OUTRAS 28 INSTRUÇÕES JUMP PARA APRENDER, TALVEZ MAIS. FALAREMOS NELAS MAIS TARDE.
CALL <procedimento> – CHAMA uma subfunção.
Ex: Procedure MyProc;
Begin    { MyProc }
End;     { MyProc }
Begin    { Main }
CALL MyProc   ; Adivinha o que isso faz!
LOOP <rótulo/label> – Faz LOOPS (repetição) durante um certo tempo.
Ex: MOV CX, 10h
;É por isso que o CX é
;chamado de registro CONTADOR.
;10h = 16
LOOP @MyLabel
; Até que CX = 0
; ISSO DEVERIA SE REPETIR 16 vezes – ou seja, "10" em hexadecimal.
LODSB – Carrega um byte
LODSW – Carrega uma word
STOSB – Armazena um byte
STOSW – Armazena uma word
Estas instruções são usadas para colocar ou obter algo em/de uma posição na memória. O registrador DS:SI, (lembra que nós falamos sobre isso antes, sobre SI ser o índice de fonte?), aponta para a localização de onde queremos obter os dados, e DS:DI aponta para onde colocaremos informações.
É claro, não somos obrigados a usar DS – poderia ser o ES por exemplo. Meu procedimento PutPixel colocará um byte em ES:DI.
MOVSB – Move um byte
MOVSW – Move uma word
ESPERO QUE VOCÊ PEGUE A IDÉIA GERAL. CONTUDO, É CLARO, NÃO É TÃO SIMPLES. POSIÇÕES DE MEMÓRIA NÃO SÃO ARRUMADAS EM FORMA DE ARRAY, EMBORA EU DESEJASSE MUITO QUE FOSSEM. QUANDO FOR MOVER/PEGAR/COLOCAR, VOCE ESTARÁ MEXENDO COM UMA POSIÇÃO TAL COMO: 100:102H. AINDA ASSIM, VOCÊ DEVERIA PEGAR A IDÉIA.
REP – REPETE o número de vezes especificado no registrador CX.
então "REP STOSB" armazenaria o que está no registrador AL na posição 1000:1000h 5 vezes.
Memorizar todas as instruções acima – não é tão difícil assim e não há tantas lá.
Ter certeza que você entendeu a teoria que há por detrás delas.
Hexadecimal, e o que é isso.
Segmentos e offsets (deslocamentos) – nós falamos nisso nesse tutorial.
Alguns programas de exemplo, e código-fonte que você pode usar em seus programas.
– Adam. "Essa noite não, querida – eu tenho um modem."
2 thoughts on "ASM – Tutorial 1 – Adam Hyde"
Pingback: Krull's HomePage » Blog Archive » Tutorial 1 ASM (renovado)
Vanderlei Lino disse:
Parabéns por este trabalho. Estou acompanhando os tutoriais e dando os primeiros passos em Assembler! Grato.