嵌入式系统概论-基于32位微处理器与实时操作系统第四讲

上传人:san****019 文档编号:23735771 上传时间:2021-06-10 格式:PPT 页数:108 大小:1.29MB
收藏 版权申诉 举报 下载
嵌入式系统概论-基于32位微处理器与实时操作系统第四讲_第1页
第1页 / 共108页
嵌入式系统概论-基于32位微处理器与实时操作系统第四讲_第2页
第2页 / 共108页
嵌入式系统概论-基于32位微处理器与实时操作系统第四讲_第3页
第3页 / 共108页
资源描述:

《嵌入式系统概论-基于32位微处理器与实时操作系统第四讲》由会员分享,可在线阅读,更多相关《嵌入式系统概论-基于32位微处理器与实时操作系统第四讲(108页珍藏版)》请在装配图网上搜索。

1、1 嵌 入 式 系 统 概 论基 于 32位 微 处 理 器 与 实 时 操 作 系 统第 四 讲 ARM指 令 集 与 编 程 2 指 令 长 度l 指 令 集 可 以 是 以 下 任 一 种l 32 bits 长 (ARM状 态 )l 16 bits 长 (Thumb 状 态 )l ARM7TDMI 支 持 3种 数 据 类 型l 字 节 (8-bit) l 半 字 (16-bit)l 字 (32-bit)l 字 必 须 被 排 成 4个 字 节 边 界 对 齐 ,半 字 必 须 被 排 列 成 2个 字 节 边 界对 齐 3 ARM 指 令 集 的 特 点l 向 后 兼 容 : 新 版

2、本 增 加 指 令 , 并 保 持 指 令 向 后 兼 容 ;l Load-store 结 构 *u load/store 从 存 储 器 中 读 某 个 值 ,操 作 完 后 再 将 其 放 回 存 储器 中u 只 对 存 放 在 寄 存 器 的 数 据 进 行 处 理 ;u 对 于 存 储 器 中 的 数 据 , 只 能 使 用 load/store指 令 进 行 存 取 4 指 令 格 式l 指 令 格 式u 3 地 址 指 令 格 式 在 ARM状 态 中 使 用 u 例指 令 语 法 目 标 寄 存 器 ( Rd) 源 寄 存 器 1(Rn) 源 寄 存 器 2(Rm)ADD r3,

3、r1,r2 r3 r1 r2 5 ARM 指 令 分 类l 数 据 处 理 指 令 使 用 和 改 变 寄 存 器 的 值l 数 据 传 送 指 令 把 存 储 器 的 值 拷 贝 到 寄 存 器 中 (load) or 把 寄 存 器 中 的 值 拷 贝 到 存 储 器 中 (store)l 控 制 流 指 令 分 支 分 支 和 链 接 , 保 存 返 回 的 地 址 ,以 恢 复 最 先 的 次 序l 软 件 中 断 指 令l 程 序 状 态 寄 存 器 指 令 l 协 处 理 器 指 令 6 ARM指 令 编 码 格 式l 说 明lCondl指 令 执 行 的 条 件 编 码lOpco

4、del指 令 操 作 符 编 码lS l决 定 指 令 的 操 作 是 否 影 响 CPSR的 值lRdl操 作 目 标 寄 存 器 编 码lRnl包 含 第 一 操 作 数 的 寄 存 器 编 码lShifter_operandl表 示 第 二 操 作 数cond 001 opcode s Rn Rd Shifter_operand 31 28 27 25 24 21 20 19 16 15 12 11 8 7 0 7 ARM指 令 集 8 数 据 处 理 指 令 - 1l 数 据 处 理 指 令 的 类 别u 算 术 操 作u 按 位 逻 辑 操 作u 寄 存 器 移 位 操 作u 比 较

5、 操 作l 操 作 数 : 32-bits 宽 ;有 3种 指 定 操 作 数 的 方 式 u 来 自 寄 存 器u 第 二 操 作 数 可 以 是 常 数 (立 即 数 )u 移 位 寄 存 器 操 作 数l 结 果 : 32-bits 宽 , 放 在 寄 存 器 中u 长 乘 法 产 生 64位 结 果 9 数 据 处 理 指 令 2*cond 0 0 operand 2# opcode S Rn Rd31 28 2726 25 24 21 20 19 1615 12 11 0目的寄存器第一操作寄存器设置操作码算术 /逻 辑功能 8-bit 立即数125 11 8 7 0#rot Rm11

6、 7 6 5 4 3 0#shift Rm025 11 8 7 6 5 4 3 0Rs Sh 010 Shimmediate alignmentimmediate shift lengthshift typesecond operand register 移位寄存器长度 10 数 据 处 理 指 令 - 3 Opcode 24:21 Mnemonic Meaning Effect 0000 AND Logical bit-wise AND Rd := Rn AND Op2 0001 EOR Logical bit-wise exclusive OR Rd := Rn EOR Op2 0010

