Advertisement
Guest User

Untitled

a guest
Dec 7th, 2016
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 16.32 KB | None | 0 0
  1. .org 0x0
  2. .section .iv,"a"
  3. interrupt_vector:
  4.     b RESET_HANDLER
  5. .org 0x8
  6.     b SYSCALL_HANDLER
  7. .org 0x18
  8.     b IRQ_HANDLER
  9. .org 0x100
  10.  
  11. .text
  12.  
  13.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  14.     @@@@@@@@@@@@@@        RESET HANDLER       @@@@@@@@@@@@@@
  15.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  16.  
  17. RESET_HANDLER:
  18.     @Set interrupt table base address on coprocessor 15.
  19.     ldr r0, =interrupt_vector
  20.     mcr p15, 0, r0, c12, c0, 0
  21.     @ Zera a flag de estar contando alarmes. Isso eh usado para permitir o tempo correr mesmo que o programa esteja executando ou verificando alarmes
  22.     ldr r2, =is_on_alarm_module
  23.     mov r0,#0
  24.     str r0, [r2]
  25.     @ Zera o vetor de alarmes
  26.     ldr r1, =alarms_vector
  27.     ldr r2, =alarms_vector_end
  28.     reset_handler_zerador:
  29.         str r0, [r1]
  30.         str r0, [r1, #4]
  31.         str r0, [r1, #8]
  32.         add r1, r1, #12
  33.         cmp r1, r2
  34.         beq reset_handler_zerador
  35. SET_GPT:
  36.     @ Basicamente, faz as instrucoes do lab 9 uma por uma na mesma ordem que ta la
  37.     @ Constantes para os enderecos do GPT
  38.     .set GPT_CR,                0x53FA0000
  39.     .set GPT_PR,                0x4
  40.     .set GPT_SR,                0x8
  41.     .set GPT_OCR1,              0x10
  42.     .set GPT_IR,                0xC
  43.     .set TIME_SZ,               200
  44.     ldr r0, =GPT_CR
  45.     mov r1, #0x41
  46.     str r1, [r0]
  47.     mov r1, #0
  48.     str r1, [r0, #GPT_PR]
  49.     mov r1, #TIME_SZ
  50.     str r1, [r0, #GPT_OCR1]
  51.     mov r1, #1
  52.     str r1, [r0, #GPT_IR]
  53. SET_TZIC:
  54.     @ Constantes para os enderecos do TZIC
  55.     .set TZIC_BASE,             0x0FFFC000
  56.     .set TZIC_INTCTRL,          0x0
  57.     .set TZIC_INTSEC1,          0x84
  58.     .set TZIC_ENSET1,           0x104
  59.     .set TZIC_PRIOMASK,         0xC
  60.     .set TZIC_PRIORITY9,        0x424
  61.     @ Liga o controlador de interrupcoes
  62.     @ R1 <= TZIC_BASE
  63.     ldr    r1, =TZIC_BASE
  64.     @ Configura interrupcao 39 do GPT como nao segura
  65.     mov    r0, #(1 << 7)
  66.     str    r0, [r1, #TZIC_INTSEC1]
  67.     @ Habilita interrupcao 39 (GPT)
  68.     @ reg1 bit 7 (gpt)
  69.     str    r0, [r1, #TZIC_ENSET1]
  70.     @ Configure interrupt39 priority as 1
  71.     @ reg9, byte 3
  72.     ldr r0, [r1, #TZIC_PRIORITY9]
  73.     bic r0, r0, #0xFF000000
  74.     mov r2, #1
  75.     orr r0, r0, r2, lsl #24
  76.     str r0, [r1, #TZIC_PRIORITY9]
  77.     @ Configure PRIOMASK as 0
  78.     eor r0, r0, r0
  79.     str r0, [r1, #TZIC_PRIOMASK]
  80.     @ Habilita o controlador de interrupcoes
  81.     mov    r0, #1
  82.     str    r0, [r1, #TZIC_INTCTRL]
  83.     @instrucao msr - habilita interrupcoes
  84.     msr  CPSR, #0x13       @ SUPERVISOR mode, IRQ/FIQ enabled
  85. SET_GPIO:
  86.     @ Constantes para os enderecos do GPIO
  87.     .set GPIO_DR,             0x53F84000
  88.     .set GPIO_GDIR,           0x4
  89.     .set GPIO_PSR,            0x8
  90.     ldr r0, =GPIO_DR
  91.     ldr r2, =0xFFFC003E       @configura inputs e outputs
  92.     str r2, [r0, #GPIO_GDIR]
  93. SET_STACK_POINTERS:
  94.     .set SP_user,            0x77801BBB
  95.     .set SP_svc,             0x77801EEE
  96.     .set SP_irq,             0x77801FFE
  97.     ldr sp, =SP_svc            @seta o sp de svc com no maximo 819 bytes
  98.     msr CPSR, #0x12            @comeca a troca pro modo irq
  99.     ldr sp, =SP_irq            @seta o sp do irq  com no maximo 272 bytes
  100.     msr CPSR, #0x1f            @comeca a trocar pro modo user
  101.     ldr sp, =SP_user        @seta o sp de user com no maximo 955 bytes
  102.     ldr pc, =0x77802000       @pula para o codigo de usuario
  103.  
  104.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  105.     @@@@@@@@@@@@@@      SYSCALL HANDLER       @@@@@@@@@@@@@@
  106.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  107.  
  108. SYSCALL_HANDLER:
  109.     @ Salva o contexto do usuario e pega o endereco da pilha de usuario para desempilhar
  110.     @ os parametros das syscalls. Depois troca de volta para o modo svc
  111.     @ Determina qual syscall foi chamada
  112.     ldr r0, =is_on_syscall
  113.     mov r1, #1
  114.     str r1, [r0]
  115.     sub r7, r7, #16
  116.     ldr r0, =syscall_list
  117.     mov r1, #4
  118.     mov r2, r7
  119.     mul r7,r1,r2
  120.     add r0, r0, r7
  121.     bx r0
  122.     syscall_list:
  123.         b sys_read_sonar
  124.         b sys_register_proximity_callback
  125.         b sys_set_motor_speed
  126.         b sys_set_motors_speed
  127.         b sys_get_time
  128.         b sys_set_time
  129.         b sys_set_alarm
  130.         b sys_user_to_svc_alarms
  131.  
  132.     syscall_end:
  133.         ldr r0, =is_on_syscall
  134.         mov r1, #0
  135.         str r1, [r0]
  136.         movs pc, lr
  137.  
  138.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  139.     @@@@@@@@@@@@@@         SYSCALL 16         @@@@@@@@@@@@@@
  140.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  141.  
  142. sys_read_sonar:
  143.     ldr r3, =GPIO_DR           @ carrega o endereco de GPIO_DR
  144.     ldr r2, [r3]               @ carrega o valor de GPIO_PSR em r2
  145.     @coloca id no mux
  146.     msr CPSR, #0xdf
  147.     ldr r0, [sp]         @ id do sonar a ser lido
  148.     msr CPSR, #0x13
  149.     Mov r0,r0,lsl #2        @ alinha o mux
  150.     and r2, r2, #0xFFFFFFC3 @zera mux
  151.     orr r2, r2, r0          @substitui valor em mux
  152.     str r2, [r3]
  153.     mov r0, #0b10           @sobe o trigger
  154.     and r2, r2, #0xFFFFFFFD @sobe o trigger
  155.     orr r2, r2, r0          @sobe o trigger
  156.     str r2, [r3]            @sobe o trigger
  157.     stmfd sp!, {r0, r1, lr}
  158.     bl read_delay
  159.     ldmfd sp!, {r0, r1, lr}
  160.     mov r0, #0b00           @desce o trigger
  161.     and r2, r2, #0xFFFFFFFD @desce o trigger
  162.     orr r2, r2, r0          @desce o trigger
  163.     str r2, [r3]            @desce o trigger
  164.     read_check_flag:
  165.         ldr r2, [r3]               @ carrega o valor de GPIO_PSR em r2
  166.         and r2, r2, #0x00000001
  167.         cmp r2, #1
  168.         beq read_readtime
  169.         stmfd sp!, {r0, r1, lr}
  170.         bl read_delay
  171.         ldmfd sp!, {r0, r1, lr}
  172.         b read_check_flag
  173.     read_readtime:
  174.         ldr r2, [r3]
  175.         ldr r0, =0x0003FFC0
  176.         and r2, r2, r0
  177.         mov r2, r2, lsr #6
  178.         mov r0, r2
  179.         b syscall_end
  180.  
  181.     read_delay:
  182.         mov r0, #0
  183.         mov r1, #150
  184.         read_delay_loop:
  185.             add r0, r0, #1
  186.             cmp r0, r1
  187.             bne read_delay_loop
  188.         mov pc, lr
  189.  
  190.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  191.     @@@@@@@@@@@@@@         SYSCALL 17         @@@@@@@@@@@@@@
  192.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  193. @rewrite this
  194. sys_register_proximity_callback:
  195.     .set MAX_CALLBACKS, 8
  196.     @tratando limite de sonar
  197.     LDMFD r8!, {r1} @ recebe a distancia limite
  198.     LDMFD r8!, {r2} @ recebe a funcao a ser chamada
  199.       cmp r0, #0
  200.       blt error_read_sonar2
  201.       cmp r0, #15
  202.       bhi error_read_sonar2
  203. @ Para ler o sonar, armazenar os caller safe
  204.     stmfd sp!, {r0-r3}
  205.     Bl sys_read_sonar @ler o sonar relacionado
  206.     Cmp r0,r1
  207.     Blt chamar_callback @se for menor, chamar uma callback
  208.     b fim_register
  209.     @tratar limite de callbacks
  210.     @@ se for necessario fazer outra callback
  211. chamar_callback:
  212.     ldr r3, =MAX_CALLBACKS
  213.     stmfd sp!, {r4}
  214.     ldr r4, [r3]
  215.     Cmp r4, #8
  216.     Beq error_read_sonar1
  217.     Add r4,r4,#1
  218.     Str r4, [r3]
  219.     ldmfd sp!, {r4}
  220.     Mov pc, r2 @passa o endereco da nova funcao para o pc
  221. error_read_sonar2:
  222.     Mov r0, #-2
  223.     Movs pc,lr @ ta certo???
  224. error_read_sonar1:
  225.     Mov r0,#-1
  226. fim_register:
  227.     @caso em que esta longe, entao, precisa setar um alarme.
  228.  
  229.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  230.     @@@@@@@@@@@@@@         SYSCALL 18         @@@@@@@@@@@@@@
  231.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  232.  
  233. sys_set_motor_speed:
  234.     ldr r3, =GPIO_DR           @ carrega o endereco de GPIO_DR
  235.     ldr r2, [r3]               @ carrega o valor de GPIO_PSR em r2
  236.     msr CPSR, #0xdf
  237.     ldr r0, [sp]         @ id
  238.     ldr r1, [sp, #4]     @ velocidade 1
  239.     msr CPSR, #0x13
  240.     Cmp r1,#127
  241.     Bhi error_velocidade @se for maior que 127, precisa de 7 bits, o que eh impossivel
  242.     Cmp r0, #0                 @ se for 0 ou 1, esta OK!
  243.     Beq set_motor_0
  244.     Cmp r0, #1
  245.     Beq set_motor_1
  246.     B error_identificador_motor @qualquer outro valor para r0, devera retornar -1
  247. set_motor_0:
  248.     Mov r1,r1,lsl #19         @ passa a velocidade para os da GPIO
  249.     And r2,r2, #0xFE03FFFF    @ zera a velocidade anterior no motor 0
  250.     Orr r1, r1, r2            @ seta a nova velocidade
  251.     str r1,[r3]             @ transfere para o GPIO a nova velocidade
  252.     mov r0,#0
  253.     b syscall_end
  254.                     @ TALVEZ precise do delay
  255. set_motor_1:
  256.     Mov r1,r1,lsl #26        @análogo ao do motor 0
  257.     And r2,r2, #0x01FFFFFF
  258.     Orr r1, r1, r2
  259.     str r1,[r3]
  260.     mov r0,#0
  261.     b syscall_end
  262. error_velocidade:
  263.     mov r0, #-2
  264.     b syscall_end
  265. error_identificador_motor:
  266.     mov r0, #-1
  267.     b syscall_end
  268.  
  269.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  270.     @@@@@@@@@@@@@@         SYSCALL 19         @@@@@@@@@@@@@@
  271.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  272.  
  273. sys_set_motors_speed:
  274.     msr CPSR, #0xdf
  275.     ldr r0, [sp]         @ velocidade 0
  276.     ldr r1, [sp, #4]     @ velocidade 1
  277.     msr CPSR, #0x13
  278.     Cmp r0,#127
  279.     Bhi erro_velo_0
  280.     Cmp r1,#127
  281.     Bhi erro_velo_1
  282.     Ldr r3, = GPIO_DR
  283.     Ldr r2,[r3]
  284.     Mov r0,r0,lsl #19         @ passa a velocidade para os da GPIO
  285.     Mov r1,r1,lsl #26         @ passa a velocidade para os da GPIO
  286.     And r2,r2, #0xFE03FFFF    @ zera a velocidade anterior no motor 0
  287.     And r2,r2, #0x01FFFFFF
  288.     Orr r0, r0, r2            @ seta a nova velocidade
  289.     orr r0, r0, r1
  290.     str r0,[r3]               @ transfere para o GPIO a nova velocidade
  291.     mov r0,#0
  292.     b syscall_end
  293.  
  294.     erro_velo_0:
  295.         mov r0,#-1
  296.         b syscall_end
  297.     erro_velo_1:
  298.         mov r0,#-2
  299.         b syscall_end
  300.  
  301.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  302.     @@@@@@@@@@@@@@         SYSCALL 20         @@@@@@@@@@@@@@
  303.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  304.  
  305. sys_get_time:
  306.     ldr r0, =systime
  307.     b syscall_end
  308.  
  309.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  310.     @@@@@@@@@@@@@@         SYSCALL 21         @@@@@@@@@@@@@@
  311.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  312.  
  313. sys_set_time:
  314.     msr CPSR, #0xdf
  315.     ldr r0, [sp]         @ id
  316.     msr CPSR, #0x13
  317.     ldr r1, =systime
  318.     str r0, [r1]
  319.     b syscall_end
  320.  
  321.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  322.     @@@@@@@@@@@@@@         SYSCALL 22         @@@@@@@@@@@@@@
  323.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  324.  
  325. sys_set_alarm:
  326.     .set MAX_ALARMS, 8
  327.     .set MAX_ALARMS_MEMORY, 96          @8x12
  328.     stmfd sp!, {lr}
  329.     bl sys_count_alarms                 @conta quantos alarmes estao ativos no sistema e retorna em r0
  330.     ldmfd sp!, {lr}
  331.     cmp r1, #MAX_ALARMS
  332.     bhi sys_set_alarm_failure1          @retorna -1 pois ja tem alarmes demais
  333.     msr CPSR, #0xdf                     @system mode
  334.     ldr r0, [sp]
  335.     ldr r1, [sp, #4]
  336.     msr CPSR, #0x13
  337.     ldr r3, =systime
  338.     ldr r2, [r3]
  339.     cmp r1, r2
  340.     bls sys_set_alarm_failure2          @retorna -2 pois o tempo eh invalido
  341.     stmfd sp!, {lr}
  342.     bl sys_add_alarm                    @adiciona alarme no vetor alarm_vector
  343.     ldmfd sp!, {lr}
  344.     b syscall_end
  345.  
  346.     sys_count_alarms:
  347.         ldr r0, =alarms_vector
  348.         ldr r3, =alarms_vector_end
  349.         mov r1, #0
  350.         sys_count_alarms_loop:
  351.             ldr r2, [r0]
  352.             cmp r2, #1
  353.             addeq r1, r1, #1
  354.             add r0, r0, #12
  355.             cmp r0, r3
  356.             bne sys_count_alarms_loop
  357.         mov pc, lr
  358.  
  359.     sys_add_alarm:
  360.         ldr r0, =alarms_vector
  361.         sys_search_for_empty_pos:
  362.             ldr r2, [r0]
  363.             cmp r2, #1
  364.             addeq r0, r0, #12
  365.             cmp r2, #1
  366.             beq sys_search_for_empty_pos
  367.         mov r1, #1
  368.         str r1, [r0]           @ativa o alarme
  369.         msr CPSR, #0xdf                     @system mode
  370.         ldr r1, [sp]
  371.         ldr r2, [sp, #4]
  372.         msr CPSR, #0x13
  373.         str r1, [r0, #4]        @guarda o endereco da funcao a ser chamada
  374.         str r2, [r0, #8]        @guarda o tempo
  375.         mov pc, lr
  376.  
  377.     sys_set_alarm_failure1:
  378.         mov r0, #-1
  379.         b syscall_end
  380.     sys_set_alarm_failure2:
  381.         mov r0, #-2
  382.         b syscall_end
  383.  
  384.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  385.     @@@@@@@@@@@@@@         SYSCALL 23         @@@@@@@@@@@@@@
  386.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  387.  
  388. sys_user_to_svc_alarms: @restaura o lr de usuario, empilha seu contexto, troca pra irq e restaura seu contexto, retornando para o modulo de alarmes
  389.     msr CPSR, #0x1f     @system mode
  390.     ldmfd sp!, {lr}
  391.     stmfd sp!, {r0-r12}
  392.     msr CPSR, #0x12
  393.     ldmfd sp!, {r0-r12}
  394.     b return_alarm
  395.  
  396.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  397.     @@@@@@@@@@@@@@         IRQ HANDLER        @@@@@@@@@@@@@@
  398.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  399.  
  400. IRQ_HANDLER:
  401.     msr CPSR, #0xDf
  402.     stmfd sp!, {r0-r12}        @Salva contexto do usuario
  403.     msr CPSR, #0xD2
  404.     ldr r0, =GPT_CR            @ Para as interrupcoes
  405.     mov r1, #1                 @ Para as interrupcoes
  406.     str r1, [r0, #GPT_SR]      @ Para as interrupcoes
  407.     ldr r0, =systime           @ Incrementa o tempo
  408.     ldr r1, [r0]               @ Incrementa o tempo
  409.     mov r2, #1
  410.     add r1, r1, r2             @ Incrementa o tempo
  411.     str r1, [r0]               @ Incrementa o tempo
  412.     ldr r0, =is_on_alarm_module
  413.     ldr r0, [r0]
  414.     cmp r0, #0
  415.     stmfd sp!, {r0-r3, lr}
  416.     bleq irq_alarm_module       @ Checa alarmes
  417.     ldmfd sp!, {r0-r3, lr}
  418.     msr CPSR, #0xDf
  419.     ldmfd sp!, {r0-r12}        @Retorna contexto do usuario
  420.     msr CPSR, #0xD2
  421.     sub lr, lr, #4
  422.     movs pc, lr
  423.  
  424.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  425.     @@@@@@@@@@@@@@        ALARM MODULE        @@@@@@@@@@@@@@
  426.     @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
  427.  
  428.     irq_alarm_module:
  429.         ldr r0, =is_on_syscall
  430.         ldr r0, [r0]
  431.         cmp r0, #1
  432.         beq cancel_check
  433.         stmfd sp!, {r4-r7}
  434.         ldr r0, =is_on_alarm_module @ Liga o modo de checagem de alarmes
  435.         mov r1, #1                  @ Liga o modo de checagem de alarmes
  436.         str r1, [r0]                @ Liga o modo de checagem de alarmes
  437.         ldr r0, =alarms_vector
  438.         ldr r1, =alarms_vector_end
  439.         ldr r3, =systime
  440.         ldr r2, [r3]
  441.         irq_alarm_module_loop:
  442.             ldr r3, [r0]
  443.             cmp r3, #0
  444.             beq alarm_not_set
  445.             ldr r3, [r0, #4]
  446.             cmp r2, r3                      @compara alarme com tempo de sistema e executa se o alarme ja tiver passado
  447.             stmfd sp!, {lr}
  448.             blhi irq_store_alarm_adress      @guarda o endereco do alarme nesse rotulo se o alarme tiver tocado
  449.             cmp r2, r3
  450.             bhi irq_execute_alarm           @vai executar alarme, volta atraves da syscall 23
  451.             finished_alarm:
  452.             ldmfd sp!, {lr}
  453.             alarm_not_set:
  454.             add r0, r0, #12
  455.             cmp r0, r1
  456.             bne irq_alarm_module_loop
  457.         ldr r0, =is_on_alarm_module @ Desliga o modo de checagem de alarmes
  458.         mov r1, #0                  @ Desliga o modo de checagem de alarmes
  459.         str r1, [r0]                @ Desliga o modo de checagem de alarmes
  460.         stmfd sp!, {r4-r7}
  461.         cancel_check:
  462.         mov pc, lr
  463.  
  464.         irq_store_alarm_adress:
  465.             ldr r4, =irq_alarm_adress
  466.             ldr r5, [r0, #8]
  467.             str r5, [r4]
  468.             mov pc, lr
  469.  
  470.         irq_execute_alarm:
  471.             stmfd sp!, {r0-r12}             @ salva o contexto de irq
  472.             msr CPSR, #0xDf
  473.             ldmfd sp!, {r0-r12}             @ retorna o contexto do usuario
  474.             msr CPSR, #0xD0               @ comeca a trocar pro modo user
  475.             stmfd sp!, {lr}                 @ guarda o lr de user
  476.             ldr r0, =irq_alarm_adress
  477.             ldr r0, [r0]
  478.             blx r0
  479.             mov r7, #23    @restaura o lr de usuario, empilha seu contexto, troca pra irq e restaura seu contexto, retornando para o modulo de alarmes
  480.             svc 0x0
  481.             return_alarm:             @rotulo para voltar da syscall 23
  482.             mov r3, #0
  483.             str r3, [r0]    @desliga o alarme
  484.             b finished_alarm
  485.  
  486. .data
  487.  
  488. systime:
  489.     .skip 4
  490. is_on_alarm_module:
  491.     .skip 4
  492. is_on_syscall:
  493.     .skip 4
  494. irq_alarm_adress:
  495.     .skip 4
  496. alarms_vector:
  497.     @byte 1-4 = ativo, byte 5-8 = tempo, byte 9-12 = endereco da funcao a ser chamada
  498.     .skip MAX_ALARMS_MEMORY
  499. alarms_vector_end:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement