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.
[szerkesztés] Néhány processzor Assembly kódja
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á.