7、SUB Subtract Rd := Rn - Op2 0011 RSB Reverse subtract Rd := Op2 - Rn 0100 ADD Add Rd := Rn + Op2 0101 ADC Add with carry Rd := Rn + Op2 + C 0110 SBC Subtract with carry Rd := Rn - Op2 + C - 1 0111 RSC Reverse subtract with carry Rd := Op2 - Rn + C - 1 1000 TST Test Scc on Rn AND Op2 1001 TEQ Test eq

8、uivalence Scc on Rn EOR Op2 1010 CMP Compare Scc on Rn - Op2 1011 CMN Compare negated Scc on Rn + Op2 1100 ORR Logical bit-wise OR Rd := Rn OR Op2 1101 MOV Move Rd := Op2 1110 BIC Bit clear Rd := Rn AND NOT Op2 1111 MVN Move negated Rd := NOT Op2 11 数 据 处 理 指 令 - 4ADD r0, r1, r2 r0 := r1 + r2ADC r0,

9、 r1, r2 r0 := r1 + r2 + CSUB r0, r1, r2 r0 := r1 - r2SBC r0, r1, r2 r0 := r1 - r2 + C - 1RSB r0, r1, r2 r0 := r2 r1 RSC r0, r1, r2 r0 := r2 r1 + C - 1算 术 操 作 按 位 逻 辑 操 作AND r0, r1, r2 r0 := r1 and r2ORR r0, r1, r2 r0 := r1 or r2EOR r0, r1, r2 r0 := r1 xor r2BIC r0, r1, r2 r0 := r1 and (not) r2寄 存 器

10、移 位MOV r0, r2 r0 := r2MVN r0, r2 r0 := not r2 比 较 操 作CMP r1, r2 set cc on r1 - r2CMN r1, r2 set cc on r1 + r2TST r1, r2 set cc on r1 and r2TEQ r1, r2 set cc on r1 xor r2 12 数 据 处 理 指 令 - MOVl MOV指 令 是 把 一 个 数 N送 到 目 标 寄 存 器 中 , N可 以 是 寄 存 器 , 也可 以 是 立 即 数 。l MOV指 令 语 法 : 指 令 cond S Rd, N例 : PRE r0=

11、5 , r2=6 MOV r0, r2 POST r0=6 ,r2=6MOV r0, r2 r0 := r2MVN r0, r2 r0 := not r2 13 桶 形 移 位 器ALU桶 形 移 位 器 Rd 结 果 N预处理未预处理 RmRn 14 桶 形 移 位 器 的 使 用l PRE r0=8, r2=5l MOV r0 ,r2, LSL #2( 逻 辑 左 移 两 位 : r20) x=1;CMP r0,#0MOVEQ r1,#0 MOVGT r1,#1l 使 用 条 件 比 较 指 令if (a=4 | a=10) x=0;CMP r0,#4CMPNE r0,#10MOVEQ r

12、1,#0 23 条 件 执 行l所有的ARM指令都可以条件执行l指令的执行与否取决于CPSR寄存器的N, Z, C and V标志位l所有的Thumb指令都可以解压成全部条件指令l Condition Field in instruction l 0000 = EQ - Z set (equal)l 0001 = NE - Z clear (not equal)l 0010 = CS - C set (unsigned higher or same)l 0011 = CC - C clear (unsigned lower)l 0100 = MI - N set (negative)l 010

13、1 = PL - N clear (positive or zero)l 0110 = VS - V set (overflow)l 0111 = VC - V clear (no overflow)l 1000 = HI - C set and Z clear (unsigned higher) l 1001 = LS - C clear or Z set (unsigned lower or same)l 1010 = GE - N set and V set, or N clear and V clear (greater or equal)l 1011 = LT - N set and

14、 V clear, or N clear and V set (less than)l 1100 = GT - Z clear, and either N set and V set, or N clear and V clear (greater than)l 1101 = LE - Z set, or N set and V clear, or N clear and V set (less than or equal)l 1110 = AL - alwaysl 1111 = NV - never 31 27 0 Cond 24 乘 法 指 令 集l在寄存器产生32位值 cond 0 0

15、0 0 Rm 31 28 27 2423 21 20 19 1615 12 11 8 7 4 3 0 1 0 0 1RsRn/RdLoRd/RdHimul S 25 乘 法l 例 子 (乘 法 , 乘 法 累 加 器 )l 注 意u 最 低 32-bits 置 于 结 果 寄 存 器 中 ,其 余 被 忽 略 u 不 支 持 第 二 立 即 操 作 数u 结 果 寄 存 器 与 源 寄 存 器 必 须 不 同 u if S bit is set the V is preserved and the C is rendered meaninglessMUL r4, r3, r2 r4 := r3

