/home -> /home/fatec/ -> /home/fatec/sistcomp -> /home/fatec/sistcomp/assembly --::-- |
IA-32 Assembly no Linux
Prof. Rossano Pablo Pinto, MSc.
Ferramentas Utilizadas (consulte a documentação via man)
Lista de Programas em AssemblyDica: 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 LINUXPara gerar executável: as -gstabs -o cpuid.o cpuid.s ld -o cpuid cpuid.oExecutando: ./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 $0x80Para gerar executável: as -gstabs -o cpuinfo.o cpuinfo.s ld -o cpuinfo cpuinfo.oExecutando: ./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.sExecutando: ./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 $0x80Para gerar executável: as -gstabs -o cmptest.o cmptest.s ld -o cmptest cmptest.oExecutando: ./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 $0x80Para gerar executável: as -gstabs -o cmptest2.o cmptest2.s ld -o cmptest2 cmptest2.oExecutando: ./cmptest2 Verifique código de saída: echo $? 20 Links Interessantes- Art of Assembly Language Programming |