当前位置: 首页 > news >正文

雄安网站制作多少钱2023年中国进入一级战备状态了吗

雄安网站制作多少钱,2023年中国进入一级战备状态了吗,网站的排名与权重,软文营销文章范文目录一、简介二、ARM 汇编指令说明2.1 32位数据操作指令2.2 32位存储器数据传送指令2.3 32位转移指令2.4 其它32位指令三、实例讲解3.1 MRS3.2 MSR3.3 PRIMASK3.4 FAULTMASK3.5 BX指令3.6 零寄存器 wzr、xzr3.7 立即寻址指令3.8 寄存器间接寻址指令3.9 寄存器移位寻址指令3.10 … 目录一、简介二、ARM 汇编指令说明2.1 32位数据操作指令2.2 32位存储器数据传送指令2.3 32位转移指令2.4 其它32位指令三、实例讲解3.1 MRS3.2 MSR3.3 PRIMASK3.4 FAULTMASK3.5 BX指令3.6 零寄存器 wzr、xzr3.7 立即寻址指令3.8 寄存器间接寻址指令3.9 寄存器移位寻址指令3.10 基址寻址指令3.11 多寄存器寻址指令3.12 无条件转移BBAL3.13 条件转移3.14 WFE 和 WFI 对比一、简介 本文主要整理了arm常用的汇编指令同时通过实例进一步讲述语句的用法。 二、ARM 汇编指令说明 2.1 32位数据操作指令 名字功能ADC带进位加法ADD加法ADDW宽加法可以加 12 位立即数AND按位与ASR算术右移BIC位清零把一个数按位取反后与另一个数逻辑与BFC位段清零BFI位段插入CMN负向比较把一个数和另一个数的二进制补码比较并更新标志位CMP比较两个数并更新标志位CLZ计算前导零的数目EOR按位异或LSL逻辑左移LSR逻辑右移MLA乘加MLS乘减MOVW把 16 位立即数放到寄存器的底16位高16位清0MOV加载16位立即数到寄存器其实汇编器会产生MOVW——译注MOVT把 16 位立即数放到寄存器的高16位低 16位不影响MVN移动一个数的补码MUL乘法ORR按位或ORN把源操作数按位取反后再执行按位或RBIT位反转把一个 32 位整数先用2 进制表达再旋转180度——译注REV对一个32 位整数做按字节反转REVH/REV16对一个32 位整数的高低半字都执行字节反转REVSH对一个32 位整数的低半字执行字节反转再带符号扩展成32位数ROR圆圈右移RRX带进位的逻辑右移一格最高位用C 填充且不影响C的值——译注SFBX从一个32 位整数中提取任意的位段并且带符号扩展成 32 位整数SDIV带符号除法SMLAL带符号长乘加两个带符号的 32 位整数相乘得到 64 位的带符号积再把积加到另一个带符号 64位整数中SMULL带符号长乘法两个带符号的 32 位整数相乘得到 64位的带符号积SSAT带符号的饱和运算SBC带借位的减法SUB减法SUBW宽减法可以减 12 位立即数SXTB字节带符号扩展到32位数TEQ测试是否相等对两个数执行异或更新标志但不存储结果TST测试对两个数执行按位与更新标志但不存储结果UBFX无符号位段提取UDIV无符号除法UMLAL无符号长乘加两个无符号的 32 位整数相乘得到 64 位的无符号积再把积加到另一个无符号 64位整数中UMULL无符号长乘法两个无符号的 32 位整数相乘得到 64位的无符号积USAT无符号饱和操作但是源操作数是带符号的——译注UXTB字节被无符号扩展到32 位高24位清0——译注UXTH半字被无符号扩展到32 位高16位清0——译注 2.2 32位存储器数据传送指令 名字功能LDR加载字到寄存器LDRB加载字节到寄存器LDRH加载半字到寄存器LDRSH加载半字到寄存器再带符号扩展到 32位LDM从一片连续的地址空间中加载多个字到若干寄存器LDRD从连续的地址空间加载双字64 位整数到2 个寄存器STR存储寄存器中的字STRB存储寄存器中的低字节STRH存储寄存器中的低半字STM存储若干寄存器中的字到一片连续的地址空间中STRD存储2 个寄存器组成的双字到连续的地址空间中PUSH把若干寄存器的值压入堆栈中POP从堆栈中弹出若干的寄存器的值 2.3 32位转移指令 名字功能B无条件转移BL转移并连接呼叫子程序TBB以字节为单位的查表转移。从一个字节数组中选一个8位前向跳转地址并转移TBH以半字为单位的查表转移。从一个半字数组中选一个16 位前向跳转的地址并转移 2.4 其它32位指令 名字功能LDREX加载字到寄存器并且在内核中标明一段地址进入了互斥访问状态LDREXH加载半字到寄存器并且在内核中标明一段地址进入了互斥访问状态LDREXB加载字节到寄存器并且在内核中标明一段地址进入了互斥访问状态STREX检查将要写入的地址是否已进入了互斥访问状态如果是则存储寄存器的字STREXH检查将要写入的地址是否已进入了互斥访问状态如果是则存储寄存器的半字STREXB检查将要写入的地址是否已进入了互斥访问状态如果是则存储寄存器的字节CLREX在本地的处理上清除互斥访问状态的标记先前由 LDREX/LDREXH/LDREXB做的标记MRS加载特殊功能寄存器的值到通用寄存器MSR存储通用寄存器的值到特殊功能寄存器NOP无操作SEV发送事件WFE休眠并且在发生事件时被唤醒WFI休眠并且在发生中断时被唤醒ISB指令同步隔离与流水线和 MPU等有关——译注DSB数据同步隔离与流水线、MPU 和cache等有关——译注DMB数据存储隔离与流水线、MPU 和cache等有关——译注DMB数据存储器隔离。DMB 指令保证 仅当所有在它前面的存储器访问操作都执行完毕后才提交(commit)在它后面的存储器访问操作。DSB数据同步隔离。比 DMB 严格 仅当所有在它前面的存储器访问操作都执行完毕后才执行在它后面的指令亦即任何指令都要等待存储器访 问操作——译者注ISB指令同步隔离。最严格它会清洗流水线以保证所有它前面的指令都执行完毕之后才执行它后面的指令。 三、实例讲解 3.1 MRS 将CPSR或SPSR的内容移动到一个通用寄存器 MRS R0CPSR //传送CPSR的内容到R0 MRS R0SPSR //传送 SPSR的内容到R03.2 MSR 将立即数或通用寄存器的内容加载到CPSR或SPSR的指定字段中 MSR CPSRR0 //传送R0的内容到CPSR MSR SPSRR0 //传送R0的内容到SPSR MSR CPSR_cR0 //传送R0的内容到SPSR但仅仅修改CPSR中的控制位域3.3 PRIMASK 用于disable NMI和硬 fault之外的所有异常它有效地把当前优先级改为 0可编程 优先级中的最高优先级。 CPS指令会更改CPSR中的一个或多个模式以及A、I和F位但不更改其他CPSR位。CPSID就是中断禁止CPSIE中断允许 A表示启用或禁止不精确的中止I表示启用或禁止IRQ中断F表示启用或禁止FIQ中断 3.4 FAULTMASK CPSIE f; / CPSID f;MSR FAULTMASK,R0FAULTMASK更绝它把当前优先级改为-1。这么一来连硬fault都被掩蔽了。使用方案与 PRIMASK的相似。但要注意的是FAULTMASK会在异常退出时自动清零。 3.5 BX指令 BX{条件} 目标地址 BX 指令跳转到指令中所指定的目标地址目标地址处的指令既可以是ARM 指令也可以是Thumb指令。 3.6 零寄存器 wzr、xzr 因为我们在使用 str 的是没法使用立即数 0 给寄存器赋值所以 wzr xzr就是干这个事情的。是一个比较特殊又常常见到的寄存器。 3.7 立即寻址指令 SUBS R0,R0,#1 //R0 减 1 结果放入 R0 并且影响标志位 MOV R0,#0xFF000 //将立即数 0xFF000 装入 R0 寄存器 寄存器寻址指令举例如下 MOV R1,R2 //将 R2 的值存入 R1 SUB R0,R1,R2 //将 R1 的值减去 R2 的值结果保存到 R03.8 寄存器间接寻址指令 LDR R1,[R2] //将 R2 指向的存储单元的数据读出保存在 R1 中 SWP R1,R1,[R2] //将寄存器 R1 的值和 R2 指定的存储单元的内容交换将R2的数值作为一个地址将此地址处的数值与R1中的内容交换3.9 寄存器移位寻址指令 MOV R0,R2,LSL #3 //R2 的值左移 3 位结果放入R0 即是R0R2×8 ANDS R1,R1,R2,LSL R3 //R2 的值左移 R3 位然后和R1相“与”操作结果放入R13.10 基址寻址指令 LDR R2,[R3,#0x0C] //读取 R30x0C 地址上的存储单元的内容放入 R2 STR R1,[R0,#-4]! //先 R0R0-4 然后把 R1 的值寄存到 R0 指定的存储单元 3.11 多寄存器寻址指令 LDMIA R1!,{R2-R7,R12} //将 R1 指向的单元中的数据读出到R2 R7、R12 中 (R1自动加1) STMIA R0!,{R2-R7,R12} //将寄存器 R2 R7 、 R12 的值保存到 R0 指向的存储单元中(R0自动加1)3.12 无条件转移BBAL 举例 B LABEL ; LABEL为某个位置 CMP x3,x4 B.CS {pc}0x10 ; 0xc000800094BCC是指CPSR寄存器条件标志位为0时的跳转。结合CMP R3, R1意思是比较R3 R1寄存器当相等时跳转到环测试。因为CMP指令减去两个值并在CPSR中设置条件标志位。 3.13 条件转移 BEQ 相等 BNE 不等 BPL 非负 BMI 负 BCC 无进位 BCS 有进位 BLO 小于无符号数 BHS 大于等于无符号数 BHI 大于无符号数 BLS 小于等于无符号数 BVC 无溢出有符号数 BVS 有溢出有符号数 BGT 大于有符号数 BGE 大于等于有符号数 BLT 小于有符号数 BLE 小于等于有符号数blr Xm跳转到由Xm目标寄存器指定的地址处同时将下一条指令存放到X30寄存器中。例如blr x20. br Xm跳转到由Xm目标寄存器指定的地址处。不是子程序返回 ret {Xm}跳转到由Xm目标寄存器指定的地址处。是子程序返回。Xm可以不写默认是X30.3.14 WFE 和 WFI 对比 wfi 和 wfe 指令都是让ARM核进入standby睡眠模式。wfi是直到有wfi唤醒事件发生才会唤醒CPUwfe是直到wfe唤醒事件发生这两类事件大部分相同。唯一不同之处在于wfe可以被其他CPU上的sev指令唤醒sec指令用于修改event寄存器的指令。 WFE Wait For Event是否实现此指令是可选的。如果此指令未实现它将作为NOP指令来执行。如果指令作为NOP在目标处理器上执行汇编程序将生成诊断消息。 SEV Set Event其是否实现是可选的。如果未实现它将作为NOP执行。如果指令作为NOP在目标上执行汇编程序将生成诊断消息。 SEV在ARMv6T2中作为NOP指令执行。 IMPORT |Image$RW_IRAM1$Base| //从别处导入data段的链接地址 IMPORT |Image$RW_IRAM1$Length| //从别处导入data段的长度 IMPORT |Load$RW_IRAM1$Base| //从别处导入data段的加载地址 IMPORT |Image$RW_IRAM1$ZI$Base| //从别处导入ZI段的链接地址 IMPORT |Image$RW_IRAM1$ZI$Length| //从别处导入ZI段的长度 Load$$region_name$$Base //Load address of the region. Load$$region_name$$Length //Region length in bytes. Load$$region_name$$Limit //Address of the byte beyond the end of the execution region.//复制数据段 LDR R0, |Load$RW_IRAM1$Base| //将data段的加载地址存入R0寄存器 LDR R1, |Image$RW_IRAM1$Base| //将data段的链接地址存入R1寄存器 LDR R2, |Image$RW_IRAM1$Length| //将data段的长度存入R2寄存器 CopyData SUB R2, R2, #4 //每次复制4个字节的data段数据 LDR R3, [R0, R2] //把加载地址处的值取出到R3寄存器 STR R3, [R1, R2] //把取出的值从R3寄存器存入到链接地址 CMP R2, #0 //将计数和0相比较 BNE CopyData //如果不相等跳转到CopyData标签处相等则往下执行//清除BSS段 LDR R0, |Image$RW_IRAM1$ZI$Base| //将bss段的链接地址存入R1寄存器 LDR R1, |Image$RW_IRAM1$ZI$Length| //将bss段的长度存入R2寄存器 CleanBss SUB R1, R1, #4 //每次清除4个字节的bss段数据 MOV R3, #0 //将0存入r3寄存器 STR R3, [R0, R1] //把R3寄存器存入到链接地址 CMP R1, #0 //将计数和0相比较 BNE CleanBss //如果不相等跳转到CleanBss标签处相等则往下执行IMPORT mymain //通知编译器要使用的标号在其他文件 BL mymain //跳转去执行main函数 B . //原地跳转即处于循环状态 ENDP ALIGN //填充字节使地址对齐 END //整个汇编文件结束
http://www.w-s-a.com/news/286/

相关文章:

  • 商城网站设计费用网络公司怎样推广网站
  • 视频公司的网站设计工图网
  • 免费快速网站十八个免费的舆情网站