16、 x r2MLA r4, r3, r2, r1 r4 := r3 x r2 + r1 26 数 据 传 送 指 令 - 1l 单 指 令 传 送 (LDR, STR)u 单 字 (32bit), 半 字 (6 bit) 以 及 字 节 (8 bit) 传 送u 寻 址u寄 存 器 偏 移u地 址 =基 址 寄 存 器 偏 移u立 即 数 偏 移u地 址 = 基 址 立 即 数 常 数 u后 变 址 Post-indexing: modify address after useu前 变 址 Pre-indexing: modify address before useu 回 写u如 果 可 能

17、,更 新 基 址 寄 存 器 27 单 寄 存 器 传 送 指 令LDR 把 一 个 字 装 入 一 个 寄 存 器 Rdmem32addressSTR 从 一 个 寄 存 器 保 存 一 个 字 或 者 一 个 字 节 Rdmem32addressLDRB 把 一 个 字 节 装 入 一 个 寄 存 器 Rdmem8addressSTRB 从 一 个 寄 存 器 保 存 一 个 字 节 Rdmem8addressLDRH 把 一 个 半 字 节 装 入 一 个 寄 存 器 Rdmem16addressSTRH 从 一 个 寄 存 器 保 存 一 个 半 字 Rdmem16addressLDR

18、SB 把 一 个 有 符 号 字 节 装 入 寄 存 器 RdsignExtent(mem 8address)LDRSH 把 一 个 有 符 号 半 字 装 入 寄 存 器 RdsignExtent(mem16address) 28 寻 址 方 式变 址 模 式 数 据 基 址 寄 存 器 示 例回 写 前 变 址 membase+offset 基 址 寄 存 器 加 上 偏移 LDR r0,r1,#4!前 变 址 membase+offset 不 变 LDR r0,r1,#4后 变 址 membase 基 址 寄 存 器 加 上 偏移 LDR r0,r1,#4 29 例 子l PRE r0=

19、0 x00000000, r1=0 x00009000, Mem320 x00009000=0 x01010101 Mem320 x00009004=0 x02020202回 写 型 前 变 址 寻 址 : LDR r0, r1, #0 x4! l POST r0=0 x02020202, r1=0 x00009004前 变 址 寻 址 : LDR r0, r1,#0 x4 l POST r0=0 x02020202, r1=0 x00009000后 变 址 寻 址 : LDR r0, r1 ,#0 x4l POST r0=0 x01010101, r1=0 x00009004 30 数 据

20、传 送 指 令 - 5COPY: ADR r1, TABLE1 ; r1 points to TABLE1ADR r2, TABLE2 ; r2 points to TABLE2LOOP: LDR r0, r1STR r0, r2ADD r1, r1, #4ADD r2, r2, #4 .TABLE1: .TABLE2:. COPY: ADR r1, TABLE1 ; r1 points to TABLE1ADR r2, TABLE2 ; r2 points to TABLE2LOOP: LDR r0, r1, #4STR r0, r2, #4.TABLE1: . TABLE2:. 31 多

21、寄 存 器 数 据 传 送 指 令 - LDMl 多 数 据 传 送 指 令 (LDM, STM)u load (LDM) 或 store (STM) 当 前 可 访 问 寄 存 器 的 任 意 子 集u 使 用u堆 栈 : maintaining full or empty stacks which can grow up or down memoryu上 下 文 切 换 : 保 存 或 重 新 存 储 工 作 寄 存 器 u块 拷 贝 :在 主 存 储 器 中 移 动 大 数 据 块u 寻 址uPre/Post indexinguAuto increment or decrementu回

22、写 到 基 址 寄 存 器 Write back the base register 32 多 寄 存 器 数 据 传 送 指 令 的 要 点l 多 寄 存 器 Load/Store指 令 会 增 加 中 断 的 延 迟 , 因 为 ARM不 会 打 断正 在 执 行 的 指 令 去 响 应 中 断 , 而 必 须 等 到 指 令 执 行 完 成 ;l 一 般 编 译 器 将 提 供 一 个 选 项 以 控 制 Load/Store指 令 可 以 传 送 的 最大 寄 存 器 数 目 , 以 限 制 最 大 中 断 延 迟 。 33 多 寄 存 器 传 送 指 令 的 寻 址 模 式寻 址 模

23、 式 描 述 起 始 地 址 结 束 地 址 Rn!IA 执 行 后 增 加 Rn Rn+4*N-4 Rn+4*NIB 执 行 前 增 加 Rn+4 Rn+4*N Rn+4*NDA 执 行 后 减 少 Rn-4*N+4 Rn Rn-4*NDB 执 行 前 减 少 Rn-4*N Rn-4 Rn-4*N注 : ! 决 定 Rn的 值 是 否 随 着 传 送 而 改 变 34 例 子要 求 : 保 存 r1r3到 内 存 地 址 0 x90000 x900c, 并 且 更 新 基址 寄 存 器 r4PRE: r1=0 x00000001, r2=0 x00000002, r3=0 x00000003

