2016-04-07 22 views
0

Raspberry Pi'yi kullanarak montaj diline yeniyim. Bu basit programı Raspberry Pi 3 (ARM 8086) üzerinde çalıştırmayı denedim. Hataya neden olmaz, ancak as _o example.o example.s, gcc _o example examle.s ve ./example'u derledikten ve çalıştırdıktan sonra sonucu bir terminalde görmeye çalıştığımda. yürütme sonucu segmentasyon hatasıdır, lütfen bana yardımcı olabilir misiniz?Montaj dilinde basit kodlar

.align 2 
    .text 
    .global main 
main: 
    stmfd r13!, {r14} 

    mov r0,#1 
    bl print 

    mov r0,#2 
    bl print 

    mov r0,#3 
    bl print 

    ldmfd r13!,{pc} @ return to OS 

print: 
    stmfd r13!, {r0-r3,r12,r14} 
    mov r1,r0 
    ldr r0, =num_str 
    bl printf 
    ldmfd r13!, {r0-r3,r12,pc} 

.data 

    .align 2 
num_str: 
    .asciz “%d\n” 
.end 
+1

_ "8086" _ Huh? Ayrıca, kullandığınızı söylediğiniz komutlarda bir takım yazım hataları da vardır ('_o', examle.s',' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. – Michael

+0

@Michael haklısın, bunu fark ettiğin için çok teşekkür ederim, örnek olarak değiştirdim, sonuç bölümleme hatası. – rezan

+1

Bu kod benim için gayet iyi çalışıyor, '' '' tırnaklar sözdizimsel olarak değiştirilmiş '' '' '' '' '' '' '' '' '' '' '' '' ı ile birlikte gelir - Ben bunların yalnızca buradaki gönderimin bir artefaktı olduğunu ve gerçek kodunuzda olmadığını varsayalım assembler, söyleyemediğiniz bir hatayı atar. – Notlikethat

cevap

2

ABI yığın işaretçisi 8 byte çoklu hizalanmış olmasını gerektirir, şimdi main işlevi hizalanmamış hale 4 ile yığın işaretçisi azaltır. Muhtemelen printf, 8 bayt hizalaması gerektiren bir yönerge kullanır.

+0

Çok teşekkürler, işe yaradı. – rezan