2013-07-10 8 views
5

फ़ाइलLLVM/बजना MIPS करने के लिए outputing, लेकिन SPIM में काम नहीं कर ....

#include <stdio.h> 

int main() { 
     printf("hello world\n"); 
     return 0; 
} 
को देखते हुए

मैं आदेशों

clang -emit-llvm hello.c -c -o hello.bc 
llc hello.bc -march=mipsel -relocation-model=static -o hello.s 

का उपयोग कैसा दिखता है का एक अच्छा सा निर्माण करने के लिए कर सकते हैं एमआईपीएस कोड, (पाठ को तोड़ने से बचने के लिए नीचे रखा गया है) दुर्भाग्यवश, जब मैं इसे एमआईपीएस के लिए अपने भरोसेमंद स्पिम सिम्युलेटर में चलाता हूं और चलाता हूं तो मुझे लगता है कि एसपीआईएम वस्तुओं की लगभग हर पंक्ति में है। न केवल '.Section.mdebug.abi32' लाइनें, लेकिन '.ffi *' फ़ॉर्म की किसी भी पंक्ति - और इससे भी अधिक भ्रमित (क्योंकि यह मुझे एमआईपीएस की तरह दिखती है ...) लाइन 'lui $ 2,% hi (__gnu_local_gp) "पर आपत्ति है।

मैं MIPS के विभिन्न जायके कि SPIM और LLVM से निपटने के बारे में कुछ जानकारी के लिए देख रहा हूँ, या किसी एक MIPS सिम्युलेटर का एक उदाहरण देने के लिए मैं चला सकते हैं कि MIPS स्वीकार करता है कोड है कि LLVM उत्पादन कर रहा है।

.Section .mdebug.abi32 
    .previous 
    .file "hello.bc" 
    .text 
    .globl main 
    .align 2 
    .type main,@function 
    .set nomips16    # @main 
    .ent main 
main: 
    .cfi_startproc 
    .frame $sp,32,$ra 
    .mask 0x80000000,-4 
    .fmask 0x00000000,0 
    .set noreorder 
    .set nomacro 
# BB#0:         # %entry 
    addiu $sp, $sp, -32 
$tmp2: 
    .cfi_def_cfa_offset 32 
    sw $ra, 28($sp)   # 4-byte Folded Spill 
$tmp3: 
    .cfi_offset 31, -4 
    lui $2, %hi(__gnu_local_gp) 
    addiu $2, $2, %lo(__gnu_local_gp) 
    sw $2, 16($sp) 
    sw $zero, 24($sp) 
    lui $2, %hi($.str) 
    addiu $4, $2, %lo($.str) 
    jal printf 
    nop 
    addiu $2, $zero, 0 
    lw $ra, 28($sp)   # 4-byte Folded Reload 
    addiu $sp, $sp, 32 
    jr $ra 
    nop 
    .set macro 
    .set reorder 
    .end main 
$tmp4: 
    .size main, ($tmp4)-main 
    .cfi_endproc 

    .type $.str,@object   # @.str 
    .section .rodata.str1.1,"aMS",@progbits,1 
$.str: 
    .asciz "hello world\n" 
    .size $.str, 13 

उत्तर

0

LLVM में Mips विधानसभा प्रिंटर उत्सर्जन करता है। गैस प्रारूप में विधानसभा (जीएनयू कोडांतरक और संगत उपकरणों के उपभोग के लिए उपयुक्त) वहाँ एक बहुत अच्छा मौका एसपीआई है एम इसे पढ़ नहीं सकता है। हालांकि, अगर एसपीआईएम एमआईपीएस बाइनरी पढ़ सकता है, तो आप एलएलवीएम से ऑब्जेक्ट फ़ाइल को उत्सर्जित करने का प्रयास कर सकते हैं और स्पिम को इसे संभालने दें।

द्विआधारी अधिक "सार्वभौमिक" हैं क्योंकि उन्हें सीपीयू द्वारा ही समझा जाना चाहिए। हां, प्रत्येक असेंबलर का आमतौर पर इसका अपना विशिष्ट वाक्यविन्यास होता है, केवल यह समझता है, और असेंबलर एक-दूसरे के साथ संगत नहीं होते हैं और ऑपरेटर ऑर्डरिंग, विराम चिह्न अर्थशास्त्र, निर्देश आदि जैसे मूलभूत चीज़ों से असहमत होते हैं।

1

स्पिम एक साधारण शिक्षण उपकरण है जो gnu assembler का समर्थन नहीं करता है। आप OVPsim का उपयोग करने का प्रयास कर सकते हैं, जिसमें विभिन्न वास्तविक एमआईपीएस प्रोसेसर के पूर्ण मॉडल हैं। आप ओवीपीसिम पर लिनक्स चला सकते हैं, और आप उस नकली लिनक्स पर क्लैंग द्वारा उत्पादित एक एमआईपीएस लिनक्स निष्पादन योग्य चलाने में सक्षम होना चाहिए।

+0

यदि आप लिनक्स चला रहे हैं तो एक और मार्ग, मिप्स के लिए क्यूईएमयू लिनक्स उपयोगकर्ता मोड एमुलेटर का उपयोग करना होगा। यही वह है जो मैं अपने क्लैंग आधारित ईएलएलसीसी उपकरण श्रृंखला के लिए उपयोग करता हूं। (Http://ellcc.org) –

संबंधित मुद्दे