⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test_s.s

📁 ARM嵌入式系统开发--软件设计与优化随书源代码。开发环境asm+c
💻 S
📖 第 1 页 / 共 2 页
字号:
        SUBS     r12,r12,#1       ; --N and set flags
        BNE      queue_v1_loop    ; if (N!=0) goto loop
        MOV      r0,r2            ; r0 = Q_ptr
        LDR      pc,[r13],#4      ; return r0
        
queue_bytes_v2_s
        STR      r14,[r13,#-4]!   ; save lr on the stack
        LDR      r3,[r0,#8]       ; r3  = queue->Q_ptr
        LDR      r14,[r0,#4]      ; r14 = queue->Q_end
queue_v2_loop
        LDRB     r12,[r1],#1      ; r12 = *(data++)
        STRB     r12,[r3],#1      ; *(Q_ptr++) = r12
        CMP      r3,r14           ; if (Q_ptr == Q_end)
        LDREQ    r3,[r0,#0]       ;   { Q_ptr = queue->Q_start }
        SUBS     r2,r2,#1         ; --N and set flags
        BNE      queue_v2_loop    ; if (N!=0) goto loop
        STR      r3,[r0,#8]       ; queue->Q_ptr = r3
        LDR      pc,[r13],#4      ; return
        
nybble_to_hex
        CMP     r0,#0xa
        ADDCS   r0,r0,#0x37
        ADDCC   r0,r0,#0x30
        MOV     pc,r14
        
uint_to_hex_s
        MOV     r3,#8             ; i = 8
uint_to_hex_loop
        MOV     r1,r1,ROR #28     ; in = (in<<4)|(in>>28)
        AND     r2,r1,#0xf        ; r2 = in & 15
        CMP     r2,#0xa           ; if (r2>=10)
        ADDCS   r2,r2,#0x37       ;   r2 += 'A'-10
        ADDCC   r2,r2,#0x30       ; else r2 += '0'
        STRB    r2,[r0],#1        ; *(out++) = r2
        SUBS    r3,r3,#1          ; i-- and set flags
        BNE     uint_to_hex_loop  ; if (i!=0) goto loop
        MOV     pc,r14            ; return

;// Section 5.6 - Pointer Aliasing

timers_v1
        LDR     r3,[r0,#0]        ; r3 = *timer1
        LDR     r12,[r2,#0]       ; r12 = *step
        ADD     r3,r3,r12         ; r3 += r12
        STR     r3,[r0,#0]        ; *timer1 = r3
        LDR     r0,[r1,#0]        ; r0 = *timer2
        LDR     r2,[r2,#0]        ; r2 = *step
        ADD     r0,r0,r2          ; r0 += r2
        STR     r0,[r1,#0]        ; *timer2 = t0
        MOV     pc,r14            ; return
        
timers_v2
        LDR     r2,[r1,#0]        ; r2 = timers->timer1
        LDR     r3,[r0,#0]        ; r3 = state->step
        ADD     r2,r2,r3          ; r2 += r3
        STR     r2,[r1,#0]        ; timers->timer1 = r2
        LDR     r2,[r1,#4]        ; r2 = timers->timer2
        LDR     r0,[r0,#0]        ; r0 = state->step
        ADD     r0,r2,r0          ; r0 += r2
        STR     r0,[r1,#4]        ; timers->timer2 = r0
        MOV     pc,r14            ; return
        
checksum_next_packet
        STMFD   r13!,{r4,r14}     ; save r4, lr on the stack
        SUB     r13,r13,#8        ; create two stacked variables
        ADD     r0,r13,#4         ; r0 = &N, N stacked
        MOV     r4,#0             ; sum = 0
        BL      get_next_packet   ; r0 = data
checksum_loop        
        LDR     r1,[r0],#4        ; r1 = *(data++)
        ADD     r4,r1,r4          ; sum += r1
        LDR     r1,[r13,#4]       ; r1 = N (read from stack)
        SUBS    r1,r1,#1          ; r1-- & set flags
        STR     r1,[r13,#4]       ; N = r1 (write to stack)
        BNE     checksum_loop     ; if (N!=0) goto loop
        MOV     r0,r4             ; r0 = sum
        ADD     r13,r13,#8        ; delete stacked variables
        LDMFD   r13!,{r4,pc}      ; return r0
        
ctolower
        LDRB    r1,[r0,#0]        ; r1 = *c
        SUB     r2,r1,#0x41       ; r2 = r1-'A'
        CMP     r2,#0x19          ; if (r2<=25)
        ADDLS   r1,r1,#0x20       ; { r1 += 'a'-'A';
        STRLSB  r1,[r0,#0]        ;   *c = r1; }
        MOV     pc,r14            ; return
        
inc1
        STMFD   r13!,{r4,r14}
        MOV     r4,r1
        LDR     r1,[r1,#0]
        ADD     r0,r1,r0
        BL      clip1
        LDR     r1,[r4,#0]
        ADD     r0,r1,r0
        LDMFD   r13!,{r4,pc}
                
;// Section 5.8 - bitfields
        
dostages_v1
        STMFD   r13!,{r4,r14}     ; stack r4, lr
        MOV     r4,r0             ; move stages to r4
        LDR     r0,[r0,#0]        ; r0 = stages bitfield
        TST     r0,#1             ; if (stages->stageA)
        BLNE    dostageA          ;   { dostageA(); }
        LDR     r0,[r4,#0]        ; r0 = stages bitfield
        MOV     r0,r0,LSL #30     ; shift bit 1 to bit 31
        CMP     r0,#0             ; if (bit31)
        BLLT    dostageB          ;   { dostageB(); }
        LDR     r0,[r4,#0]        ; r0 = stages bitfield
        MOV     r0,r0,LSL #29     ; shift bit 2 to bit 31
        CMP     r0,#0             ; if (!bit31)
        LDMLTFD r13!,{r4,r14}     ;   return
        BLT     dostageC          ; dostageC();
        LDMFD   r13!,{r4,pc}      ; return
        
dostages_v2
        STMFD   r13!,{r4,r14}     ; stack r4, lr
        LDR     r4,[r0,#0]        ; stages = *stages_v2
        TST     r4,#1             ; if (stage & STAGEA)
        BLNE    dostageA          ;   { dostageA(); }
        TST     r4,#2             ; if (stage & STAGEB)
        BLNE    dostageB          ;   { dostageB(); }
        TST     r4,#4             ; if (!(stage & STAGEC))
        LDMNEFD r13!,{r4,r14}     ;   return;
        BNE     dostageC          ; dostageC();
        LDMFD   r13!,{r4,pc}      ; return
        
;// Section 5.10 - Division
        
getxy_v1_s
        STMFD   r13!,{r4-r6,r14}
        MOV     r6,r0
        MOV     r0,r2
        MOV     r5,r2
        MOV     r4,r1
        BL      __rt_udiv
        MUL     r1,r5,r0
        SUB     r1,r4,r1
        STR     r0,[r6,#4]
        STR     r1,[r6,#0]
        LDMFD   r13!,{r4-r6,pc}
        
getxy_v2_s
        STMFD   r13!,{r4,r14}     ; stack r4, lr
        MOV     r4,r0             ; move p to r4
        MOV     r0,r2             ; r0 = bytes_per_line
        BL      __rt_udiv         ; (r0,r1) = (r1/r0, r1%r0)
        STR     r0,[r4,#4]        ; p.y = offset / bytes_per_line
        STR     r1,[r4,#0]        ; p.x = offset % bytes_per_line
        LDMFD   r13!,{r4,pc}      ; return
        
scale_s
        STMFD   r13!,{r3-r9,r14}
        MOV     r7,r1
        MOV     r6,r0
        MOV     r0,r2
        MVN     r1,#0
        MOV     r8,r3
        MOV     r5,r2
        BL      __rt_udiv
        MOV     r9,r0
scale_loop
        LDR     r4,[r7],#4
        MOV     r1,r9
        UMULL   r0,r1,r4,r9
        MOV     r0,r1
        MUL     r1,r0,r5
        SUB     r1,r4,r1
        CMP     r1,r5
        ADC     r0,r0,#0
        STR     r0,[r6],#4
        SUBS    r8,r8,#1
        BNE     scale_loop
        LDMFD   r13!,{r3-r9,pc}
        
readint
        BIC     r3,r0,#3          ; r3 = data & 0xFFFFFFFC
        AND     r0,r0,#3          ; r0 = data & 0x00000003
        MOV     r0,r0,LSL #3      ; r0 = bit offset of data word
        LDMIA   r3,{r3,r12}       ; r3, r12 = 8 bytes read from r3
        MOV     r3,r3,LSR r0      ; These three instructions
        RSB     r0,r0,#0x20       ; shift the 64 bit value r12.r3
        ORR     r0,r3,r12,LSL r0  ; right by r0 bits
        MOV     pc,r14            ; return r0

sat_correlate_v1_s
        STMFD   r13!,{r4,r5,r14}
        MOV     r5,#0x80000000
        MVN     r4,#0x80000000
        MOV     r3,#0
sat_v1_loop
        LDRH    r12,[r0],#2
        LDRH    r14,[r1],#2
        SMULBB  r12,r12,r14
        CMP     r12,#0
        BLT     sat_v1_neg
        MOV     r12,r12,LSL #1
        CMP     r12,#0
        MVNLT   r12,#0x80000000
        ADD     r12,r3,r12
        CMP     r12,r3
        MOVGE   r3,r12
        MOVLT   r3,r4
        B       sat_v1_next
sat_v1_neg
        ADD     r12,r3,r12,LSL #1
        CMP     r12,r3
        MOVLE   r3,r12
        MOVGT   r3,r5
sat_v1_next
        SUBS    r2,r2,#1
        BNE     sat_v1_loop
        MOV     r0,r3
        LDMFD   r13!,{r4,r5,pc}
        
sat_correlate_v2_s
        STMFD   r13!,{r4,r14}
        MOV     r14,#0x80000000
        MOV     r12,#0
sat_v2_loop
        LDRH    r3,[r0],#2
        LDRH    r4,[r1],#2
        SMULBB  r3,r3,r4
        ADDS    r3,r3,r3
        EORVS   r3,r14,r3,ASR #31
        ADDS    r12,r12,r3
        EORVS   r12,r14,r12,ASR #31
        SUBS    r2,r2,#1
        BNE     sat_v2_loop
        MOV     r0,r12
        LDMFD   r13!,{r4,pc}
        
sat_correlate_v3_s
        STR     r14,[r13,#-4]!    ; stack lr
        MOV     r12,#0            ; a = 0
sat_v3_loop
        LDRSH   r3,[r0],#2        ; r3 = *(x++)
        LDRSH   r14,[r1],#2       ; r14 = *(y++)
        SUBS    r2,r2,#1          ; N-- and set flags
        SMULBB  r3,r3,r14         ; r3 = r3 * r14
        QDADD   r12,r12,r3        ; a = sat(a+sat(2*r3))
        BNE     sat_v3_loop       ; if (N!=0) goto loop
        MOV     r0,r12            ; r0 = a
        LDR     pc,[r13],#4       ; return r0
        
flush_Icache
        MOV     r0,#0
        MCR     p15,0x0,r0,c7,c5,0
        MOV     pc,r14
        
;// This is used in Section 6.3
        
str_tolower_s
        LDRB    r2,[r1],#1        ; c = *(in++)
        SUB     r3,r2,#0x41       ; r3 = c - 'A'
        CMP     r3,#0x19          ; if (c <= 'Z'-'A')
        ADDLS   r2,r2,#0x20       ;   c += 'a'-'A'
        STRB    r2,[r0],#1        ; *(out++) = (char)c
        CMP     r2,#0             ; if (c!=0)
        BNE     str_tolower_s     ;   goto str_tolower
        MOV     pc,r14            ; return
        
        END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -