Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ARM Assembly

Başlatan gerbay, 14 Mart 2012, 21:39:07

gerbay

Arkadaşlar flat assembler diye bir assembler var, x86 için kod üretiyordu. open source ve kendisi de assembly ile yazılma..

Eleman ARM için de çıkarmış, tüm ARM ları desteklediğini yazıyor. opensource..

http://arm.flatassembler.net/      linkinden arm için olan sürümünü indirebilirsiniz

x86 için olan sürüm de şurada;  http://flatassembler.net/

özellikle makro desteği de çok güçlü bir assembler

Özellikle Bülent hocamın beğeneceğini düşünüyorum..



Burak B

Vay bak sen FASM' a :) RadAsm ile kullanılıyormu diye bakmak lazım.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

Erol YILMAZ

ASM ne olursa olsun lazım diye düşünüyorum...

Hatta biraz da deneme yapacağım...

MC_Skywalker

bir zamanlar  Sourcery CodeBench Lite Edition for ARM EABI kullanarak ARM ASM denemelerim olmuştu


Alıntı yapılan: MC_Skywalker - 29 Mayıs 2012, 12:42:02
örnek:
ornek1.s
/* 10+9+8+7+5+4+3+2+1 toplaması */
       .equ    STACK_TOP, 0x20000800
       .text
       .syntax unified
       .thumb
       .global _start
       .type start , %function
_start:
       .word STACK_TOP, start
start:
       movs r0, #10
       movs r1, #0
loop:
       adds r1, r0
       subs r0, #1
       bne loop
deadloop:
       b    deadloop
       .end


Programımız yukarıda görüldüğü gibi. derleyicimiz komut satırı derleyicisi olduğu için tüm herşeyi elle yapmamız gerekmekte.

c:\>arm-none-eabi-as -mcpu=cortex-m3 -mthumb ornek1.s -o ornek1.o


yukarıda ki ilk komutumuzda; Assembler kullanarak Cotrex M3 işlemcimize thumb komut kümesi ile Obje dosyamızı oluşturuyoruz.

c:\>arm-none-eabi-ld -Ttext 0x0 -o ornek1.out ornek1.o


yukarıda ki ikinci komutumuzda linker kullanarak Obje dosyamızdan OUTput çıktı dosyamızı oluşturuyoruz.

c:\>arm-none-eabi-objcopy -Obinary onrnek1.out ornek1.bin


Yukarıdaki üçüncü komutumuzu kullanarak elde etiğimiz OUTput çıktı dosyamızı BINary formata çeviriyoruz.

c:\>arm-none-eabi-objdump -S ornek1.out > ornek1.list


Son komutumuz ile Disassembled listemizi oluşturuyoruz.

ornek1.out:     file format elf32-littlearm


Disassembly of section .text:

00000000 <_start>:
   0:	20000800 	.word	0x20000800
   4:	00000009 	.word	0x00000009

00000008 <start>:
   8:	200a      	movs	r0, #10
   a:	2100      	movs	r1, #0

0000000c <loop>:
   c:	1809      	adds	r1, r1, r0
   e:	3801      	subs	r0, #1
  10:	f47f affc 	bne.w	c <loop>

00000014 <deadloop>:
  14:	f7ff bffe 	b.w	14 <deadloop>


pisayisi

Arm serisi için asm ile uğraşan pek insan yok, aşağıda manley firmasının asm ile yazılmış bir basit led flash uygulaması fikir olabilir. Özellikle bit31 satırına kadar olan kısmı şablon olarak herzaman kullanabilirsiniz. Systik kullanılarak yapılmış led yan sön uygulaması. Çinliler bir ara st nin firmware lerini kullanmadan hep register tabanlı kodlar yazıyorlardı. Onlarda işin içinde çıkamadığı için kopyala yapıştır firmware tabanlı kodlar yazıyor. kimse spi , adc , usb dac i2s aklına ne gelirse registerlar ile uğraşmıyor. Şimdi akıl yorulan RTOS buna bağlı hızlı bir GUi ve dokunmatik bir ekranda herşeyin kontrol altında olduğu endüstriyel ya da kontrol ya da eğlence amaçlı uygulamalar. Kimse kod geliştirme aşamasında zaman kaybetmek istemez, yok ben herşeyi ile öğrenmek istiyorum derseniz 1000 sayfanın üstünde register kodları sizleri bekliyor ;D

