Principais funções assemby:
þ ADC <DEST>, <FONTE> - Nome: Soma com Vai-Um
Tipo: 8086+
Descrição: Esta instrução soma <FONTE>
e <DEST> e soma o valor armazenado no
flag de vai-um, que será um ou zero,
a <DEST> também.
Basicamente, DEST = DEST + FONTE + CF
EX.: ADD AX, BX
þ ADD <DEST>, <FONTE> - Nome: Add
Tipo: 8086+
Descrição: Esta instrução soma <FONTE>
e <DEST>, armazenando o resultado em
<DEST>.
EX.: ADD AX, BX
þ AND <DEST>, <FONTE> - Nome: E Lógico
Tipo: 8086+
Descrição: Esta instrução realiza uma
comparação bit a bit de <DEST> e
<FONTE>, armazenando o resultado em
<DEST>.
EX.: AND 0, 0 = 0
AND 0, 1 = 0
AND 1, 0 = 0
AND 1, 1 = 1
þ BT <DEST>, <BIT NUMBER> - Nome: Testa Bit
Tipo: 80386+
Descrição: Esta instrução testa
<BIT NUMBER> de <DEST> que pode
ser um registrador de 16 ou 32 bits ou
posição da memória. Se <DEST> é um
número de 16 bits então o <BIT NUMBER> pode
ser de 0 a 15, senão, se <DEST> é um
número de 32 bits, então o <BIT NUMBER>
pode ter um valor de 0 a 31.
O valor em <BIT NUMBER> de <DEST> é
então copiado para o flag de vai-um.
EX.: BT AX, 3
JC EraIgualAUm
þ CALL <DEST> - Nome: Chama Procedimento
Tipo: 8086+
Descrição: Esta instrução simplesmente
chama uma subrotina. Em termos mais
técnicos, ela põe o endereço da próxima
instrução, IP, na pilha, e seta IP, o
registro de instruções, para o valor
especificado por <DEST>.
EX.: CALL MyProc
þ CBW - Nome: Converte Byte para Word
Tipo: 8086+
Descrição: Esta instrução extende o
byte em AL para AX.
EX.: MOV AL, 01h
CBW
ADD BX, AX ; Faz algo com AX
þ CLC - Nome: Limpa Flag de Vai-Um
Tipo: 8086+
Descrição: Esta instrução zera o flag
de vai-um no registrador de flags.
EX.: CLC
þ CLD - Nome: Limpa Flag de Direção
Tipo: 8086+
Descrição: Esta instrução limpa o
flag de direção no registrador de flags
para 0. Quando o flag de direção é 0,
qualquer instrução de strings incrementa
os registradores de índice SI e DI.
EX.: CLD
þ CLI - Nome: limpa Flag de Interrupção
Tipo: 8086+
Descrição: Esta instrução limpa o flag de
interrupção no registrador de flags para
0, assim desabilitando interrupções de
hardware.
EX.: CLI
þ CMC - Nome: Complementa o Flag de Vai-Um
Tipo: 8086+
Descrição: Esta instrução checa o valor
atual no flag de vai-um.
Se for 0 - transforma em 1 e se for
1 - passa a ser 0.
EX.: BT AX, 1 ; Testa o bit 1 de AX
JC EraUm
JMP Fim
EraUm:
CMC ; Retorna CF para 0
Fim:
þ CMP <VALOR1>, <VALOR2> - Nome: Comparação Inteira
Tipo: 8086+
Descrição: Esta instrução compara
<VALOR1> e <VALOR2> e reflete a comparação
nos flags.
EX.: CMP AX, BX
Veja também as intruções Jcc.
þ CWD - Nome: Converte Word para Doubleword
Tipo: 8086+
Descrição: Esta instrução extende a
word em AX para o par DX:AX.
EX.: CWD
þ DEC <VALOR> - Nome: Decrementa
Tipo: 8086+
Descrição: Esta instrução subtrai
um do valor em <VALOR> e armazena
o resultado em <VALOR>.
EX.: DEC AX
þ DIV <VALOR> - Nome: Divisão sem Sinal
Tipo: 8086+
Descrição: Esta instrução divide
<VALOR> por, ou AX para byte, DX:AX para
word ou EDX:EAX para doubleword.
Para byte, o quociente é retornado em
AL e o resto em AH, para word o
quociente é retornado em AX e o
resto em DX e para DWORD, o
quociente volta em EAX e o
resto em EDX.
EX.: MOV AX, 12
MOV BH, 5
DIV BH
MOV Quociente, AL
MOV Resto, AH
þ IN <ACUMULADOR>, <PORTA> - Nome: Entrada de porta de E/S
Tipo: 8086+
Descrição: Esta instrução lê um valor
de uma das 65536 portas de hardware
especificada no <ACUMULADOR>.
AX e AL são comumente usados para portas
de entrada, e DX é comumente usado para
identificar a porta.
EX.: IN AX, 72h
MOV DX, 3C7h
IN AL, DX
þ INC <VALOR> - Nome: Incrementa
Tipo: 8086+
Descrição: Esta instrução soma um ao
número em <VALOR>, e armazena
o resultado em <VALOR>.
EX.: MOV AX, 13h ; AX = 13h
INC AX ; AX = 14h
þ INT <INTERRUPÇÃO> - Nome: Gera uma Interrupção
Tipo: 8086+
Descrição: Esta instrução salva os valores
correntes dos flags e IP na pilha, e então
chama a <INTERRUPÇÃO> baseada no valor de
AH.
EX.: MOV AH, 00h ; Seta o modo de
; vídeo
MOV AL, 13h ; Modo 13h
INT 10h ; Gera interrupção
þ Jcc - Nome: Pula (Jump) se Condição
Tipo: 8086+
Eu não vou repetir eu mesmo todos os 32, dê uma olhada no Tutorial Três
a lista completa deles. Tenha em mente que seria uma boa idéia chamar
CMP, OR, DEC ou algo semelhante antes de usar uma dessas instruções. :)
EX.: DEC AX
JZ AX_Chegou_A_Zero
þ JMP <DEST> - Nome: Jump
Tipo: 8086+
Descrição: Esta instrução simplesmente
carrega um novo valor, <DEST>, em IP,
assim transferindo o controle para outra
parte do código.
EX.: JMP MyLabel
þ LAHF - Nome: Carega AH com Flags
Tipo: 8086+
Descrição: Esta instrução copia os
bytes mais baixos do registrador de flags
para AH. O conteúdo de AH vai parecer
com algo semeelhante depois que
a instrução for executada:
ÚõõõõõõÂõõõõÂõõõõÂõõõõÂõõõõÂõõõõÂõõõõÂõõõõÂõõõõ¿
³ Flag ³ SF ³ ZF ³ -- ³ AF ³ -- ³ PF ³ -- ³ CF ³
ÃõõõõõõÕõõõõÕõõõõÕõõõõÕõõõõÕõõõõÕõõõõÕõõõõÕõõõõ´
³ Bit ³ 07 ³ 06 ³ 05 ³ 04 ³ 03 ³ 02 ³ 01 ³ 00 ³
ÀõõõõõõÁõõõõÁõõõõÁõõõõÁõõõõÁõõõõÁõõõõÁõõõõÁõõõõÙ
Você pode agora testar os bits individualmente, ou realizar
uma instrução similar à seguinte para pegar um flag apenas:
EG: LAHF
SHR AH, 6
AND AH, 1 ; AH contém o flag ZF.
þ LEA <DEST>, <FONTE> - Nome: Carrega Endereço Efetivo
Tipo: 8086+
Descrição: Esta instrução carrega o
endreço de memória que <FONTE> significa,
em <DEST>.
EX.: eu uso LEA SI, Str numa das minhas
procedures que pões uma string na
tela bem rápido.
þ LOOP <LABEL> - Nome: Decrementa CX e Repete
Tipo: 8086+
Descrição: Esta instrução é uma forma
do loop For...Do que existe na maioria
das linguagens de alto nível. Basicamente
ele volta ao label, ou segmento de memória
até que CX = 0.
EX.: MOV CX, 12
FazAlgumaCoisa:
;...
;...
;... Isto será repetido 12 vezes
LOOP FazAlgumaCoisa
þ Lseg <DEST>, <FONTE> - Nome: Carega Registrador de Segmento
Tipo: 8086+
Descrição: Esta instrução existe de
várias formas. Todas aceitam mesma
sintaxe, em que <FONTE> especifica um
ponteiro de 48 bits, consistindo de um
offset de 32 bits e um seletor de 16 bit.
O offset de 32 bis é caregado em
<DEST>, e o seletor é carregado no
registrador de segmento especificado por
seg.
As seguintes formas existem:
LDS
LES
LFS * 32 bits
LGS * 32 bits
LSS
EX.: LES SI, Um_Ponteiro
þ MOV <DEST>, <FONTE> - Nome: Move Dados
Tipo: 8086+
Descrição: Esta instrução copia
<FONTE> em <DEST>.
EX.: MOV AX, 3Eh
MOV SI, 12h
þ MUL <FONTE> - Nome: Multiplicação sem Sinal
Tipo: 8086+
Descrição: Esta instrução multiplica
<FONTE> pelo acumulador, que depende
do tamanho de <FONTE>.
Se <FONTE> é um byte então:
* AL é o multiplicando;
* AX é o produto.
Se <FONTE> é uma word então:
* AX é o multiplicando;
* DX:AX é o produto.
Se <FONTE> é uma doubleword então:
* EAX é o multiplicando;
* EDX:EAX é o produto.
OBS.: Os flags são inalterados
excetos para OF e CF, que são
zerados se o byte alto, word ou
dword do produto for 0.
EX.: MOV AL, 3
MUL 10
MOV Resultado, AX
þ NEG <VALOR> - Nome: Nega
Tipo: 8086+
Descrição: Esta instrução subtrai
<VALOR> de 0, resultando na negação
do complemento a dois de <VALOR>.
EX.: MOV AX, 03h
NEG AX ; AX = -3
þ NOT <VALOR> - Nome: Complemento Lógico
Tipo: 8086+
Descrição: Esta instrução inverte o
estado de cada bit no operando.
EX.: NOT CX
þ OR <DEST>, <FONTE> - Nome: OU Lógico
Tipo: 8086+
Descrição: Esta instrução realiza uma
operação de OU booleano entre cada bit de
<DEST> e <FONTE>, guardando o resultado
em <DEST>.
EX.: OR 0, 0 = 0
OR 0, 1 = 1
OR 1, 0 = 1
OR 1, 1 = 1
þ OUT <PORTA>, <ACUMULADOR> - Nome: Saída para a Porta
Tipo: 8086+
Descrição: Esta instrução manda para a
saída o valor do acumulador para <PORTA>.
Usando o registrador DX para pasar a porta
OUT, você pode acessar 65,536 portas.
EX.: MOV DX, 378h
OUT DX, AX
þ POP <REGISTRADOR> - Nome: Carega Registrador da pilha
Tipo: 8086+
Descrição: Esta instrução pega o valor
atual do topo da pilha e coloca no
<REGISTRADOR>.
EX.: POP AX
þ POPA - Nome: Pega Todos os Registradores Gerais
Tipo: 80186+
Descrição: Esta instrução pega todos os
registradores de uso geral de 16 bits
da pilha, exceto SP.
É o mesmo que:
POP AX
POP BX
POP CX
...
EX.: POPA
þ POPF - Nome: Pega o valor do topo para Flags
Tipo: 8086+
Descrição: Esta instrução pega o
byte baixo dos flags da pilha.
EX.: POPF
þ PUSH <REGISTRADOR> - Nome: Põe na Pilha o Registrador
Tipo: 8086+
Descrição: Esta instrução põe
<REGISTRADOR> na pilha.
EX.: PUSH AX
þ PUSHA - Nome: Põe todos os registradores na pilha
Tipo: 80186+
Descrição: Esta instrução põe todos os
registradores de uso geral de 16 bits
na pilha.
É o mesmo que:
PUSH AX
PUSH BX
PUSH CX
...
EX.: PUSHA
þ PUSHF - Nome: Põe flags na pilha
Tipo: 8086+
Descrição: Esta instrução põe o
byte baixo dos flags na pilha.
EX.: PUSHF
þ REP - Nome: Sufixo de Repetição
Tipo: 8086+
Descrição: Esta instrução repetirá
a intrução seguinte o número de vezes
especificado em CX.
EX.: MOV CX, 6
REP STOSB ; Armazena 6 bytes
þ RET - Nome: Retorno de Subrotina (Near/próximo)
Tipo: 8086+
Descrição: Esta instrução retorna IP
ao valor que ele tinha antes da última
instrução CALL. RET, ou RETF para um
jump distante (far), deve ser chamado
quando se usa assembler puro.
EX.: RET
þ ROL <DEST>, <VALOR> - Nome: Roda à esquerda
Type: 8086+
Descrição: Esta instrução roda
<DEST> <VALOR> vezes. Uma rodada é
realizada shiftando <DEST> uma vez, então
transfere-se o bit que saiu para
a posição de mais baixa ordem de <DEST>.
EX.: ROL AX, 3
þ ROR <DEST>, <VALOR> - Nome: Roda à Direita
Tipo: 8086+
Descrição: Esta instrução roda
<DEST> <VALOR> vezes. Uma rodada é
realizada shiftando <DEST> uma vez, então
transfere-se o bit que saiu para
a posição de mais alta ordem de <DEST>.
EX.: ROR BX, 5
þ SAHF - Nome: Armazena AH nos Flags
Tipo: 8086+
Descrição: Esta instrução carrega o
conteúdo do registrador AH nos bits
7, 6, 4, 2 e 0 do registrador de flags.
EX.: SAHF
þ SBB <DEST>, <FONTE> - Nome: Subtrai com "pede-emprestado"
Tipo: 8086+
Descrição: Esta instrução subtrai
<FONTE> de <DEST>, e decrementa
<DEST> de uma unidade de o flag de vai-um
estiver setado, armazenando o resultado
em <DEST>.
Basicamemte, <DEST> = <DEST> - <FONTE> - CF
EX.: SBB AX, BX
þ SHL <DEST>, <VALOR> - Nome: Shift à esquerda
Tipo: 8086+
Descrição: Esta instrução desloca <DEST>
à esquerda de <VALUE> unidades.
Eu não vou entrar em detalhes
sobre a teoria disso de novo.
Se você não tem certeza do que esta
instrução faz, por favor, leia o Tutorial
Quatro.
EX.: SHL AX, 5
þ SHR <DEST>, <VALOR> - Name: Shift à direita
Type: 8086+
Descrição: Esta instrução desloca <DEST>
à direita de <VALUE> unidades. Por favor
veja o Tutorial Quatro para a teoria dos
shifts.
EX.: SHR DX, 1
þ STC - Nome: Seta o flag de vai-um (Carry Flag)
Tipo: 8086+
Descrição: Esta instrução seta o valor
do carry flag para um.
EX.: STC
þ STD - Nome: Seta o flag de direção
Tipo: 8086+
Descrição: Esta instrução seta o
valor do flag de direção para um. Isto
instrui a todas operações a decrementar
os registradores de índice.
EX.: STD
REP STOSB ; DI está sendo
; decrementado
þ STI - Nome: Seta Flag de Interrupção
Tipo: 8086+
Descrição: Esta instrução seta o
valor do flag de interrupção para um, assim
permitindo que interrupções de hardware
ocorram.
EX.: CLI ; Pára interrupções
... ; Realiza uma função crucial
STI ; Habilita interrupções
þ STOS - Nome: Armazena String
Tipo: 8086+
Descrição: Esta instrução existe nas
seguintes formas:
STOSB - Armazena um byte - AL
STOSW - Armazena uma word - AX
STOSD - Armazena uma doubleword - EAX
As instruções escrevem o conteúdo atual
do acumulador para a posição de memória
apontada por ES:DI. Então ela incrementa
ou decrementa DI de acordo com o operando
usado, e o valor do flag de direção.
Ex.: MOV AX, 0A000h
MOV ES, AX
MOV AL, 03h
MOV DI, 0
STOSB ; Armazena 03 em ES:DI,
; que é o topo da tela
; em modo 13h
þ SUB <DEST>, <FONTE> - Nome: Subtração
Tipo: 8086+
Descrição: Esta instrução subtrai
<FONTE> de <DEST>, armazenando o resultado
em <DEST>.
EX.: SUB ECX, 12
þ TEST <DEST>, <FONTE> - Nome: Testa Bits
Tipo: 8086+
Descrição: Esta instrução realiza uma
operação AND bit-a-bit em <FONTE> e
<DEST>. O resultado refflete nos flags,
e eles são são setados como se fizéssemos
um AND.
EX.: TEST AL, 0Fh ; Checa se algum
; bits está setado
; no mais baixo
; nibble de AL
þ XCHG <VALOR1>, <VALOR2> - Nome: Troca
Tipo: 8086+
Descrição: Esta instrução troca os
valores de <VALOR1> e <VALOR2>.
EX.: XCHG AX, BX
þ XOR <DEST>, <FONTE> - Nome: OU Exclusivo Lógico
Tipo: 8086+
Descrição: Esta instrução realiza
um OU exclusivo bit-a-bit em
<FONTE> e <DEST>. A operação é
definida como segue:
XOR 0, 0 = 0
XOR 0, 1 = 1
XOR 1, 0 = 1
XOR 1, 1 = 0
EX.: XOR AX, BX