/home -> /home/fatec/ -> /home/fatec/sistcomp -> /home/fatec/sistcomp/assembly --::--
Brazilian Portuguese English

IA-32 Assembly no Linux

Prof. Rossano Pablo Pinto, MSc.





Ferramentas Utilizadas (consulte a documentação via man)

Ferramenta Descrição Exemplo
as GNU Assembler as -gstabs -o cpuid.o cpuid.s
ld GNU Linker ld -o cpuid cpuid.o
gcc GNU Compiler (GNU Compiler Collection)
objdump Object Dump - imprime informações do código binario objdump -D cpuid.o
nm Lista símbolos presentes em arquivos objeto nm cpuid
ar Cria, modifica e extrai arquivos de um arquivo de biblioteca
strings Lista strings presentes em arquivos strings cpuid
strip Remove símbolos presentes em arquivos objeto strip cpuid
gdb GNU Debugger
khexedit Editor hexadecimal do KDE


Lista de Programas em Assembly


Dica: Verificando o código de saida (exit code) especificado em %ebx. Depois da execução de cada programa, execute o seguinte na linha de comando:
echo $?



PROGRAMA 1
⇒ Obtém fabricante do processador: cpuid.s
#cpuid.s Sample program to extract the processor Vendor ID
#Author: Richard Blum
.section .data
output:
   .ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"
.section .text
.globl _start
_start:
        nop
        mov  $0, %eax
        cpuid
        movl $output, %edi
        movl %ebx, 28(%edi)
        movl %edx, 32(%edi)
        movl %ecx, 36(%edi)
        movl $4, %eax         # USAR SYSCALL 4 (WRITE) P/ IMPRIMIR NA TELA
        movl $1, %ebx         # IMPRIMIR EM STDOUT (FD 1)
        movl $output, %ecx    # ENDERECO INICIO DO TEXTO A SER IMPRESSO
        movl $42, %edx        # COMPRIMENTO DO TEXTO A SER IMPRESSO
        int  $0x80            # CHAMA SYSCALL DO LINUX

        movl $1, %eax         # USAR SYSCALL 1 (EXIT) P/ FINALIZAR PROGRAMA
        movl $0, %ebx         # SAIR COM ERROR CODE = 0
        int  $0x80            # CHAMAR SYSCALL DO LINUX

Para gerar executável:
as -gstabs -o cpuid.o cpuid.s
ld -o cpuid cpuid.o
Executando:
./cpuid
The processor Vendor ID is 'GenuineIntel'



PROGRAMA 2
⇒ Extrai informações a respeito do processador: cpuinfo.s
#cpuinfo.s Sample program to extract processor Info
#Author: Rossano Pablo Pinto
.section .data
vendor:
   .ascii "The processor Vendor ID is 'xxxxxxxxxxxx'\n"        # 42 bytes
brand: 
   .ascii "                                                \n" # 49 bytes
	
.section .text
.globl _start
_start:
	nop
	call vendorid
	call modelname
	call myexit
			
vendorid:
	########### VENDOR ID OPTION OF cpuid		
	mov  $0, %eax
	cpuid
	########### PUT ADDRESS OF vendor variable INTO edi REGISTER
	movl $vendor, %edi
	movl %ebx, 28(%edi)   
	movl %edx, 32(%edi)
	movl %ecx, 36(%edi)
	########### CALL LINUX PRINT SERVICE - SYSTEM CALL
	movl $4, %eax
	movl $1, %ebx
	movl $vendor, %ecx   ## POINTER TO START OF STRING
	movl $42, %edx       ## STRING SIZE
	int  $0x80
	ret
	
