2012-02-20 10 views
13

मैं फ़र्मवेयर मोडिंग में उपयोगी कौशल सीखने की कोशिश कर रहा हूं (जिसके लिए मेरे पास स्रोत कोड नहीं है) ये प्रश्न अंगूठे कोड से बीएक्स का उपयोग करने के लिए अन्य मौजूदा थंब कोड को कूद या कॉल करने के लिए चिंता करते हैं।आर्म/थंब: थंब कोड में बीएक्स का उपयोग करके, थंब फ़ंक्शन को कॉल करने के लिए, या किसी अन्य फ़ंक्शन में थंब निर्देश पर कूदने के लिए

  1. मैं अपने THUMB कोड से मौजूदा फर्मवेयर THUMB कोड में JXP को JUMP का उपयोग कैसे करूं।
  2. मैं अपने THUMB कोड से मौजूदा THUMB फ़ंक्शन को कॉल करने के लिए बीएक्स का उपयोग कैसे करूं (पहले एलआर सेट करना होगा)।

मेरे समझ के साथ कि cpu LSB बिट (बिट 0) पर लग रहा है और मुझे यकीन है कि इस क्रम में cpu राज्य "अंगूठे राज्य" करने के लिए रखने के लिए 1 के लिए सेट है बनाने के लिए किया है। तो मुझे लगता है कि मैं 1 जोड़ने के लिए, 1.

को बिट सेट करने के लिए LSB है तो ... कहते हैं कि मैं सिर्फ 0x24000 के लिए कूद करने (कुछ मौजूदा अंगूठे कोड के बीच में)

LDR R6, =0x24000 
ADD R6, #1  @ (set lsb to 1) 
BX R6 

चाहते मुझे लगता है कि यह सही है?

अब कहें कि मैं बीएक्स का उपयोग करके मौजूदा थंब फ़ंक्शन को कॉल करना चाहता हूं, और मैं इसे वापस लौटना चाहता हूं, इसलिए मुझे एलआर सेट करना होगा जहां मैं इसे वापस लौटना चाहता हूं।

चलें कहना समारोह मैं कॉल करना चाहते हैं 0x24000 पर इसका उपयोग करना suggested to me था:

ldr r2, =0x24000 
mov lr, pc 
bx r2 

यहाँ आता है मुझे समझ नहीं आता क्या:

  1. R2 नहीं करता है में पता एलएसबी बिट सेट नहीं है ... तो bx r2 स्विच मोड एआरएम मोड में नहीं होगा ??

  2. एलआर .. पीसी का पता है (वर्तमान निर्देश की शुरुआत, + 4), मुझे बताया गया था। दोनों अंगूठे और हाथ में, किसी भी अनुदेश का पता, (16 बिट या 32 बिट) गठबंधन हो गया है तो यह LSB बिट LSB बिट 1.

को निर्धारित किया है 1. केवल विषम संख्या के लिए सेट की जरूरत नहीं होगी

तो ऊपर दिए गए कोड में, मैं एलआर (पीसी) को सेट कर रहा हूं, एक पता जिसमें एलएसबी बिट 1 सेट नहीं है। तो जब मैं जिस समारोह को बुलाता हूं वह इसके उपन्यास में आता है, और BX LR करता है, ... उहम्म .. यह मेरे THUMB कोड पर वापस जाने के लिए कैसे काम कर सकता है? मुझे कुछ याद आना चाहिए ...

आम तौर पर बीएल का उपयोग कार्यों को कॉल करने के लिए किया जाता है। मैनुअल का कहना है कि बीएल निर्देश एलआर को कोड की अगली पंक्ति में सेट करता है ... तो क्या इसका मतलब यह है कि (आमतौर पर प्रयुक्त) BL THUMB निर्देश, एलआर को स्वचालित रूप से return addr + 1 पर सेट करता है?

उत्तर

19