24、, r4=0 x9000执 行 操 作 : STMIA r4!, r1, r2, r3(执 行 后 增 加 )POST: mem320 x9000=0 x00000001 mem320 x9004=0 x00000002 mem320 x9008=0 x00000003 r4=0 x900c 35 多 寄 存 器 传 送 寻 址 模 式r5r1r9 r0r9STMIA r9!, r0,r1,r51000 16100c16101816r1r5r9STMDA r9!, r0,r1,r5r0r9 1000 16100c16101816 r5r9STMDB r9!, r0,r1,r5r1r0r9 10

25、0016100c16101816 r5r1r0r9r9STMIB r9!, r0,r1,r5100016100c16101816 36 例 1:将 存 储 器 中 的 连 续 数 据 装 载 到 寄 存 器l PRE mem320 x80018=0 x03, mem320 x80014=0 x02, mem320 x80010=0 x01, r0=0 x00080010, r1=0 x00000000, r2=0 x00000000, r3=0 x00000000执 行 指 令 : LDMIA r0!, r1-r3 l POST r0=0 x0008001c, r1=0 x00000001,

26、r2=0 x00000002, r3=0 x00000003 0 x80020 0 x000000050 x8001c 0 x000000040 x80018 0 x000000030 x80014 0 x000000020 x80010 0 x000000010 x8000c 0 x00000000地 址 指 针 存 储 地 址 数 据 r3=0 x00000000r2=0 x00000000r1=0 x00000000r0=0 x80010 37 例 2: 完 成 一 个 存 储 器 数 据 块 拷 贝l 注 : r9存 放 源 数 据 的 起 始 地 址 r10存 放 目 标 起 始 地

27、 址 r11存 放 源 结 束 地 址 loop LDMIA r9!, r0-r7 ;装 载 32字 节 并 更 新 r9指 针 STMIA r10!, r0-r7 ;存 储 32字 节 并 更 新 r10指 针 CMP r9, r11 ;是 否 到 达 结 束 地 址 BNE loop ;不 相 等 跳 转 目 的源高 地 址低 地 址 拷 贝存 储地 址r9r11r10 38 堆 栈 操 作l ARM使 用 多 寄 存 器 Load/Store指 令 来 完 成 堆 栈 操 作 ;l 使 用 堆 栈 时 , 需 要 确 定 堆 栈 在 存 储 空 间 中 是 向 上 生 长 (递 增 的

28、“ A”) 还 是 向 下 生 长 ( 递 减 的 “ D”) ;l 满 堆 栈 ( “ F”) 是 指 堆 栈 指 针 指 向 堆 栈 的 最 后 一 个 已使 用 的 地 址 或 满 位 置 ; 相 反 , 空 堆 栈 ( “ E”) 是 指 SP指 向 堆 栈 的 第 一 个 没 有 使 用 的 地 址 或 空 位 置 ; 39 堆 栈 操 作 寻 址 方 式寻 址 方 式 说 明 pop =LDM push =STMFA 递 增 满 LDMFA LDMDA STMFA STMIBFD 递 减 满 LDMFD LDMIA STMFD STMDBEA 递 增 空 LDMEA LDMDB S

29、TMEA STMIAED 递 减 空 LDMED LDMIB STMED STMDA 40 LDMFD sp!,r4-r7,pcSP100FF1234AOBE80341010123484209753r41r514544r60r712lr9048pc9020100100FFFF12341234A0BEA0BE80348034堆 栈r4100r5FFr61234r7A0BElr8034ABCD8765102E16FFFF1010123484209753存 储 器 顶SP SP100FF1234A0BE8034SPOld SP100FF1234A0BE8034l ARM堆 栈 操 作 通 过 块 传

30、 送 指 令 来 完 成 :STMFD(Push) 块 存 储 - Full Descending stack STMDBLDMFD(Pop)块 装 载 - Full Descending stack LDMIASTMFD sp!,r4-r7,lr 41 例 : 把 寄 存 器 内 容 放 入 堆 栈 , 更 新 sp0 x80018 0 x000000010 x80014 0 x000000020 x80010 Empty0 x8000c Empty 0 x80018 0 x000000010 x80014 0 x000000020 x80010 0 x000000030 x8000c 0

31、x00000002PRE 地 址 数 据 POST 地 址 数 据SP SPPRE : r1=0 x00000002, r4=0 x00000003, sp=0 x00080014执 行 指 令 : STMFD sp!, r1,r4POST: r1=0 x00000002, r4=0 x00000003, sp=0 x0008000c 42 单 数 据 交 换 指 令 - SWAPl 单 数 据 交 换 (SWAP)u 在 寄 存 器 和 外 部 存 储 器 之 间 交 换 字 节 或 字u 读 存 储 器 和 写 存 储 器 是 是 放 在 一 起 的u原 子 指 令u执 行 时 不 能 中