modelname:	
	movl $brand, %edi
	
	movl $0x80000002, %eax
	cpuid
	movl %eax, 0(%edi)
	movl %ebx, 4(%edi)
	movl %ecx, 8(%edi)
	movl %edx, 12(%edi)
	
	movl $0x80000003, %eax
	cpuid
	movl %eax, 16(%edi)
	movl %ebx, 20(%edi)
	movl %ecx, 24(%edi)
	movl %edx, 28(%edi)

	movl $0x80000004, %eax
	cpuid
	movl %eax, 32(%edi)
	movl %ebx, 36(%edi)
	movl %ecx, 40(%edi)
	movl %edx, 44(%edi)

        ########### CALL LINUX PRINT SERVICE - SYSTEM CALL
	movl $4, %eax      ##### WRITE SYSCALL
	movl $1, %ebx      ##### STDOUT
	movl $brand, %ecx
	movl $49, %edx     ## POINTER TO START OF STRING
	int  $0x80         ## STRING SIZE
	ret
	
	
myexit:			
	########### CALL LINUX EXIT SERVICE - SYSTEM CALL
	movl $1, %eax      ##### EXIT SYSCALL
	movl $0, %ebx      ##### EXIT CODE OF 0
	int  $0x80

Para gerar executável:
as -gstabs -o cpuinfo.o cpuinfo.s
ld -o cpuinfo cpuinfo.o
Executando:
./cpuinfo 
The processor Vendor ID is 'GenuineIntel'
Intel(R) Core(TM)2 CPU         T5600  @ 1.83GHz



PROGRAMA 3
⇒ Similar ao 2: troque _start por main (usa gcc p/ gerar código ao invés de "as" + "ld")
.
.
.
.globl main
main:
.
.
. 
Para gerar executável:
gcc -o cpuinfo cpuinfo.s
Executando:
./cpuinfo 
The processor Vendor ID is 'GenuineIntel'
Intel(R) Core(TM)2 CPU         T5600  @ 1.83GHz



PROGRAMA 4
⇒ Testa o uso do EFLAGS para desvio condicional: cmptest.s
# cmptest.s - Um exemplo de uso das instrucoes CMP e JGE
# CMP seta EFLAGS de acordo
# JGE verifica em EFLAGS se valor é maior
#
# Teoria:
#  Carry Flag (CF) - bit 0 (least significant bit)
#  Overflow Flag (OF) - bit 11
#  Parity Flag (PF) - bit 2
#  Sign Flag (SF) - bit 7
#  Zero Flag (ZF) - bit 6
#
#  JGE - Jump if greater or equal (SF=OF)
#	
.section .text
.globl _start
_start:
	nop
	movl $15, %eax
	movl $10, %ebx
	cmp %eax, %ebx
	jge MAIOR
	movl $1, %eax
	int $0x80
MAIOR:
	movl $20, %ebx
	movl $1, %eax
	int $0x80
Para gerar executável:
as -gstabs -o cmptest.o cmptest.s
ld -o cmptest cmptest.o
Executando:
./cmptest

Verifique código de saída:
echo $?
10



PROGRAMA 5
⇒ Testa o uso do EFLAGS para desvio condicional: cmptest2.s
# cmptest2.s - Um exemplo de uso das instrucoes CMP e JGE
# CMP seta EFLAGS de acordo
# JGE verifica em EFLAGS se valor é maior
	
.section .text
.globl _start
_start:
	nop
	movl $10, %eax
	movl $15, %ebx
	cmp %eax, %ebx
	jge MAIOR
	movl $1, %eax
	int $0x80
MAIOR:
	movl $20, %ebx
	movl $1, %eax
	int $0x80
	
Para gerar executável:
as -gstabs -o cmptest2.o cmptest2.s
ld -o cmptest2 cmptest2.o
Executando:
 ./cmptest2

Verifique código de saída:
echo $?
20




Links Interessantes


- Art of Assembly Language Programming






Faculdade de Tecnologia de Americana :: Departamento de Processamento de Dados
Av. Nossa Senhora de Fátima, 567 - Tel. +55(19)3468-1049 CEP: 13478-540 / Americana / SP / Brasil
Copyleft 2007 Rossano Pablo Pinto