Escolar Documentos
Profissional Documentos
Cultura Documentos
AT&T
By MØRPHUS
ASSEMBLY AT&T
Existe um conceito a ser definido muito importante para se trabalhar com esta linguagem:
Os registradores.
EAX 32 BITS
----------------------------------------------
AX 16 BITS
0----8---------0------8 bits
AH AL
%EBX – Registrador base, 32 bits. Que se divide em BX de 16 bits, que se divide em parte
alta (BH) e parte baixa (BL).
EBX 32 BITS
----------------------------------------------
BX 16 BITS
0----8---------0------8 bits
BH BL
ECX 32 BITS
----------------------------------------------
CX 16 BITS
0----8---------0------8 bits
CH CL
EDX 32 BITS
----------------------------------------------
DX 16 BITS
0----8---------0------8 bits
DH DL
Exemplo: Se AX contém B0C5, então AH conterá B0 e AL conterá C5 respectivamente.
Registradores de segmento:
Outros registradores
%EBP – O apontador da base, usado juntamente com o segmento de pilha (SS), permite
acesso de dados do segmento da pilha.
Flags
Flags são indicadores de estado utilizados geralmente para testes condicionais em certas
operações, assim como saltos condicionais.
Alguns flags:
AC - Checagem de Alinhamento
VM - Modo Virtual 8086
RF - Flag de Continuação
NT - Flag de Tarefa Aninhada
IOPL - Nível de Privilégio de E/S
Tem um valor de 0,1,2 ou 3 logo ocupa 2 bits
OF - Flag de Overflow
Este bit é setado para UM se uma instrução aritmética gerar um
resultado que é muito grande ou muito pequeno para caber no
registrador destino.
DF - Flag de Direção
Quando setado para ZERO, as instruções de string, como MOVS, LODS,
e STOS incrementarão o endereço de memória que elas estão
trabalhando de uma unidade.
TF - Flag de Trap
Quando este bit estiver setado, uma interrupção ocorrerá imediatamente depois que a
próxima instrução executar. Isto é geralmente usado em depurações.
SF - Flag de Sinal
Este bit é mudado após operações aritméticas. O bit recebe o bit de mais alta ordem do
resultado, e se setado para UM, indica que o resultado da operação foi negativo.
ZF - Flag de Zero
Este bit é setado quando instruções aritméticas geram um resultado zero.
CF - Flag de Vai-Um
Este bit é setado quando o resultado de uma operação aritmética é muito grande ou muito
pequena para o registrador destino ou endereço de memória.
Nomenclaturas importantes:
Segmento = OFFSET / 16
Offset = Segmento * 16
Registradores de offset são: EBX, EDI, ESI, EBP, ESP, EIP. Se estiver em modo protegido,
pode ser utilizado qualquer registrador de uso geral, menos o EIP.
O segmento aponta para uma região da memória. O offset aponta para um local
dentro deste segmento.
Entendendo a pilha
A pilha é uma estrutura de dados muito importante para trabalhar com a linguagem
assembly.
Ela trabalha com o conceito de o último a entrar, primeiro a sair. LIFO ( last in first out).
A partir do momento que você vai adicionando algo na pilha o apontador de pilha (ESP)
será decrementado, apontando para o topo de pilha.
Os comandos que trabalham diretamente com a pilha são: PUSH (empurra, coloca) e POP(
retira, puxa).
Lembrando que você coloca na pilha os valores ao contrário. (ultimo a entrar, primeiro a
sair).
Os shifts são utilizados para fazer algumas operações como multiplicação de forma mais
rápida, é utilizado em operações bit a bit.
O shift a esquerda (SHL) aumenta o valor, por exemplo, se você quiser aumentar o valor de
bits em 3 por exemplo ficaria:
%EAX = 111000
SHL $x3, %EAX
%EAX = 111000000
O shift a direita (SHR) diminui o valor, por exemplo, se você quiser diminuir o valor de
bits em 3 por exemplo ficaria:
%EAX = 111000
SHR $x3, %EAX
%EAX = 111
Constantes em Assembly
Exemplo:
CR EQU 13
Assim poderia utilizar CR ao invés de 13. Se você conhece C, então veja que este comando
equivale a #define em C.
Operadores lógicos
X Y X AND Y
0 0 0
1 0 0
0 1 0
1 1 1
X Y X OR Y
0 0 0
1 0 1
0 1 1
1 1 1
X Y X XOR Y
0 0 0
1 0 1
0 1 1
1 1 0
X NOT X
0 1
1 0
0 1
1 0
Instruções em Assembly
EX.: CLC
EX.: CLD
EX.: CLI
EraUm:
CMC ; Retorna CF para 0
Fim:
EX.: CWD
DEC <VALOR> - Decrementa
Descrição: Esta instrução subtrai
um do valor em <VALOR> e armazena
o resultado em <VALOR>.
EX.: IN $72,%EAX
EX.:
XORL %EAX, %EAX ; Seta o modo de
; vídeo
MOVB $0xd, %AL ; Modo 13
INT $0xa ; Gera interrupção
Jcc - Pula (Jump) se Condição
Outras comparações
Flag SF ZF AF PF CF
Bit 07 06 05 04 03 02 01 00
EG: LAHF
SHR $0x6,%AH
AND $1, %AH; %AH contém o flag ZF.
FazAlgumaCoisa:
;...
;...
;... Isto será repetido 12 vezes
LOOP FazAlgumaCoisa
LDS
LES
LFS * 32 bits
LGS * 32 bits
LSS
* %AL é o multiplicando;
* %AX é o produto.
* %AX é o multiplicando;
* %DX:%AX é o produto.
* %EAX é o multiplicando;
* %EDX:%EAX é o produto.
É o mesmo que:
POP %AX
POP %BX
POP %CX
...
EX.: POPA
EX.: POPF
É o mesmo que:
PUSH %AX
PUSH %BX
PUSH %CX
...
EX.: PUSHA
EX.: PUSHF
EX.: RET
EX.: SAHF
SBB <FONTE>, <DEST> - Subtrai com "pede-emprestado"
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>.
EX.: STC
EX.: STD
REP STOSB ; %EDI está sendo
; decrementado
By MØRPHUS