Pois é louds,
eu tenho notado uma grande variedade na sintaxe
assembly: AT&T, intel, AT&T (UNIX), intel (UNIX)…
Estou me preparando pra fazer um
compilador e disassembly e para isso
tenho que entender como funciona o assembly no
unix e no DOS para somente mais tarde me aventurar
em SOs.
A ideia inicialmente é fazer arquivos o mais
simples possivel. sem cabeçalhos, comentarios…
Começei com o unix e já estou sacando algumas coisas:
eax é pra unix,
int 21h (bios ruindows )
int 80h (kernel do linux)
Cheguei a utilizar o gcc para gerar o arquivo.s
e o executavel. mas ao ver as diferenças entre
o codigo gerado pelo gcc a partir de um .c e
o .asm em nasm eu desanimei de usar o gcc.
o mesmo codigo feito em nasm que gera um
Hello world! é umas 20 vezes menor.
exemplo nasm (unix):
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
02 00 03 00 01 00 00 00 80 80 04 08 34 00 00 00
f4 00 00 00 00 00 00 00 34 00 20 00 02 00 28 00
05 00 04 00 01 00 00 00 00 00 00 00 00 80 04 08
00 80 04 08 a2 00 00 00 a2 00 00 00 05 00 00 00
00 10 00 00 01 00 00 00 a4 00 00 00 a4 90 04 08
a4 90 04 08 0e 00 00 00 0e 00 00 00 06 00 00 00
00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00
b8 04 00 00 00 bb 01 00 00 00 b9 a4 90 04 08 ba
0e 00 00 00 cd 80 bb 00 00 00 00 b8 01 00 00 00
cd 80 00 00 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64
21 0a
não vou nem perder tempo colocando o gerado
pelo gcc… gigante de mais pra um cocozinho desses…
mesmo sem eu inserir a biblioteca stdio.h e o printf.
Somente ometodo main, vazio, já gera um absurdo de codigo.
Encontrei uma apostila da qual pude
tira um resumo interessante:
http://www.planetpdf.com/codecuts/pdfs/aoa.pdf
pagina 126
binario para hexadecimal:
| i | i | i | R | R | r | r | r | + [ andress (16 bits)]
if( iii != 000 )
{
instructions:
_____________________________________________________
iii
001 = or
010 = and
011 = cmp
100 = sub
101 = add
110 = mov reg, mem/reg/const
111 = mov mem, reg
reg. target:
_____________________________________________________
RR
00 = ax
01 = bx
10 = cx
11 = dx
reg. origem:
_____________________________________________________
rrr
000 = ax
001 = bx
010 = cx
011 = dx
100 = [bx]
101 = [xxxx+bx]
110 = [xxxx]
111 = const
exemplo:
_____________________________________________________
ins reg reg= iii RR rrr
mov ax, bx ; 110 00 001
11000001 = c1h
}
if( iii == 000 )
{
instructions zero operands if(RR==00):
______________________________________________________
| 0 | 0 | 0 | 0 | 0 | r | r | r |+[ andress (16 bits)]
rrr
000 = illegal
001 = illegal
010 = illegal
011 = brk
100 = iret
101 = halt
110 = get
111 = put
jump if(RR==01):
______________________________________________________
| 0 | 0 | 0 | 0 | 1 | r | r | r |+[ andress (16 bits)]
rrr
000 = je if equal
001 = jne if not equal
010 = jb if below
011 = jbe if below or equal
100 = ja if above
101 = jae if above or equal
110 = jmp if unconditional jump
111 = illegal
not if(RR==10):
______________________________________________________
| 0 | 0 | 0 | 1 | 0 | r | r | r |+[ andress (16 bits)]
rrr
000 = ax
001 = bx
010 = cx
011 = dx
100 = [bx]
101 = [xxxx+bx]
110 = [xxxx]
111 = const
illegal if(RR==11):
______________________________________________________
| 0 | 0 | 0 | 1 | 1 | r | r | r |+[ andress (16 bits)]
}
O problema dessas apostilas que tenho encontrado é que
não é mostrado as diferenças binarias entre
AH AL BH BL CH CL DH DL…,
eax ebx ecx edx… e
ax bx cx dx…
Não é dito as diferenças nem se elas
são relevantes ou não.
por exemplo:
sei que ax é composto por ah e al,
e na apostila da fonte
https://www.twiki.im.ufba.br/pub/MAT149/WebHome/Parte3.pdf pagina 22
tem:
MOV AH,1h
INT 21h
até ai blz, mas ai vem a duvida se posso reescrever:
mov eax, 1h
int 80h
Outra coisa interessante são as primeiras linhas
do executavel gerado :
7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Nenhuma apostila que encontrei fala sobre elas, mas
ao ler em alguns sites é dito que são elas quem
determinam se o arquivo é um executal ou não.
Determina o tipo do arquivo. Mas em nenhum site
ou apostila diz como funciona, onde termina esse
cabeçalho e onde começa o nosso codigo.