Assembly (programozási nyelv)
Innen: Programozás Wiki
(Assembly szócikkből átirányítva)
Ugrás a navigációhozUgrás a kereséshezAz 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á.