|
section .text ;bölüm bildirimi ;giriş noktasını ELF ilintileyiciye veya yükleyiciye global _start ;göndermeliyiz (export). Giriş noktasını uzlaşımsal ;olarak _start ile belirtiriz. Öntanımlı durumu ;değiştirmek için: ld -e foo kullanın. _start: ;dizgemizi stdout'a yazar mov edx,len ;üçüncü argüman: ileti uzunluğu mov ecx,msg ;ikinci argüman: yazılacak iletinin göstericisi mov ebx,1 ;ilk argüman: dosya tutucu (stdout) mov eax,4 ;sistem çağrısı numarası (sys_write) int 0x80 ;çekirdeği çağır ;ve çık mov ebx,0 ;ilk sistem çağrısı argümanı: çıkış kodu mov eax,1 ;sistem çağrı numarası (sys_exit) int 0x80 ;çekirdeği çağır section .data ;bölüm bildirimi msg db "Hello, world!",0xa ;sevgili dizgemiz len equ $ - msg ;sevgili dizgemizin boyu
.text # bölüm bildirimi ;giriş noktasını ELF ilintileyiciye veya yükleyiciye global _start ;göndermeliyiz (export). Giriş noktasını uzlaşımsal ;olarak _start ile belirtiriz. Öntanımlı durumu ;değiştirmek için: ld -e foo kullanın. _start: # dizgemizi stdout'a yazar movl $len,%edx # üçüncü argüman: ileti uzunluğu movl $msg,%ecx # ikinci argüman: yazılacak iletinin göstericisi movl $1,%ebx # ilk argüman: dosya tutucu (stdout) movl $4,%eax # sistem çağrı numarası int $0x80 # çekirdeği çağır # ve çık movl $0,%ebx # ilk sistem çağrısı argümanı: çıkış kodu movl $1,%eax # sistem çağrı numarası (sys_exit) int $0x80 # çekirdeği çağır .data # bölüm bildirimi msg: .ascii "Hello, world!\n" # sevgili dizgemiz len = . - msg # sevgili dizgemizin boyu
$ nasm -f elf hello.asm
$ as -o hello.o hello.S
$ ld -s -o hello hello.o
# hello.S by Spencer T. Parkin # Bu benim ilk MIPS-RISC sembolik makina dili programım! # Derlemek için: # > gcc -o hello hello.S -non_shared # Bu program PlayStation2 MIPS R5900 (EE Çekirdek) # üzerinde hatasız ve uyarısız derlenir. # EE Duygu Makinası (Emotion Engine) anlamına gelir # -non_shared seçeneği gcc'ye # yeniden tahsis edilebilir kod ile ilgilenmediğimizi söyler. # Eğer isteseydik, PIC-ABI çağrım kurallarını # ve diğer protokolleri kullanmalıydık #include <asm/regdef.h> // Anaşılabilir yazmaç adları için #include <asm/unistd.h> // Sistem servisleri için .rdata # yalnız okunabilir veri bölümüne başlangıç align 2 # belleğin yapım şeklinden dolayı böyle hello: .asciz "Hello, world!\n" # Null ile sonlanmış bir karakter dizisi .align 4 # belleğin yapım şeklinden dolayı length: .word .- hello # length = IC - (hello-addr) .text # kod bölümü başlangıcı .globl main # gcc/ld bağlamasından dolayı .ent main # gdp hata ayıklama bilgisi main: # gcc'ye bir -non_shared alanı sunmalıyız # ya da aşağıdaki üç satır etkin olmalı # .set noreorder # yeniden komut sıralamasını kapat # .cpload t9 # PIC ABI zırvası # .set reorder # yeniden komut sıralaması aktif move a0,$0 # dosya tanımlayıcısı standart çıktıyı göstersin la a1,hello # karakter dizisi adresini yükle lw a2,length # karakter dizisi boyunu yükle li v0,__NR_write # sistem yazma servislerini belirt syscall # çekirdeği çağır (karakter dizisini yaz) li v0,0 # geri dönüş kodunu yükle j ra # çağırana dönüş .end main # dgb için hata ayıklama bilgisi # hepsi bu kadar millet!
|