;RCC¼Ä´æÆ÷µØÖ·Ó³Ïñ
RCC_BASE                EQU             0x40021000
RCC_CR                  EQU             (RCC_BASE + 0x00)
RCC_CFGR                EQU             (RCC_BASE + 0x04)
RCC_CIR                 EQU             (RCC_BASE + 0x08)
RCC_APB2RSTR            EQU             (RCC_BASE + 0x0C)
RCC_APB1RSTR            EQU             (RCC_BASE + 0x10)
RCC_AHBENR              EQU             (RCC_BASE + 0x14)
RCC_APB2ENR             EQU             (RCC_BASE + 0x18)
RCC_APB1ENR             EQU             (RCC_BASE + 0x1C)
RCC_BDCR                EQU             (RCC_BASE + 0x20)
RCC_CSR                 EQU             (RCC_BASE + 0x24)
;GPIO¼Ä´æÆ÷µØÖ·Ó³Ïñ
GPIOC_BASE              EQU             0x40011000
GPIOC_CRL               EQU             (GPIOC_BASE + 0x00)
GPIOC_CRH               EQU             (GPIOC_BASE + 0x04)
GPIOC_IDR               EQU             (GPIOC_BASE + 0x08)
GPIOC_ODR               EQU             (GPIOC_BASE + 0x0C)
GPIOC_BSRR              EQU             (GPIOC_BASE + 0x10)
GPIOC_BRR               EQU             (GPIOC_BASE + 0x14)
GPIOC_LCKR              EQU             (GPIOC_BASE + 0x18)
;AFIO¼Ä´æÆ÷µØÖ·Ó³Ïñ
AFIO_BASE               EQU             0x40010000
AFIO_EVCR               EQU             (AFIO_BASE + 0x00)
AFIO_MAPR               EQU             (AFIO_BASE + 0x04)
AFIO_EXTICR1            EQU             (AFIO_BASE + 0x08)
AFIO_EXTICR2            EQU             (AFIO_BASE + 0x0C)
AFIO_EXTICR3            EQU             (AFIO_BASE + 0x10)
AFIO_EXTICR4            EQU             (AFIO_BASE + 0x14)
;NVIC¼Ä´æÆ÷µØÖ·Ó³Ïñ
NVIC_BASE               EQU             0xE000E000
NVIC_SETEN              EQU             (NVIC_BASE + 0x0010)    ;SETENA¼Ä´æÆ÷ÕóÁеÄÆğʼµØÖ·
NVIC_IRQPRI             EQU             (NVIC_BASE + 0x0400)    ;ÖжÏÓÅÏȼ¶¼Ä´æÆ÷ÕóÁеÄÆğʼµØÖ·
NVIC_VECTTBL            EQU             (NVIC_BASE + 0x0D08)    ;ÏòÁ¿±íÆ«ÒƼĴæÆ÷µÄµØÖ·
NVIC_AIRCR              EQU             (NVIC_BASE + 0x0D0C)    ;Ó¦ÓóÌĞòÖжϼ°¸´Î»¿ØÖƼĴæÆ÷µÄµØÖ·

SETENA0                 EQU             0xE000E100
SETENA1                 EQU             0xE000E104
;SysTick¼Ä´æÆ÷µØÖ·Ó³Ïñ
SysTick_BASE            EQU             0xE000E010
SYSTICKCSR              EQU             (SysTick_BASE + 0x00)
SYSTICKRVR              EQU             (SysTick_BASE + 0x04)
;;FLASH»º³å¼Ä´æÆ÷µØÖ·Ó³Ïñ
FLASH_ACR               EQU             0x40022000

;SCB_BASE                EQU             (SCS_BASE + 0x0D00)
;-----------------
MSP_TOP                 EQU             0x20005000              ;Ö÷¶ÑÕ»Æğʼֵ
PSP_TOP                 EQU             0x20004E00              ;½ø³Ì¶ÑÕ»Æğʼֵ