वाह, मुझे इस पर फोन करने के लिए धन्यवाद। मुझे पता है कि मैंने http://github.com/dwelch67/yagbat में क्यूमु कोड की कोशिश की और XPUT32 को सोचा जो आपके द्वारा वर्णित तरीके से PUT32 को कॉल करता है, और यह काम करता है। लेकिन यह काम करने के लिए प्रकट नहीं होता है। मैंने कई प्रयोग किए और मुझे आश्चर्य हुआ कि यह वही नहीं है जो मैं उम्मीद कर रहा था। अब मैं देखता हूं कि gnu लिंकर ऐसा करता है जो करता है। क्षमा करें यह एक लंबी प्रतिक्रिया है लेकिन मुझे लगता है कि यह बहुत मूल्यवान है। यह एक भ्रमित विषय है, मुझे पता है कि मैंने यह सोचने में वर्षों से गलत किया है कि पीसी ने मोड को थोड़ा सा ड्रैग किया है, लेकिन ऐसा नहीं है।

इससे पहले कि मैं नीचे प्रयोगों के साथ शुरू करते हैं, यदि आप ऐसा करने जा रहे हैं:

LDR R6, =0x24000 
ADD R6, #1  @ (set lsb to 1) 
BX R6 

क्योंकि आप को पता है कि 0x24000 अंगूठे कोड है होता है, सिर्फ इस बजाय कार्य करें:

LDR R6, =0x24001 
BX R6 

और हां, इस तरह आप हाथ या अंगूठे से अंगूठे कोड को शाखाबद्ध करते हैं यदि आपको पता चल जाता है कि हार्डकोडेड पता 0x24000 एक अंगूठे निर्देश है जिसे आप पते वाले प्लस वाले रजिस्टर के साथ बीएक्स करते हैं।

यदि आप पता नहीं जानता लेकिन पता

ldr r6,=something 
bx r6 

उस के बारे में अच्छी बात यह है का नाम पता है कि कुछ एक हाथ या अंगूठे का पता और इसके बाद के संस्करण कोड बस काम करता है हो सकता है। खैर यह काम करता है अगर लिंकर ठीक से जानता है हाथ या अंगूठे है कि लेबल की किस प्रकार, यह है कि अगर में गड़बड़ हो जाता है यह अभ्यस्त सही आप यहाँ देख सकते हैं के रूप में

.thumb 
ping: 
    ldr r0,=pong 
    bx r0 
.code 32 
pong: 
    ldr r0,=ping 
    bx r0 