32、 断u当 LOCK 信 号 输 出 操 作 时 ,外 部 存 储 器 管 理 单 元 被 锁 定,当 u多 线 程 操 作 时 使 程 序 同 步 (OS支 持 )u锁 定u信 号 量 43 l 在 寄 存 器 和 存 储 器 之 间 , 由 一 次 存 储 器 读 和 一 次 存 储 器 写 组 成 的 原 子 操 作 。 完 成一 个 字 节 或 字 的 交 换 。l 语 法 :l SWPB Rd, Rm, Rn l 可 用 作 信 号 量l 不 能 由 armcc编 译 产 生 , 必 须 使 用 汇 编 器 。Rm Rd 32 1 temp存 储 器Rn SWP 44 SWAP指 令

33、的 用 法l PRE mem320 x9000=0 x12345678, r0=0 x00000000, r1=0 x11112222, r2=0 x00009000执 行 操 作 : SWP r0, r1, r2 l POST: mem320 x9000=0 x11112222, r0=0 x12345678, r1=0 x11112222, r2=0 x00009000l 交 换 指 令 多 用 于 实 现 操 作 系 统 中 的 信 号 量 和 互 斥 操 作 , 该 指 令 有修 饰 符 B, 即 有 字 交 换 和 字 节 交 换 两 种 形 式 ; 45 SWP指 令 应 用 示

34、例Spin MOV r1, =semaphore MOV r2, #1 SWP r3, r2, r1 CMP r3, #1 BEQ spin注 : 信 号 量 指 向 的 单 元 是 0或 1, 如 果 为 1, 则 表 示 该 服 务 被 另 一 个 过程 使 用 , 程 序 继 续 循 环 , 直 至 为 0 46 软 件 中 断 (SWI)l 产 生 一 个 异 常 陷 阱 , 跳 转 到 SWI 硬 件 向 量 。l SWI 处 理 程 序 可 以 检 测 SWI号 , 从 而 决 定 采 取 何 种 操 作 。l 通 过 SWI机 制 , 运 行 在 用 户 模 式 下 的 应 用

35、程 序 , 可 请 求 操 作 系 统执 行 一 系 列 特 权 操 作 。l 语 法 :l SWI 47 软 件 中 断 (SWI)执 行 的 操 作指 令 名 称 执 行 操 作SWI 软 件 中 断 Lr_svc=SWI指 令 后 面 的 指 令 地 址spsr_svc=cpsrpc=vectors+0 x8cpsr模 式 =SVCcpsr I=1(屏 蔽 IRQ中 断 ) 48 SWI中 断 处 理 程 序l 处 理 软 件 中 断 的 代 码 段 称 为 中 断 处 理 程 序 ( SWI Handler),中 断 处理 程 序 是 通 过 执 行 指 令 的 地 址 获 取 软 件

36、 中 断 号 , 指 令 地 址 是 从 lr计算 出 来 的 ;l SWI号 的 确 定 方 法 : SWI_Number=and NOT(0 xff00000000) 2831 2427 0 Cond 1 1 1 1 SWI number (ignored by processor)23条 件 域 49 SWI处 理 程 序 应 用 示 例l SWI_handler ;保 存 寄 存 器 r0r12和 lr STMFD sp!, r0-r12,lr ;read the SWI instruction LDR r10,lr,#-4 ;make off top 8 bits BIC r10,r

37、10, #0 xff000000 ; r10-contains the SWI number BL service_routine ;return from SWI handler LDMFD sp!, r0-r12,pc 50 控 制 和 分 支 指 令l 控 制 指 令u 分 支 和 分 支 连 接u跳 到 希 望 的 指 令 中u保 存 当 前 的 PC并 返 回 (with L bit) u 分 支 和 交 换u跳 到 期 望 的 指 令 中 与 指 令 集 交 换uRm0 = 1: Subsequent inst. are THUMB.uRm0 = 0: Subsequent ins

38、t. are ARM.cond 1 0 1 L 24-bit signed word offset31 28 27 25 24 23 0cond Rm0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 0 031 2827 6 5 4 3 01L 51 l Branch :B labell Branch with Link :BL subroutine_label l 处 理 器 把 偏 移 量 左 移 两 位 , 进 行 符 号 扩 展 后 再 与 PC相 加 l 跳 转 范 围 : 32 Mbyte?l 如 何 执 行 长 跳 转 ?2831 24 0 Cond

39、 1 0 1 L 偏 移 量 条 件 码 区 域Link bit 0 = Branch1 = Branch with link232527 分 支 指 令 52 控 制 流 指 令 Branch Interpretation Normal uses B BAL Unconditional Always Always take this branch Always take this branch BEQ Equal Comparison equal or zero result BNE Not equal Comparison not equal or non-zero result BPL

40、Plus Result positive or zero BMI Minus Result minus or negative BCC BLO Carry clear Lower Arithmetic operation did not give carry-out Unsigned comparison gave lower BCS BHS Carry set Higher or same Arithmetic operation gave carry-out Unsigned comparison gave higher or same BVC Overflow clear Signed

41、integer operation; no overflow occurred BVS Overflow set Signed integer operation; overflow occurred BGT Greater than Signed integer comparison gave greater than BGE Greater or equal Signed integer comparison gave greater or equal BLT Less than Signed integer comparison gave less than BLE Less or eq