BitAlias_BASE           EQU             0x22000000              ;λ´ø±ğÃûÇøÆğʼµØÖ·
Flag1                   EQU             0x20000200
b_flas                  EQU             (BitAlias_BASE + (0x200*32) + (0*4))              ;λµØÖ·
b_05s                   EQU             (BitAlias_BASE + (0x200*32) + (1*4))              ;λµØÖ·
DlyI                    EQU             0x20000204
DlyJ                    EQU             0x20000208
DlyK                    EQU             0x2000020C
SysTim                  EQU             0x20000210

;³£Êı¶¨Òå---------
Bit0                    EQU             0x00000001
Bit1                    EQU             0x00000002
Bit2                    EQU             0x00000004
Bit3                    EQU             0x00000008
Bit4                    EQU             0x00000010
Bit5                    EQU             0x00000020
Bit6                    EQU             0x00000040
Bit7                    EQU             0x00000080
Bit8                    EQU             0x00000100
Bit9                    EQU             0x00000200
Bit10                   EQU             0x00000400
Bit11                   EQU             0x00000800
Bit12                   EQU             0x00001000
Bit13                   EQU             0x00002000
Bit14                   EQU             0x00004000
Bit15                   EQU             0x00008000
Bit16                   EQU             0x00010000
Bit17                   EQU             0x00020000
Bit18                   EQU             0x00040000
Bit19                   EQU             0x00080000
Bit20                   EQU             0x00100000
Bit21                   EQU             0x00200000
Bit22                   EQU             0x00400000
Bit23                   EQU             0x00800000
Bit24                   EQU             0x01000000
Bit25                   EQU             0x02000000
Bit26                   EQU             0x04000000
Bit27                   EQU             0x08000000
Bit28                   EQU             0x10000000
Bit29                   EQU             0x20000000
Bit30                   EQU             0x40000000
Bit31                   EQU             0x80000000
;ÏòÁ¿±í*********************************************************************************
                AREA            RESET, DATA, READONLY

                DCD             MSP_TOP                   ;³õʼ»¯Ö÷¶ÑÕ»
                DCD             Start                     ;¸´Î»ÏòÁ¿
                DCD             NMI_Handler               ;NMI Handler
                DCD             HardFault_Handler         ;Hard Fault Handler
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             0
                DCD             SysTick_Handler           ; SysTick Handler
                SPACE           200
;***************************************************************************************
                AREA            |.text|, CODE, READONLY
;Ö÷³ÌĞò¿ªÊ¼
                ENTRY                           ;ָʾ³ÌĞò´ÓÕâÀ↑ʼִĞĞ
Start
;ʱÖÓϵͳÉèÖÃ
                ;Æô¶¯Íⲿ8M¾§Õñ
                ldr             r0,=RCC_CR
                ldr             r1,[r0]
                orr             r1,#Bit16
                str             r1,[r0]
ClkOk
                ldr             r1,[r0]
                ands            r1,#Bit17
                beq             ClkOk
                ldr             r1,[r0]
                orr             r1,#Bit17
                str             r1,[r0]
                ;FLASH»º³åÆ÷
                ldr             r0,=FLASH_ACR
                mov             r1,#0x00000032
                str             r1,[r0]
                ;ÉèÖÃPLLËøÏà»·±¶ÂÊΪ7,HSEÊäÈë²»·ÖƵ
                ldr             r0,=RCC_CFGR
                ldr             r1,[r0]
                orr             r1,#Bit18 | Bit19 | Bit20 | Bit16 | Bit14
                orr             r1,#Bit10
                str             r1,[r0]
                ;Æô¶¯PLLËøÏà»·
                ldr             r0,=RCC_CR
                ldr             r1,[r0]
                orr             r1,#Bit24
                str             r1,[r0]
PllOk
                ldr             r1,[r0]
                ands            r1,#Bit25
                beq             PllOk
                ;Ñ¡ÔñPLLʱÖÓ×÷ΪϵͳʱÖÓ
                ldr             r0,=RCC_CFGR
                ldr             r1,[r0]
                orr             r1,#Bit18 | Bit19 | Bit20 | Bit16 | Bit14
                orr             r1,#Bit10
                orr             r1,#Bit1
                str             r1,[r0]
                ;ÆäËüRCCÏà¹ØÉèÖÃ
                ldr             r0,=RCC_APB2ENR
                mov             r1,#Bit4
                str             r1,[r0]
