كتابة البيانات إلى العنوان المطلق
سؤال
أقوم حاليًا باللعب قليلاً مع المجمّع على وحدة التحكم الدقيقة Cortex-M3.لست متأكدًا مما إذا كان هذا مهمًا، ولكن تفضل.
أحتاج إلى كتابة قيمة إلى عنوان معين في الذاكرة.وهنا ما حاولت:
LDR R4, =__cs3_interrupt_vector_cortex_m
STR R4, [=VTOR]
ولكن يبدو أنني بحاجة إلى الرجوع إلى عنوان VTOR المتعلق بسجل الكمبيوتر.السؤال هو ما إذا كانت هناك طريقة لعدم الإشارة إلى العنوان النسبي والسماح بذلك تلقائيًا (بحيث يبدو بشكل أساسي مثل نهجي).
أنا أستخدم مجمع جنو.
المحلول
تحتاج إلى تحميل عنوان الوجهة إلى السجل.أفترض ذلك VTOR
هو عنوان الذاكرة أو مؤشر "C" و __cs3_interrupt_vector_cortex_m
هو ثابت.أي أنك ترغب في كتابة ثابت 32 بت إلى عنوان ما.إذا كان هذا هو الحال إذن،
; Get value __cs3_interrupt_vector_cortex_m to r4
ldr r4, =__cs3_interrupt_vector_cortex_m
ldr r5, =VTOR ; address 'VTOR' to r5.
str r4, [r5] ; write the constant to 'VTOR' address.
ARM/Thumb/Thumb2 هو أ مخزن التحميل بنيان.لا يمكنك استخدام معاملات الذاكرة في تعليمات التحميل والتخزين.يعمل هذا على تبسيط تصميم وحدة المعالجة المركزية، ولكنه يختلف عن المجمّع M68K وx86.
بناء الجملة ldr rX, =val
تم شرحه في صفحات معلومات مجمع Gnu.بشكل عام سوف يتحول إلى ما يلي ،
ldr rX, [pc, #offset]
...
offset: .word val ; your constant is stored here.
ال المرجع الزائف .ltorg
يخبر المجمّع بتفريغ الجدول الحرفي؛ال عوض جزء من الكود أعلاه.يمكنك إضافة .ltorg
في أي مكان بين الإجراءات الفرعية، وما إلى ذلك.
لا يمكنك استخدام بناء الجملة str r4,[=VTOR]
كما يساوي بناء الجملة هو مجرد اختصار للاستخدام مع ldr
.على سبيل المثال،
ldr rX,=7 ; is really 'mov rx,#7' in all modes.
ldr rX,=0xff ; is 'mov rx,#0xff' for ARM and '[pc,#offset]' for thumb.
ldr rx,=0x12345678 ; will use the [pc, #offset] for all modes.
يمكنك استخدام ال ldr rX,=VTOR
بناء الجملة للحصول على عنوان التسجيل.ثم يستغرق الأمر تعليمات أخرى مثل str rY, [rX]
للكتابة فعلا إلى هذا العنوان.
يتم ترميز الثوابت داخل التعليمات وبالتالي فإن النطاق الثابت محدود للغاية خاصة في إبهام وضع.أعتقد أنك تستخدم الإبهام2 والتي قد يكون لها نطاق أكبر.