42、ual Signed integer comparison gave less than or equal BHI Higher Unsigned comparison gave higher BLS Lower or same Unsigned comparison gave lower or same 53 分 支 和 链 接 指 令l 分 支 子 程 序 (r14 serves as a link register) l 嵌 套 子 程 序BL SUBR ; branch to SUBR. ; return hereSUBR: . ; SUBR entry pointMOV pc, r1

43、4 ; return BL SUB1 .SUB1: ; save work and link registerSTMFD r13!, r0-r2,r14 BL SUB2.LDMFD r13!, r0-r2,pcSUB2: .MOV pc, r14 ; copy r14 into r15Full Descending 54 请 求 管 理 程 序l 管 理 程 序 是 在 特 权 级 操 作 的 程 序 ,它 可 以 实 现 用 户 级 程 序 不 能 实现 的 任 务l Example: send text to the displayl ARM ISA 包 括 SWI (SoftWare I

44、nterrupt) ; output r07:0SWI SWI_WriteC; return from a user program back to monitorSWI SWI_Exit 55 转 移 表l 根 据 程 序 计 算 值 调 用 一 个 子 程 序BL JTAB.JTAB: CMP r0, #0 BEQ SUB0CMP r0, #1BEQ SUB1CMP r0, #2BEQ SUB2Note: slow when the list is long, and all subroutines are equally frequent BL JTAB.JTAB: ADR r1, SU

45、BTABCMP r0, #SUBMAX ; overrun?LDRLS pc, r1, r0, LSL #2B ERRORSUBTAB: DCD SUB0DCD SUB1DCD SUB2. 56 程 序 状 态 寄 存 器 访 问 指 令l 程 序 状 态 寄 存 器 访 问 指 令 (MRS, MSR)l MRS 程 序 状 态 寄 存 器 到 通 用 寄 存 器 的 数 据 传 送 指 令l MSR 通 用 寄 存 器 到 程 序 状 态 寄 存 器 的 数 据 传 送 指 令 57 PSR 传 送 指 令l MRS和 MSR允 许 传 送 CPSR / SPSR中 的 内 容 到 /从

46、一 个 通 用 寄 存 器 中 。l 语 法 :l MRS Rd, ; Rd = l MSR ,Rm ; = Rm在 这 里 : l = CPSR or SPSRl_fields = fsxc的 任 意 组 合l 也 允 许 送 一 个 立 即 数 到 psr_fieldsl MSR ,#Immediatel 用 户 模 式 下 , 所 有 位 均 可 以 被 读 取 , 但 只 有 条 件 标 志 位 (_)可 被 写 。2731N Z C V Q28 67I F T mode1623 815 5 4 024fsxc U n d e f i n e dJ 58 协 处 理 器 指 令 - 1

47、l 协 处 理 器l 一 般 原 理 是 通 过 增 加 核 扩 展 指 令 集l Example : 如 MMU (FIELD:预 留 2KB的 存 储 空 间 )SVCStack # 2048;UndefStack # 2048;AbortStack # 2048;IRQStack # 2048; FIQStack # 0; 94 初 始 化 堆 栈 (2)l 第 二 步 :定 义 各 种 模 式 下 的 寄 存 器设 定 未 定 义 指 令 模 式 堆 栈 :mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x1b|0 xc0msr cpsr_cxsf,r1

48、 ;chang mode to UnderStack M11011ldr sp,=UndefStack ;let sp=UnderStack设 定 中 止 模 式 堆 栈 :mrs r0,cpsr bic r0,r0,#0 x1forr r1,r0,#0 x17|0 xc0msr cpsr_cxsf,r1 ;chang mode to UnderStack M10111ldr sp,=AbortStack ;let sp=AbortStack 95 初 始 化 堆 栈 (3)设 定 中 断 模 式 堆 栈 :mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x12

49、|0 xc0msr cpsr_cxsf,r1 ;chang mode to UnderStack M10010ldr sp,=IRQStack ;let sp=IRQStack设 定 快 速 中 断 模 式 堆 栈 :mrs r0,cpsrbic r0,r0,#0 x1forr r1,r0,#0 x11|0 xc0 msr cpsr_cxsf,r1 ;chang mode to UnderStack M10001ldr sp,=FIQStack ;let sp=FIQStack 96 初 始 化 堆 栈 (4)设 定 监 控 模 式 堆 栈 :mrs r0,cpsrbic r0,r0,#0 x

50、1forr r1,r0,#0 x13|0 xc0msr cpsr_cxsf,r1 ;chang mode to UnderStack M10011ldr sp,=SVCStack ;let sp=SVCStack 97 ATPCS( arm/thumb程 序 调 用 规 范 ) r8r9/sbr10/slr11r12r13/spr14/lrr15/pcr0r1r2r3r4r5r6r7寄 存 器 变 量必 须 保 护作 为 函 数 传 递 的 参 数 值Scratch register(corruptible)Stack PointerLink RegisterProgram Counter 编