;IO¶Ë¿ÚÉèÖÃ
                ldr             r0,=GPIOC_CRL
                ldr             r1,[r0]
                orr             r1,#Bit16 | Bit17         ;PC.4Êä³öģʽ£¬×î´óËÙ¶È50MHz 
                and             r1,#~Bit18 & ~Bit19       ;PC.4ͨÓÃÍÆÍìÊä³öģʽ
                str             r1,[r0]
;AFIO ²ÎÊıÉèÖÃ
                
;Systick ²ÎÊıÉèÖÃ
                ldr             r0,=SYSTICKRVR          ;Systick×°³õÖµ
                mov             r1,#9000
                str             r1,[r0]
                ldr             r0,=SYSTICKCSR          ;É趨¡¢Æô¶¯Systick
                mov             r1,#0x03
                str             r1,[r0]
;NVIC
                ;ldr             r0,=SETENA0
                ;mov             r1,0x00800000
                ;str             r1,[r0]
                ;ldr             r0,=SETENA1
                ;mov             r1,#0x00000100
                ;str             r1,[r0]
;ÇĞ»»³ÉÓû§¼¶Ïß³ÌĞòģʽ
                ldr             r0,=PSP_TOP                  ;³õʼ»¯Ï̶߳ÑÕ»
                msr             psp,r0
                mov             r0,#3
                msr             control,r0
;³õʼ»¯SRAM¡¢¼Ä´æÆ÷
                mov             r1,#0
                ldr             r0,=Flag1
                str             r1,[r0]
                ldr             r0,=DlyI
                str             r1,[r0]
                ldr             r0,=DlyJ
                str             r1,[r0]
                ldr             r0,=DlyK
                str             r1,[r0]
                ldr             r0,=SysTim
                str             r1,[r0]
;Ö÷Ñ­»·=================================================================================
main
                ldr             r0,=Flag1
                ldr             r1,[r0]
                tst             r1,#Bit1                ;SysTick²úÉú0.5s
                beq             main                    ;Ö÷³ÌĞò0.5s×ßÒ»´Î
                ldr             r0,=b_05s               ;λ´ø²Ù×÷ÇåÁã0.5s±êÖ¾
                mov             r1,#0
                str             r1,[r0]
                bl              LedFlas
                b               main
;×Ó³ÌĞò**********************************************************************************
LedFlas
                push            {r0-r3}
                ldr             r0,=Flag1
                ldr             r1,[r0]
                tst             r1,#Bit0
                beq             ONLED
                
                ldr             r0,=b_flas
                mov             r1,#0
                str             r1,[r0]
                ;PC.4Êä³ö1
                ldr             r0,=GPIOC_BRR
                ldr             r1,[r0]
                orr             r1,#Bit4
                str             r1,[r0]
                b               LedEx
ONLED
                ldr             r0,=b_flas
                mov             r1,#1
                str             r1,[r0]
                ;PC.4Êä³ö0
                ldr             r0,=GPIOC_BSRR
                ldr             r1,[r0]
                orr             r1,#Bit4
                str             r1,[r0]
LedEx
                pop            {r0-r3}
                bx              lr
;Òì³£³ÌĞò*******************************************************************************
NMI_Handler
                ;xxxxxxxxxxxxxxxxxx
                bx              lr
;-----------------------------
HardFault_Handler
                ;xxxxxxxxxxxxxxxxxx
                bx              lr
;-----------------------------
SysTick_Handler
                ldr             r0,=SysTim
                ldr             r1,[r0]
                add             r1,#1
                str             r1,[r0]
                cmp             r1,#500
                bcc             TickExit
                mov             r1,#0
                str             r1,[r0]
                ldr             r0,=b_05s               ;λ´ø²Ù×÷ÖÃ1
                mov             r1,#1
                str             r1,[r0]
TickExit
                bx              lr
;***************************************************************************************
                ALIGN           ;ͨ¹ıÓÃÁã»ò¿ÕÖ¸ÁîNOPÌî³ä£¬À´Ê¹µ±Ç°Î»ÖÃÓëÒ»¸öÖ¸¶¨µÄ±ß½ç¶ÔÆë
;-----------------------------
                END
Murat