Assembly (programozási nyelv)

A Programozás Wiki wikiből

Az assembly a számítógép processzora által használt gépi kódhoz legközelebb eső programozási nyelv. Az assemblyben írt program egy egy utasítása általában a processzor által elvégzett egy-egy műveletnek felel meg. Az eltérő architektúrájú gépek gépi kódja más, emiatt az assembly programok csak egy architektúrán fordíthatók le.

A helló program x86 assembly-ben linuxon
   section .data
   msg db "Hello, World!", 0xa
   len equ $-msg
   section .text
   global main
   main:
   mov edx, len
   mov ecx, msg
   mov ebx, 1
   mov eax, 4
   int 0x80
   mov ebx, 0
   mov eax, 1
   int 0x80

Mivel minden processzorra jelentősen eltérő az assembly nyelv, ezért napjainkban csak akkor nyúlunk erre a szintre, ha

  • tanulmányozni akarjuk alacsony szinten, nincs-e félrefordítás
  • legeslegbelső ciklus kézi optimalizálásával jelentős nyereséget érhetünk el, amire éppen szükségünk is van.

Néhány processzor Assembly kódja[szerkesztés]

Nézzük az alábbi egyszerű C programot és a megfelelő architektúrára fordító gcc-vel fordítsuk le (gcc -S hello.c)

#include <stdio.h>
int main() {
   printf( "Hello, World!\n" );
   return 0;
}

Alább látható a GCC által fordított assembly kód lényegi része:

Intel i386 processzor család AVR8 processzor család ARM processzor család MIPS processzor család
.LC0:
        .string "Hello, World!\n"
        .text
        .p2align 4,,15
.globl main
        .type   main, @function
main:
        pushl   %ebp
        movl    %esp, %ebp
        andl    $-16, %esp
        subl    $16, %esp
        movl    $.LC0, 4(%esp)
        movl    $1, (%esp)
        call    __printf_chk
        xorl    %eax, %eax
        leave
        ret
.LC0:
        .string "Hello, World!"
        .text
.global main
        .type   main, @function
main:
        ldi r24,lo8(.LC0)
        ldi r25,hi8(.LC0)
        rcall puts
        ldi r24,lo8(0)
        ldi r25,hi8(0)
        ret
        .text
        .align  2
        .global main
        .type   main, %function
main:
        stmfd   sp!, {r3, lr}
        ldr     r0, .L3
        bl      puts
        mov     r0, #0
        ldmfd   sp!, {r3, lr}
        bx      lr
.L4:
        .align  2
.L3:
        .word   .LC0
        .align  2
.LC0:
        .ascii  "Hello, World!\000"
$LC0:
        .ascii  "Hello, World!\000"
        .text
        .align  2
        .globl  main
        .ent    main
        .type   main, @function
main:
        .frame  $sp,32,$31
        .mask   0x80000000,-4
        .fmask  0x00000000,0
        .set    noreorder
        .set    nomacro
       
        lui     $4,%hi($LC0)
        addiu   $sp,$sp,-32
        sw      $31,28($sp)
        jal     puts
        addiu   $4,$4,%lo($LC0)

        lw      $31,28($sp)
        move    $2,$0
        j       $31
        addiu   $sp,$sp,32

A fent látható kódok eredetije, amit "gcc -S" fordít, kézi optimalizálás után továbbfordítható futtatható állománnyá.