51、 译 器 使 用 一 套 规 则 的 来 设 置 寄 存 器 的 用 法ARM-Thumb Procedure Call Standard or ATPCS (or APCS)CPSR 标 志 位 可 被 函 数 调 用 所 破 坏任 何 和 编 译 过 的 代 码 交 互 工 作 的 汇 编 码 在 接 口 层 必 须 满 足 ATPCS的 规 范Register - 如 果 RWPI选 项 有 效 , 作 为 栈 的 基 地 址- 如 果 软 件 堆 栈 检 查 有 效 , 作 为 栈 的 限 制 值- 可 作 为 临 时 的 一 个 值 栈 一 样 来 使 用- 子 程 序 内 部 调

52、用 的 可 改 写 的 寄 存 器- 程 序 计 数 器 98 参 数 传 递l 开 始 四 个 字 大 小 的 参 数 直 接 使 用 寄 存 器 的 R0-R3来 传 递 (快 速 且 高效 的 )l更 多 的 信 息 可 参 看 ATPCSl 如 果 需 要 更 多 的 参 数 , 将 使 用 堆 栈 。 (需 要 额 外 的 指 令 和 慢 速 的 存储 器 操 作 ) l 所 以 通 常 限 制 参 数 的 个 数 , 使 它 为 4或 更 少 。l如 果 不 可 避 免 , 把 常 用 的 参 数 前 4个 放 在 R0-R3中 Example. 99 l Parameter Pa

53、ssing (4 parameters)int func1(int a, int b, int c, int d) return a+b+c+d;int caller1(void) return func1(1,2,3,4); func1 0 x000000 : ADD r0,r0,r1 0 x000004 : ADD r0,r0,r2 0 x000008 : ADD r0,r0,r3 0 x00000c : MOV pc,lr caller1 0 x000014 : MOV r3,#4 0 x000018 : MOV r2,#3 0 x00001c : MOV r1,#2 0 x000020

54、 : MOV r0,#1 0 x000024 : B func1 Parameter Passing (4 parameters) 100 Parameter Passing (6 parameters)l Parameter Passing (6 parameters)func2 0 x000000 : STR lr, sp,#-4! 0 x000004 : ADD r0,r0,r1 0 x000008 : ADD r0,r0,r2 0 x00000C : ADD r0,r0,r3 0 x000010 : LDMIB sp,r12,r14 0 x000014 : ADD r0,r0,r12

55、0 x000018 : ADD r0,r0,r14 0 x00001C : LDR pc,sp,#4 caller2 0 x000020 : STMFD sp!,r2,r3,lr 0 x000024 : MOV r3,#6 0 x000028 : MOV r2,#5 0 x00002C : STMIA sp,r2,r3 0 x000030 : MOV r3,#4 0 x000034 : MOV r2,#3 0 x000038 : MOV r1,#2 0 x00003C : MOV r0,#1 0 x000040 : BL func2 0 x000044 : LDMFD sp!,r2,r3,pc

56、int func2(int a,int b,intc, int,d,int e,int f) return a+b+c+d+e+f;int caller2(void) return func1(1,2,3,4,5,6);This code is compiled with “-O2 -Ono_autoinline” 101 Parameter Passing (6 parameters)func2 0 x000000 : STR lr, sp,#-4! 0 x000004 : ADD r0,r0,r1 0 x000008 : ADD r0,r0,r2 0 x00000C : ADD r0,r0

57、,r3 0 x000010 : LDMIB sp,r12,r14 0 x000014 : ADD r0,r0,r12 0 x000018 : ADD r0,r0,r14 0 x00001C : LDR pc,sp,#4 caller2 0 x000020 : STMFD sp!,r2,r3,lr 0 x000024 : MOV r3,#6 0 x000028 : MOV r2,#5 0 x00002C : STMIA sp,r2,r3 0 x000030 : MOV r3,#4 0 x000034 : MOV r2,#3 0 x000038 : MOV r1,#2 0 x00003C : MO

58、V r0,#1 0 x000040 : BL func2 0 x000044 : LDMFD sp!,r2,r3,pc56 SP123456 102 循 环 终 止l 在for(), while() dowhile()的 循 环 中 , 用 减 到0代 替 加 到 某 个 值 。l 比 如 , 用 下 面 的 代 替 :for (loop = 1; loop = total; loop+) /(ADD,CMP)代 替 为 : for (loop = total; loop != 0; loop-) /(SUBS) l 尽 量 减 少 循 环 的 次 数l 代 码 小 , 且 使 用 更 少 的

59、 寄 存 器 Example. 103 Loop Termination Count upint fact1(int limit) int i; int fact = 1; for (i = 1; i = limit; i+) fact = fact * i; return fact; Count downint fact2(int limit) int i; int fact = 1; for (i = limit; i != 0; i-) fact = fact * i; return fact; fact2 0 x000000 : MOVS r1,r0 0 x000004 : MOV r

