返回介绍

16.1.2 ARM + Non-optimizing Keil + ARM mode

发布于 2025-02-22 14:00:45 字数 1714 浏览 0 评论 0 收藏 0

#!bash
        EXPORT _main
_main
        STMFD   SP!, {R4,LR}
        SUB     SP, SP, #0x50           ; allocate place for 20 int variables
; first loop
        MOV     R4, #0                  ; i
        B       loc_4A0
loc_494
        MOV     R0, R4,LSL#1            ; R0=R4*2
        STR     R0, [SP,R4,LSL#2]       ; store R0 to SP+R4<<2 (same as SP+R4*4)
        ADD     R4, R4, #1              ; i=i+1
loc_4A0
        CMP     R4, #20                 ; i<20?
        BLT     loc_494                 ; yes, run loop body again
; second loop
        MOV     R4, #0                  ; i
        B       loc_4C4
loc_4B0
        LDR     R2, [SP,R4,LSL#2]       ; (second printf argument) R2=*(SP+R4<<4) (same as *(SP+R4*4))
        MOV     R1, R4                  ; (first printf argument) R1=i
        ADR     R0, aADD                ; "a[%d]=%d
"
        BL      __2printf
        ADD     R4, R4, #1              ; i=i+1
loc_4C4
        CMP     R4, #20                 ; i<20?
        BLT     loc_4B0                 ; yes, run loop body again
        MOV     R0, #0                  ; value to return
        ADD     SP, SP, #0x50           ; deallocate place, allocated for 20 int variables
        LDMFD   SP!, {R4,PC}

int 类型长度为 32bits 即 4 字节,20 个 int 变量需要 80(0x50)字节,因此“ sub sp,sp,#0x50 ”指令为在栈上分配存储空间。 两个循环迭代器 i 被存储在 R4 寄存器中。 值 i2 被写入数组,通过将 i 值左移 1 位实现乘以 2 的效果,整个过程通过”MOV R0,R4,LSL#1 指令来实现。 “ STR R0, [SP,R4,LSL#2] ”把 R0 内容写入数组。过程为:SP 指向数组开始,R4 是 i,i 左移 2 位相当于乘以 4,即`(SP+R44)=R0 。 第二个 loop 的“ LDR R2, [SP,R4,LSL#2] ”从数组读取数值到寄存器, R2=(SP+R4*4)`。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文