d6008148 <ping>: 
d6008148: 4803  ldr r0, [pc, #12] ; (d6008158 <pong+0xc>) 
d600814a: 4700  bx r0 

d600814c <pong>: 
d600814c: e59f0008 ldr r0, [pc, #8] ; d600815c <pong+0x10> 
d6008150: e12fff10 bx r0 

d6008158: d600814c strle r8, [r0], -ip, asr #2 
d600815c: d6008148 strle r8, [r0], -r8, asr #2 

कि काम पांग फ्लॉप से ​​एक अंगूठे का पता खींचने के लिए करना चाहता था काम 0xD600815C लेकिन एक हाथ का पता मिला।

यह सभी gnu assembler stuff btw है, अन्य उपकरणों के लिए आपको कुछ और करना पड़ सकता है। गैस के लिए आपको एक थंब लेबल के रूप में घोषित करने के लिए .thumb_func डालना होगा, जिसे आप अंगूठे लेबल के रूप में घोषित करना चाहते हैं (शब्द func implying function misleading है, इस बारे में चिंता न करें। Thumb_func का अर्थ है कि यह सिर्फ एक असेंबलर/लिंकर गेम है)।

.thumb 
.thumb_func 
ping: 
    ldr r0,=pong 
    bx r0 
.code 32 
pong: 
    ldr r0,=ping 
    bx r0 

और अब हम क्या हम उस lsbit की स्थापना की है

d6008148 <ping>: 
d6008148: 4803  ldr r0, [pc, #12] ; (d6008158 <pong+0xc>) 
d600814a: 4700  bx r0 

d600814c <pong>: 
d600814c: e59f0008 ldr r0, [pc, #8] ; d600815c <pong+0x10> 
d6008150: e12fff10 bx r0 

d6008158: d600814c strle r8, [r0], -ip, asr #2 
d600815c: d6008149 strle r8, [r0], -r9, asr #2 

0xD600815C चाहता था, ताकि आप न कोई काम करना है मिलता है। उदाहरण के लिए सी फ़ंक्शंस में कॉल करने पर संकलक इस सब का ख्याल रखता है। असेंबलर के लिए यद्यपि आपको यह जानने के लिए है कि thth_func (या कोई अन्य निर्देश अगर कोई है) यह जानने के लिए गैस प्राप्त करने के लिए यह एक अंगूठे लेबल है और आपके लिए lsbit सेट करें।

तो नीचे दिया गया प्रयोग एक एमपीकोर पर किया गया था जो एक एआरएम 11 है, लेकिन मैंने एक ही परिणाम के साथ एआरएम 7TDMI और क्यूमु पर टेस्टथम्ब फ़ंक्शन 1 से 4 का प्रयास किया।

.globl testarm 
testarm: 
    mov r0,pc 
    bx lr 

armbounce: 
    mov r0,lr 
    bx lr 

.thumb 
.thumb_func 
.globl testthumb1 
testthumb1: 
    mov r0,pc 
    bx lr 
    nop 
    nop 
    nop 
bounce: 
    bx lr 
.thumb_func 
.globl testthumb2 
testthumb2: 
    mov r2,lr 
    mov r0,pc 
    bl bounce 
    bx r2 
    nop 
    nop 
    nop 
.thumb_func 
.globl testthumb3 
testthumb3: 
    mov r2,lr 
    mov lr,pc 
    mov r0,lr 
    bx r2 
    nop 
    nop 
    nop 
.thumb_func 
.globl testthumb4 
testthumb4: 
    push {lr} 
    ldr r2,=armbounce 
    mov r1,pc ;@ -4 
    add r1,#5 ;@ -2 
    mov lr,r1 ;@ +0 
    bx r2  ;@ +2 
    pop {r2} ;@ +4 
    bx r2 
.thumb_func 
.globl testthumb5 
testthumb5: 
    push {lr} 
    ldr r2,=armbounce 
    mov lr,pc 
    bx r2 
    pop {r2} 
    bx r2 
.thumb_func 
.globl testthumb6 
testthumb6: 
    push {lr} 
    bl testthumb6a 
.thumb_func 
testthumb6a: 
    mov r0,lr 
    pop {r2} 
    bx r2 

.thumb_func 
.globl testthumb7 
testthumb7: 
    push {lr} 
    bl armbounce_thumb 
    pop {r2} 
    bx r2 

.thumb_func 
.globl testthumb8 
testthumb8: 
    push {lr} 
    bl armbounce_thumb_two 
    pop {r2} 
    bx r2 

.align 4 
armbounce_thumb: 
    ldr r1,[pc] 
    bx r1 
.word armbounce 

nop 
.align 4 
armbounce_thumb_two: 
    bx pc 
    nop 
.code 32 
    b armbounce 

जो

d60080b4 <testarm>: 
d60080b4: e1a0000f mov r0, pc 
d60080b8: e12fff1e bx lr 

d60080bc <armbounce>: 
d60080bc: e1a0000e mov r0, lr 
d60080c0: e12fff1e bx lr 

d60080c4 <testthumb1>: 
d60080c4: 4678  mov r0, pc 
d60080c6: 4770  bx lr 
d60080c8: 46c0  nop   ; (mov r8, r8) 
d60080ca: 46c0  nop   ; (mov r8, r8) 
d60080cc: 46c0  nop   ; (mov r8, r8) 

d60080ce <bounce>: 
d60080ce: 4770  bx lr 

d60080d0 <testthumb2>: 
d60080d0: 4672  mov r2, lr 
d60080d2: 4678  mov r0, pc 
d60080d4: f7ff fffb bl d60080ce <bounce> 
d60080d8: 4710  bx r2 
d60080da: 46c0  nop   ; (mov r8, r8) 
d60080dc: 46c0  nop   ; (mov r8, r8) 
d60080de: 46c0  nop   ; (mov r8, r8) 

d60080e0 <testthumb3>: 
d60080e0: 4672  mov r2, lr 
d60080e2: 46fe  mov lr, pc 
d60080e4: 4670  mov r0, lr 
d60080e6: 4710  bx r2 
d60080e8: 46c0  nop   ; (mov r8, r8) 
d60080ea: 46c0  nop   ; (mov r8, r8) 
d60080ec: 46c0  nop   ; (mov r8, r8) 

d60080ee <testthumb4>: 
d60080ee: b500  push {lr} 
d60080f0: 4a15  ldr r2, [pc, #84] ; (d6008148 <armbounce_thumb_two+0x8>) 
d60080f2: 4679  mov r1, pc 
d60080f4: 3105  adds r1, #5 
d60080f6: 468e  mov lr, r1 
d60080f8: 4710  bx r2 
d60080fa: bc04  pop {r2} 
d60080fc: 4710  bx r2 

d60080fe <testthumb5>: 
d60080fe: b500  push {lr} 
d6008100: 4a11  ldr r2, [pc, #68] ; (d6008148 <armbounce_thumb_two+0x8>) 
d6008102: 46fe  mov lr, pc 
d6008104: 4710  bx r2 
d6008106: bc04  pop {r2} 
d6008108: 4710  bx r2 

d600810a <testthumb6>: 
d600810a: b500  push {lr} 
d600810c: f000 f800 bl d6008110 <testthumb6a> 

d6008110 <testthumb6a>: 
d6008110: 4670  mov r0, lr 
d6008112: bc04  pop {r2} 
d6008114: 4710  bx r2 

d6008116 <testthumb7>: 
d6008116: b500  push {lr} 
d6008118: f000 f80a bl d6008130 <armbounce_thumb> 
d600811c: bc04  pop {r2} 
d600811e: 4710  bx r2 

d6008120 <testthumb8>: 
d6008120: b500  push {lr} 
d6008122: f000 f80d bl d6008140 <armbounce_thumb_two> 
d6008126: bc04  pop {r2} 
d6008128: 4710  bx r2 
d600812a: 46c0  nop   ; (mov r8, r8) 
d600812c: 46c0  nop   ; (mov r8, r8) 
d600812e: 46c0  nop   ; (mov r8, r8) 

d6008130 <armbounce_thumb>: 
d6008130: 4900  ldr r1, [pc, #0] ; (d6008134 <armbounce_thumb+0x4>) 
d6008132: 4708  bx r1 
d6008134: d60080bc   ; <UNDEFINED> instruction: 0xd60080bc 
d6008138: 46c0  nop   ; (mov r8, r8) 
d600813a: 46c0  nop   ; (mov r8, r8) 
d600813c: 46c0  nop   ; (mov r8, r8) 
d600813e: 46c0  nop   ; (mov r8, r8) 

d6008140 <armbounce_thumb_two>: 
d6008140: 4778  bx pc 
d6008142: 46c0  nop   ; (mov r8, r8) 
d6008144: eaffffdc b d60080bc <armbounce> 
d6008148: d60080bc   ; <UNDEFINED> instruction: 0xd60080bc 
d600814c: e1a00000 nop   ; (mov r0, r0) 

हो जाता है और फोन करने और इन सभी कार्यों के मुद्रण के परिणाम

D60080BC testarm 
D60080C8 testthumb1 
D60080D6 testthumb2 
D60080E6 testthumb3 
D60080FB testthumb4 
     testthumb5 crashes 
D6008111 testthumb6 
D600811D testthumb7 
D6008127 testthumb8 

तो यह सब करने के क्या है और क्या इसके साथ क्या संबंध है आपके सवाल। इसे अंगूठे मोड से कॉल करने के लिए मिश्रित मोड (और हाथ से भी आसान है)

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

एआरएम आर्किटेक्चरल रेफरेंस मैनुअल में एआरएम प्रोसेसर के सीपीयू विवरण में बहुत जल्दी (यदि आप असेंबलर लिख रहे हैं तो आपको पहले से ही यह होना चाहिए, यदि संभवतः आपके अधिकांश प्रश्नों का उत्तर नहीं दिया जाएगा)।

Program counter Register 15 is the Program Counter (PC). It can be used in most 
     instructions as a pointer to the instruction which is two instructions after 
     the instruction being executed... 

तो जांच और देखते हैं कि यह वास्तव में इसका मतलब है, कि आगे दो निर्देश, 8 बाइट्स हाथ मोड में मतलब है की सुविधा देता है? और अंगूठे मोड में, आगे दो निर्देश, या 4 बाइट आगे?

तो testarm सत्यापित करता है कि प्रोग्राम काउंटर 8 बाइट आगे है। जो दो निर्देश भी है।

testthumb1 सत्यापित करता है कि कार्यक्रम 4 बाइट आगे है, जो इस मामले में भी दो निर्देश हैं।

testthumb2

d60080d2: 4678  mov r0, pc 
d60080d4: f7ff fffb bl d60080ce <bounce> 
d60080d8: 4710  bx r2 

यदि प्रोग्राम काउंटर दो "निर्देश" प्रमुख थे हम 0xD60080D8 मिलेगा लेकिन हम बजाय 0xD60080D6 जो चार बाइट्स आगे मिलता है, और है कि एक बहुत अधिक समझ में आता है। आर्म मोड 8 बाइट्स आगे, थंब मोड 4 बाइट्स आगे, कोडिंग निष्पादित होने से पहले डिकोडिंग निर्देशों (या डेटा) के साथ कोई गड़बड़ नहीं है, बस 4 या 8.

testthumb3 एक आशा थी कि mov lr, पीसी था विशेष, यह नहीं है।

यदि आप अभी तक पैटर्न नहीं देखते हैं, तो प्रोग्राम काउंटर का lsbit सेट नहीं है, और मुझे लगता है कि उदाहरण के लिए शाखा तालिकाओं के लिए यह समझ में आता है। तो mov lr, थंब मोड में पीसी एक रिटर्न के लिए लिंक रजिस्टर सेट अप नहीं करता है। एक बहुत ही दर्दनाक तरीके से

testthumb4 कार्यक्रम काउंटर ले जहाँ भी इस कोड अंत तक के लिए होता है और ध्यान रखा निर्देर्शों के आधार पर वापसी पता की गणना करता है, अगर आप mov r1, पीसी और bx r2 आप के बीच कि शिक्षा अनुक्रम बदलने करता है जोड़ को फिर से शुरू करना है। अब हम ऐसा कुछ क्यों नहीं कर सकते:

add r1,pc,#1 
bx r2 

अंगूठे निर्देशों के साथ आप थंब 2 के साथ संभवतः कर सकते हैं। और कुछ प्रोसेसर (armv7) दिखाई देते हैं जो दोनों हाथ निर्देशों और अंगूठे/अंगूठे 2 का समर्थन करते हैं ताकि आप ऐसी परिस्थिति में हो जहां आप ऐसा करना चाहते हैं, लेकिन आप # 1 जोड़ नहीं पाएंगे क्योंकि अंगूठे 2 निर्देश जोड़ते हैं, यदि कोई है जो ऊपरी रजिस्टरों की अनुमति देता है और तीन ऑपरेंड 4 बाइट अंगूठे 2 निर्देश होंगे। (आपको # 3 जोड़ना होगा)।

तो testthumb5 सीधे उस कोड से है जो मैंने आपको दिखाया है जो इस प्रश्न का हिस्सा बनता है, और यह दुर्घटनाग्रस्त हो जाता है। ऐसा नहीं है कि यह कैसे काम करता है, माफ करना, मैं लोगों को गुमराह करता हूं, मैं वापस जाने और उन प्रश्नों को पैच करने की कोशिश करूंगा जिनके साथ मैंने इसका इस्तेमाल किया था।

testthumb6 यह सुनिश्चित करने के लिए एक प्रयोग है कि हम सभी पागल नहीं हैं। सब ठीक है लिंक रजिस्टर वास्तव में lsbit सेट प्राप्त करता है ताकि जब आप बीएक्स एलआर बाद में उस मोड से मोड को जानते हों।

testthumb7, यह एआरएम साइड ट्रैम्पोलिन से लिया गया है, जिसे आप बांह मोड से अंगूठे मोड में जाने पर लिंकर देखते हैं, हालांकि इस मामले में मैं थंब मोड से आर्म मोड में जा रहा हूं। लिंकर इसे इस तरह क्यों नहीं कर सकता? क्योंकि थंब मोड में कम से कम आपको कम रजिस्टर का उपयोग करना होगा और इस बिंदु पर गेम में संकलित होने के बाद लिंकर को यह जानने का कोई तरीका नहीं है कि यह किस ट्रैश को ट्रैश कर सकता है। आर्म मोड में हालांकि आईपी रजिस्टर, यह सुनिश्चित नहीं है कि शायद आर 12 क्या हो, ट्रैश हो सकता है, मुझे लगता है कि यह कंपाइलर के उपयोग के लिए आरक्षित है। मुझे इस मामले में पता है कि आर 1 ट्रैश हो सकता है और इसका इस्तेमाल किया जा सकता है, और यह वांछित के रूप में काम करता है। आर्म्बॉन्स कोड को कॉल किया जाता है, जहां लिंक रजिस्टर होता है, जहां वापस लौटना है, जो testthumb7 फ़ंक्शन में bl armbounce_thumb के बाद अंगूठे निर्देश (lsbit set) है, जहां हम इसे चाहते थे।

testthumb8 इस प्रकार gnu लिंकर यह करता है जब इसे थंब मोड से आर्म मोड तक प्राप्त करने की आवश्यकता होती है। ब्लू निर्देश एक trampoline पर जाने के लिए सेट है।तो वे कुछ बहुत मुश्किल और पागल दिखते हैं।

d6008140 <armbounce_thumb_two>: 
d6008140: 4778  bx pc 
d6008142: 46c0  nop   ; (mov r8, r8) 
d6008144: eaffffdc b d60080bc <armbounce> 

एक बीएक्स पीसी। हम उपरोक्त प्रयोगों से जानते हैं कि पीसी चार बाइट आगे है, हम यह भी जानते हैं कि lsbit सेट नहीं है। तो यह क्या कह रहा है एआरएम कोड के लिए शाखा है जो इस के बाद चार बाइट्स है। एनओपी एक दो बाइट स्पेसर है, फिर हमें एक चार बीईटी बाउंडरी पर एआरएम निर्देश तैयार करना होगा और एक बाईटी बाउंडरी पर हस्ताक्षर करना होगा, और हम जो भी जगह जा रहे थे, उसके लिए हम बिना शर्त शाखा बनाते हैं, यह अब कुछ या एलडीआर पीसी हो सकता है , = कुछ इस बात पर निर्भर करता है कि आपको कितनी दूर जाना है। बहुत मुश्किल

मूल bl arm_bounce_thumb_two उस ब्लॉ के बाद निर्देश पर लौटने के लिए लिंक रजिस्टर सेट अप करता है। ट्रैम्पोलिन लिंक रजिस्टर को संशोधित नहीं करता है, यह केवल शाखाएं करता है।

आप हाथ से अंगूठे मोड को पाने के लिए तो क्या लिंकर करता है चाहते हैं:

... 
bl myfun_from_arm 
... 


myfun_from_arm: 
    ldr ip,[pc] 
    bx ip 
.word myfun 

जो इस तरह दिखता है जब वे यह कर (0xD6008xxx पर नहीं लेकिन 0x0001xxxx पर एक अलग द्विआधारी से पकड़ा)।

101f8: eb00003a bl 102e8 <__testthumb1_from_arm> 


000102e8 <__testthumb1_from_arm>: 
    102e8: e59fc000 ldr ip, [pc] ; 102f0 <__testthumb1_from_arm+0x8> 
    102ec: e12fff1c bx ip 
    102f0: 00010147 andeq r0, r1, r7, asr #2 

इसलिए जो कुछ भी इस आईपी रजिस्टर (r12?) है वे मन यह trashing न और मुझे लगता है कि आप इसे अपने आप को मिटाए गए ईमेल में स्वागत है।

+0

बिल्कुल आपके उत्तर और प्रयास को प्यार करता है। यह भी मैं इस असंगत फर्मवेयर में देख रहा हूं कि मैं काम कर रहा हूं। और यह मेरे परीक्षण में दुर्घटनाओं को समझाता है (एम्यूलेटर का उपयोग नहीं किया गया .. बस सीधे संशोधित फर्मवेयर और फ्लैश चिप लोड किया गया .. एलओएल) फर्मवेयर में एआरएम मोड कोड है, निचले हिस्से में, और केवल मुख्य ऐप भाग के लिए अंगूठे कोड । लेकिन हां, इस तरह यह थंब टू आर्म एंड आर्म टू थंब को करता है। इस फर्मवेयर को एडीएस बनाम 1.2 बीटीडब्ल्यू के साथ संकलित किया गया था। – vmanta

+0

इसके अलावा, जहां तक ​​मैं पढ़ सकता हूं और जहां तक ​​मैंने पढ़ा है, अंगूठे मोड में (अंगूठे 1 .. अगर ऐसी चीज है) तो आप R0-R3 को मिटा सकते हैं, लेकिन आपको पुश/पॉप आर 4 - आर 7 । जिस फर्मवेयर को मैं देख रहा हूं वह यह करता है, और मैंने भी gnu gcc (arm-elf-gcc) से कोड देखा है। खैर .. यह बहुत अच्छा है कि आपने इन सभी परीक्षणों को किया है, क्योंकि मैंने अपने फर्मवेयर मोड में डिवाइस पर ऐसा ही किया है, लेकिन फिर भी कभी-कभी मैं इतनी उलझन में पड़ता हूं (विशेष रूप से जब अन्य गलतियों के कारण दुर्घटनाएं होती हैं) कि मैं बीएल (बट में दर्द .... ऑफसेट की गणना के साथ, जैसा कि मैंने समझाया) – vmanta

+0

मैं एक प्रोग्राम लिखने वाला हूं जिसे "एएस" के लिए प्रीप्रोसेसर के रूप में इस्तेमाल किया जा रहा है और मेरे लिए मेरे ऑफसेट सेट करें ... शायद कुछ विशेष नोटेशन का उपयोग करें। .. बीएल एडीआर की तरह: 0x24000, और मेरे लिए इस ऑफसेट की गणना करने के लिए मेरे कार्यक्रम ... आह .. यह अद्भुत होगा .. क्यों कोई भी उस लॉल के बारे में सोचा नहीं ... शायद एक रास्ता है, मैं बस नहीं इसे अभी तक पता है .. और यदि कोई तरीका है तो मुझे लगता है कि यह लिंकर में किसी तरह का निर्देश होगा .. पता नहीं, लेकिन मैंने पढ़ा और पढ़ा .. बहुत अधिक समय बिताया। अरे बहुत बहुत धन्यवाद ... और खुशी है कि आपको सत्य मिला .. हे – vmanta

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