60、0,#1 0 x000008 : MOVEQ pc,lr 0 x00000c : MUL r0,r1,r0 0 x000010 : SUBS r1,r1,#1 0 x000014 : BNE 0 x0c 0 x000018 : MOV pc,lrfact1 0 x000000 : MOV r2,#1 0 x000004 : MOV r1,#1 0 x000008 : CMP r0,#1 0 x00000c : BLT 0 x20 0 x000010 : MUL r2,r1,r2 0 x000014 : ADD r1,r1,#1 0 x000018 : CMP r1,r0 0 x00001c :

61、 BLE 0 x10 0 x000020 : MOV r0,r2 0 x000024 : MOV pc,lrThis code is compiled with “-O2 -Otime” 104 在 C程 序 中 调 用 汇 编l 在 汇 编 程 序 中 用 export name来 定 义l 在 C程 序 中 直 接 调 用 ,用 EXTERN声 明l 正 常 链 接extern void mystrcopy(char *d, const char *s);int main(void) const char *src = “Source”; char dest10; . mystrcopy(

62、dest, src); . AREA StringCopy, CODE, READONLY EXPORT mystrcopymystrcopy LDRB r2, r1, #1 STRB r2, r0, #1 CMP r2, #0 BNE mystrcopy MOV pc, lr END这 里 所 有 的 参 数 都 是 可 以 用 寄 存 器 来 传 递 的 , 所 以 不 需 要 在 汇 编 程 序 中 使 用PUSH/POP来 保 护 CALL 105 内 嵌 汇 编l 允 许 使 用 一 些 不 能 由 编 译 器 自 动生 成 的 指 令 :lMSR / MRSl新 的 指 令l协 处

63、 理 器 指 令l 通 常 在 关 联 的 内 嵌 函 数 中 使 用 l 使 用 C变 量 代 替 寄 存 器l不 是 一 个 真 正 的 汇 编 文 件l通 过 优 化 器 实 现l ADS FAQ 入 口 “ Using the Inline Assembler”#define Q_Flag 0 x08000000 / Bit 27_inline void Clear_Q_flag (void) int temp;_asm MRS temp, CPSR BIC temp, temp, #Q_Flag MSR CPSR_f, temp_inline int mult16(short a,

64、short b, int c)int temp;_asm SMLABB temp,a,b,c return temp; 106 107 oflN4*B*qYuLAl(1EzUTosf(AtA6rB6g3VlPKq3k(miCteA3&nNp%zc)%BNoB5wlD0mVF&vKO3SQ+H*UFAU!1cNw)KK8x#%2M%BR6LG4jT%B1#!L#+j!gSDvWLKQ2UE5$hkPaZCsqn$Mzb8zwgZU846z+q!gzktRzfpkCCs0JHrzJQMXaS0!CM2JL0RqxXZ4qutTYorj-y*XbRiWTIAt6Kk7gN$UpU2cC(gEkf)l

65、y!euu8QewCN6u3AlLo8283vNbm8$Kpxj-Cw9(jJ953ucP(ZLjAZbb&ECi$Lq9(51UP(Ahy!84R4HB0Yedck*RPq1L!nwT2qqTTUs!5TZYPd80MdKMCPN$q02k6)0NwVs(mI8LjEbvby69$r4KpB#%r#T%FI6PS!gnkCgIil+CiKH(I(KRker%N%!RVq2kUX2uWJFBGk4Z$%YU6G+YuTBw$AjE0nbksSLHmzX#y&bqRvN-mTrzFA2H$XdrB&Ijz!y1HbQCGYlMS6s&-h0+YTkse!U2x9sH26X9HCJ1$XwSz)N

66、#N!6)owZaRkbIjHOsoo%1plv$CYIXMr&GVCrW-WBe)2B-xB-cN2)F%T!DtZ5E)(WQjLSMMzMabv-SCy3qEiatd1PvtXDBShRoJK21PkFrt*JyIQ$h71O4gbQcbLLA#2%Z&GwP*c+YT+*J)VH2*6chcyRM1JWuzYwxMpvLy1Q7k$!%9BgRG900dJDk&bfLv)u$stURd*yxtq+T2J#CJXGxdFaz&U*2UmaH#C1$SVw#+iN+kk3ePnB3Tls-6vtBC0enkhAwlIqj9fa3TVg6NTCRSkQTpo8A-hxW91ETClbX0oOf#so43MQGwp%WD+&S1Dw(3J-zRujjbGbDmJ&KHNQEFc)L7q9(0TMf*k!bRhQ)kBLIb3k#BXaVd08O0IQyjbpPEHNl2K3Vq(!GK8+Y%cdruDpKASUuqSq6GCvgSKVI#62UNgap%l9&sSshwZGHi3mHyLp1CBM+fix8qVHhTTJ6G-5!XmA8f8UkaIVJEuCzIpdlsbDfH6S

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!