Hello World w Asm

0

Jestem zmuszony teraz nauczyć się na poważnie asm. Wcześniej coś sobie pisałem, ale raczej nie by się nauczyć, tylko by zaliczyć. Teraz mam problem, bo nie mogę zrozumieć dlaczego kod asm HelloWorld napisany przeze mnie, różni się od tego który mi zwrócił kompilator gcc z opcją -S i -O2. Myślałem, ze po optymalizacji dostane praktycznie linia w linie to samo.
Kod kompilatora:

	.file	"main.c"
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC0:
	.string	"Hello World"
	.section	.text.unlikely,"ax",@progbits
.LCOLDB1:
	.section	.text.startup,"ax",@progbits
.LHOTB1:
	.p2align 4,,15
	.globl	main
	.type	main, @function
main:
.LFB24:
	.cfi_startproc
	subq	$8, %rsp
	.cfi_def_cfa_offset 16
	movl	$.LC0, %edi
	call	puts
	xorl	%eax, %eax
	addq	$8, %rsp
	.cfi_def_cfa_offset 8
	ret
	.cfi_endproc
.LFE24:
	.size	main, .-main
	.section	.text.unlikely
.LCOLDE1:
	.section	.text.startup
.LHOTE1:
	.ident	"GCC: (Ubuntu 4.9.1-16ubuntu6) 4.9.1"
	.section	.note.GNU-stack,"",@progbits

I mój:

section     .text
global      _start                             

_start:                                         

    mov     edx,len                           
    mov     ecx,msg                             
    mov     ebx,1                               
    mov     eax,4                              
    int     0x80                               
    mov     eax,1                              
    int     0x80                                

section     .data

msg     db  'Hello, world!',0xa                 
len     equ $ - msg 
0

Gdybyś użył GAS (gnu asm) i umieścił wszystkie informacje, jakie umieszcza kompilator to wyszedłby Ci podobny kod.

W zupełnie inny sposób wyświetlasz swój napis - używasz przerwania.
W kodzie wygenerowanym przez kompilator używana jest funkcja puts (stdio.h)

Luźnymi słowami: Użyłeś zupełnie innego języka i zupełnie innego sposobu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1