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