Advertisement
Guest User

ARM lab_7

a guest
Dec 3rd, 2018
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 13.29 KB | None | 0 0
  1. ;            Computer Architectures - 02LSEOV 02LSEOQ            ;
  2. ; author:       Paolo BERNARDI - Politecnico di Torino           ;
  3. ; creation:     11 November 2018                                 ;
  4. ; last update:  13 November 2018                                 ;
  5. ; functionalities:                                               ;
  6. ;       nothing but bringing to the reset handler                ;
  7.  
  8. ; *------- <<< Use Configuration Wizard in Context Menu >>> ------------------
  9.  
  10. ; <h> Stack Configuration
  11. ;   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
  12. ; </h>
  13.  
  14. Stack_Size      EQU     0x00000200
  15.  
  16.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3
  17. Stack_Mem       SPACE   Stack_Size
  18. __initial_sp
  19.  
  20.  
  21. ; <h> Heap Configuration
  22. ;   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
  23. ; </h>
  24.  
  25. Heap_Size       EQU     0x00000200
  26.  
  27.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3
  28. __heap_base
  29. Heap_Mem        SPACE   Heap_Size
  30. __heap_limit
  31.  
  32.  
  33.                 PRESERVE8
  34.                 THUMB
  35.  
  36.  
  37. ; Vector Table Mapped to Address 0 at Reset
  38.  
  39.                 AREA    RESET, DATA, READONLY
  40.                 EXPORT  __Vectors
  41.  
  42. __Vectors       DCD     __initial_sp              ; Top of Stack
  43.                 DCD     Reset_Handler             ; Reset Handler
  44.                 DCD     NMI_Handler               ; NMI Handler
  45.                 DCD     HardFault_Handler         ; Hard Fault Handler
  46.                 DCD     MemManage_Handler         ; MPU Fault Handler
  47.                 DCD     BusFault_Handler          ; Bus Fault Handler
  48.                 DCD     UsageFault_Handler        ; Usage Fault Handler
  49.                 DCD     0                         ; Reserved
  50.                 DCD     0                         ; Reserved
  51.                 DCD     0                         ; Reserved
  52.                 DCD     0                         ; Reserved
  53.                 DCD     SVC_Handler               ; SVCall Handler
  54.                 DCD     DebugMon_Handler          ; Debug Monitor Handler
  55.                 DCD     0                         ; Reserved
  56.                 DCD     PendSV_Handler            ; PendSV Handler
  57.                 DCD     SysTick_Handler           ; SysTick Handler
  58.  
  59.                 ; External Interrupts
  60.                 DCD     WDT_IRQHandler            ; 16: Watchdog Timer
  61.                 DCD     TIMER0_IRQHandler         ; 17: Timer0
  62.                 DCD     TIMER1_IRQHandler         ; 18: Timer1
  63.                 DCD     TIMER2_IRQHandler         ; 19: Timer2
  64.                 DCD     TIMER3_IRQHandler         ; 20: Timer3
  65.                 DCD     UART0_IRQHandler          ; 21: UART0
  66.                 DCD     UART1_IRQHandler          ; 22: UART1
  67.                 DCD     UART2_IRQHandler          ; 23: UART2
  68.                 DCD     UART3_IRQHandler          ; 24: UART3
  69.                 DCD     PWM1_IRQHandler           ; 25: PWM1
  70.                 DCD     I2C0_IRQHandler           ; 26: I2C0
  71.                 DCD     I2C1_IRQHandler           ; 27: I2C1
  72.                 DCD     I2C2_IRQHandler           ; 28: I2C2
  73.                 DCD     SPI_IRQHandler            ; 29: SPI
  74.                 DCD     SSP0_IRQHandler           ; 30: SSP0
  75.                 DCD     SSP1_IRQHandler           ; 31: SSP1
  76.                 DCD     PLL0_IRQHandler           ; 32: PLL0 Lock (Main PLL)
  77.                 DCD     RTC_IRQHandler            ; 33: Real Time Clock
  78.                 DCD     EINT0_IRQHandler          ; 34: External Interrupt 0
  79.                 DCD     EINT1_IRQHandler          ; 35: External Interrupt 1
  80.                 DCD     EINT2_IRQHandler          ; 36: External Interrupt 2
  81.                 DCD     EINT3_IRQHandler          ; 37: External Interrupt 3
  82.                 DCD     ADC_IRQHandler            ; 38: A/D Converter
  83.                 DCD     BOD_IRQHandler            ; 39: Brown-Out Detect
  84.                 DCD     USB_IRQHandler            ; 40: USB
  85.                 DCD     CAN_IRQHandler            ; 41: CAN
  86.                 DCD     DMA_IRQHandler            ; 42: General Purpose DMA
  87.                 DCD     I2S_IRQHandler            ; 43: I2S
  88.                 DCD     ENET_IRQHandler           ; 44: Ethernet
  89.                 DCD     RIT_IRQHandler            ; 45: Repetitive Interrupt Timer
  90.                 DCD     MCPWM_IRQHandler          ; 46: Motor Control PWM
  91.                 DCD     QEI_IRQHandler            ; 47: Quadrature Encoder Interface
  92.                 DCD     PLL1_IRQHandler           ; 48: PLL1 Lock (USB PLL)
  93.                 DCD     USBActivity_IRQHandler    ; 49: USB Activity interrupt to wakeup
  94.                 DCD     CANActivity_IRQHandler    ; 50: CAN Activity interrupt to wakeup
  95.  
  96.  
  97.                 IF      :LNOT::DEF:NO_CRP
  98.                 AREA    |.ARM.__at_0x02FC|, CODE, READONLY
  99. CRP_Key         DCD     0xFFFFFFFF
  100.                 ENDIF
  101.  
  102.  
  103.                 AREA    |.text|, CODE, READONLY
  104.  
  105.  
  106. ; Reset Handler
  107.  
  108. Reset_Handler   PROC
  109.                 EXPORT  Reset_Handler             [WEAK]                                            
  110.                 LDR     R0, =Reset_Handler
  111.                
  112.             ; your code here
  113. list_mem    RN  0
  114. i           RN  1
  115. cod         RN  2
  116. prices      RN  3
  117. list_pool   RN  4
  118.  
  119.             LDR     list_mem,   =list_Price-8                   ;begin the writing of the memory using the values contained in the literal pool
  120.             LDR     list_pool,  =Price_list-8
  121.                
  122. mem         LDRD    cod, prices,    [list_pool,#8]!             ;Price_list[i]->data
  123.             STRD    cod, prices,    [list_mem,#8]!              ;data->list_Price[i] (we write the mem with the content of R2)
  124.             ADD     i,  #1
  125.             CMP     i,  #28
  126.             BNE     mem
  127.             LDR     list_mem, =list_Price
  128.  
  129.             ; Selection Sort
  130.  
  131. l           EQU 0
  132. r           EQU 27
  133.  
  134. j           RN  2
  135. min         RN  3
  136. temp        RN  4
  137. cod_j       RN  5
  138. cod_min     RN  6
  139. price_min   RN  7
  140. cod_temp    RN  8
  141. price_temp  RN  9
  142. list_i      RN  10
  143. list_min    RN  11
  144.            
  145.             MOV     i,#l
  146. for_1       CMP     i,#r                            ;for(i=l;i<r;i++)
  147.             BHS     __main                          ;'if i>=r go to __main'
  148.             MOV     min,i
  149.             MOV     j,i
  150.             ADD     j,j,#1                          ;'j=j+1'
  151.  
  152. for_2       CMP     j,#r                            ;for(j=i+1;j<=r;j++)
  153.             ADDHI   i,i,#1                          ;'if j>r exit for_2 and i++'
  154.             BHI     for_1
  155.             LSL     j,j,#3                          ;'multiply by 8 (2^3) to access the right portion of the mem'
  156.             LSL     min,min,#3
  157.             LDR     cod_j,[list_mem,j]              ;cod[j] (only needed to compare with cod[min], price[j] useless)
  158.             ADD     list_min,list_mem,min           ;'calculate address of data[min], necessary because STRD/LDRD cannot allow to use a register as offset'
  159.             LDRD    cod_min,price_min, [list_min]   ;data[min]  (is both cod[min] and price[min])
  160.             LSR     j,j,#3                          ;'return to right value of j dividing by 8'
  161.             LSR     min,min,#3
  162.             CMP     cod_j,cod_min                   ;if(cod[j]<cod[min])
  163.             MOVLO   min,j                           ;min=j
  164.             LSL     i,i,#3
  165.             LSL     min,min,#3
  166.             ADD     list_i,list_mem,i
  167.             ADD     list_min,list_mem,min
  168.             LDRD    cod_min,price_min, [list_min]  
  169.             LDRD    cod_temp,price_temp,[list_i]    ;temp=data[i]
  170.             STRD    cod_min, price_min, [list_i]    ;data[i]=data[min]
  171.             MOV     min,i                           ;'swap index too'
  172.             STRD    cod_temp, price_temp,[list_min] ;data[min]=temp
  173.             LSR     i,i,#3
  174.             LSR     min,min,#3
  175.             ADD     j,j,#1                           ;'j++'
  176.             B       for_2
  177.  
  178.  
  179. __main
  180.    
  181. middle      RN 0
  182. item_add    RN 1
  183. list_add    RN 2
  184. index       RN 3
  185. first       RN 4
  186. last        RN 5
  187. key         RN 6
  188. table       RN 7
  189. price       RN 8
  190. quantity    RN 9
  191. sum         RN 10
  192.  
  193.             MOV     sum, #0
  194.             LDR     index, Item_num                 ;an LDRB instruction could be used instead of ALIGN in literal pool
  195.             LDR     item_add, =Item_list-8          ;-8 byte needed for retrieving the right data at first cycle
  196.             LDR     list_add, =list_Price
  197.  
  198. loop        LDR     key,[item_add,#8]!              ;for(i=0;i<4;i++)   key=item[i]
  199.  
  200.             MOV     first,#0
  201.             MOV     last,#27
  202.    
  203. while       CMP     last,first                      ;while(last>=first)
  204.             BLO     exit                            ;'if last<first exit'
  205.  
  206.             ADD     middle,last,first              
  207.             LSR     middle,middle,#1                ;middle=first+last/2
  208.             LSL     middle,middle,#3                ;'middle*8 (*4 to move from item, *2 to skip the price) to access to the right address in Price_list'
  209.             LDR     table, [list_add,middle]        ;'table[middle]'
  210.             CMP     table,key                       ;if(key==table[middle])
  211.        
  212.             ADDEQ   middle,middle,#4                ;'calculate the address of the price in Price_list'
  213.             LDREQ   price,[list_add,middle]    
  214.             LDREQ   quantity,[item_add,#4]
  215.             MLAEQ   sum,price,quantity,sum          ;sum+=price*quantity   
  216.             BEQ     exit                            ;break
  217.        
  218.             CMPNE   last,first                      ;if(table!=key && last=first) sum=0 return 0
  219.             MOVEQ   sum,#0
  220.             BEQ     InfLoop
  221.  
  222.             LSR     middle,middle,#3                ;'calculate the original value of middle not taking count of mul for addresses'
  223.             CMP     key,table
  224.             SUBLO   last,middle,#1                  ;if(key<table[middle]) last=middle-1
  225.             ADDHS   first,middle,#1                 ;else first=middle+1
  226.  
  227.             B       while
  228. exit
  229.             SUBS    index,index,#1
  230.             BNE     loop           
  231.                
  232. InfLoop         B   InfLoop
  233.             ALIGN          
  234. Price_list  DCD 0x010, 228, 0x012, 7,     0x007, 1210, 0x00A, 245                                      
  235.             DCD 0x004, 120, 0x006, 315,   0x016, 722,  0x017, 1217
  236.             DCD 0x04A, 265,  0x01A, 2222, 0x01B, 34,   0x01E, 11                 
  237.             DCD 0x022, 223,  0x023, 1249, 0x025, 240,  0x027, 112
  238.             DCD 0x02C, 2245, 0x02D, 410,  0x031, 840,  0x033, 945
  239.             DCD 0x036, 3211, 0x039, 112,  0x03C, 719,  0x03E, 661
  240.             DCD 0x042, 230,  0x045, 1112, 0x047, 2627, 0x018, 138
  241.  
  242.  
  243. Item_list   DCD 0x022, 14, 0x006, 431, 0x03E, 1210, 0x017, 56342
  244. Item_num    DCB 4
  245.             ALIGN 4                                 ;insert 4 byte of padding to align data
  246.                 ENDP
  247.  
  248.  
  249. ; Dummy Exception Handlers (infinite loops which can be modified)
  250.  
  251. NMI_Handler     PROC
  252.                 EXPORT  NMI_Handler               [WEAK]
  253.                 B       .
  254.                 ENDP
  255. HardFault_Handler\
  256.                 PROC
  257.                 EXPORT  HardFault_Handler         [WEAK]
  258.                 B       .
  259.                 ENDP
  260. MemManage_Handler\
  261.                 PROC
  262.                 EXPORT  MemManage_Handler         [WEAK]
  263.                 B       .
  264.                 ENDP
  265. BusFault_Handler\
  266.                 PROC
  267.                 EXPORT  BusFault_Handler          [WEAK]
  268.                 B       .
  269.                 ENDP
  270. UsageFault_Handler\
  271.                 PROC
  272.                 EXPORT  UsageFault_Handler        [WEAK]
  273.                 B       .
  274.                 ENDP
  275. SVC_Handler     PROC
  276.                 EXPORT  SVC_Handler               [WEAK]
  277.                 B       .
  278.                 ENDP
  279. DebugMon_Handler\
  280.                 PROC
  281.                 EXPORT  DebugMon_Handler          [WEAK]
  282.                 B       .
  283.                 ENDP
  284. PendSV_Handler  PROC
  285.                 EXPORT  PendSV_Handler            [WEAK]
  286.                 B       .
  287.                 ENDP
  288. SysTick_Handler PROC
  289.                 EXPORT  SysTick_Handler           [WEAK]
  290.                 B       .
  291.                 ENDP
  292.  
  293. Default_Handler PROC
  294.  
  295.                 EXPORT  WDT_IRQHandler            [WEAK]
  296.                 EXPORT  TIMER0_IRQHandler         [WEAK]
  297.                 EXPORT  TIMER1_IRQHandler         [WEAK]
  298.                 EXPORT  TIMER2_IRQHandler         [WEAK]
  299.                 EXPORT  TIMER3_IRQHandler         [WEAK]
  300.                 EXPORT  UART0_IRQHandler          [WEAK]
  301.                 EXPORT  UART1_IRQHandler          [WEAK]
  302.                 EXPORT  UART2_IRQHandler          [WEAK]
  303.                 EXPORT  UART3_IRQHandler          [WEAK]
  304.                 EXPORT  PWM1_IRQHandler           [WEAK]
  305.                 EXPORT  I2C0_IRQHandler           [WEAK]
  306.                 EXPORT  I2C1_IRQHandler           [WEAK]
  307.                 EXPORT  I2C2_IRQHandler           [WEAK]
  308.                 EXPORT  SPI_IRQHandler            [WEAK]
  309.                 EXPORT  SSP0_IRQHandler           [WEAK]
  310.                 EXPORT  SSP1_IRQHandler           [WEAK]
  311.                 EXPORT  PLL0_IRQHandler           [WEAK]
  312.                 EXPORT  RTC_IRQHandler            [WEAK]
  313.                 EXPORT  EINT0_IRQHandler          [WEAK]
  314.                 EXPORT  EINT1_IRQHandler          [WEAK]
  315.                 EXPORT  EINT2_IRQHandler          [WEAK]
  316.                 EXPORT  EINT3_IRQHandler          [WEAK]
  317.                 EXPORT  ADC_IRQHandler            [WEAK]
  318.                 EXPORT  BOD_IRQHandler            [WEAK]
  319.                 EXPORT  USB_IRQHandler            [WEAK]
  320.                 EXPORT  CAN_IRQHandler            [WEAK]
  321.                 EXPORT  DMA_IRQHandler            [WEAK]
  322.                 EXPORT  I2S_IRQHandler            [WEAK]
  323.                 EXPORT  ENET_IRQHandler           [WEAK]
  324.                 EXPORT  RIT_IRQHandler            [WEAK]
  325.                 EXPORT  MCPWM_IRQHandler          [WEAK]
  326.                 EXPORT  QEI_IRQHandler            [WEAK]
  327.                 EXPORT  PLL1_IRQHandler           [WEAK]
  328.                 EXPORT  USBActivity_IRQHandler    [WEAK]
  329.                 EXPORT  CANActivity_IRQHandler    [WEAK]
  330.  
  331. WDT_IRQHandler
  332. TIMER0_IRQHandler
  333. TIMER1_IRQHandler
  334. TIMER2_IRQHandler
  335. TIMER3_IRQHandler
  336. UART0_IRQHandler
  337. UART1_IRQHandler
  338. UART2_IRQHandler
  339. UART3_IRQHandler
  340. PWM1_IRQHandler
  341. I2C0_IRQHandler
  342. I2C1_IRQHandler
  343. I2C2_IRQHandler
  344. SPI_IRQHandler
  345. SSP0_IRQHandler
  346. SSP1_IRQHandler
  347. PLL0_IRQHandler
  348. RTC_IRQHandler
  349. EINT0_IRQHandler
  350. EINT1_IRQHandler
  351. EINT2_IRQHandler
  352. EINT3_IRQHandler
  353. ADC_IRQHandler
  354. BOD_IRQHandler
  355. USB_IRQHandler
  356. CAN_IRQHandler
  357. DMA_IRQHandler
  358. I2S_IRQHandler
  359. ENET_IRQHandler
  360. RIT_IRQHandler
  361. MCPWM_IRQHandler
  362. QEI_IRQHandler
  363. PLL1_IRQHandler
  364. USBActivity_IRQHandler
  365. CANActivity_IRQHandler
  366.  
  367.                 B       .
  368.  
  369.                 ENDP
  370.  
  371.  
  372.                 ALIGN
  373.  
  374.  
  375. ; User Initial Stack & Heap
  376.  
  377.                 EXPORT  __initial_sp
  378.                 EXPORT  __heap_base
  379.                 EXPORT  __heap_limit  
  380.                
  381.                 AREA DataArea,DATA,READWRITE,ALIGN=3
  382. list_Price      SPACE   28*4*2            
  383.  
  384.                 END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement