北京网站设计制作关键词优化微信小程序开发推广,网络推广方案微xiala11,wordpress分享 赞插件,加盟酒店网站制作汇编语法
汇编文件中的内容 1.伪操作#xff1a;在汇编程序中不占用存储空间#xff0c;但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令#xff1a;每一条汇编指令都用来标识一个机器码#xff0c;让计算机做…汇编语法
汇编文件中的内容 1.伪操作在汇编程序中不占用存储空间但是可以在程序编译时起到引导和标识作用 .text .global .glbal .if .else .endif .data .word.... 2.汇编指令每一条汇编指令都用来标识一个机器码让计算机做一个指令运算 数据处理指令 数据搬移指令 算数运算指令 数据移位指令 位运算指令 数据比较指令 跳转指令 内存读写指令 状态寄存器传送指令 CPSR 软中断指令 3.伪指令不是汇编指令但是也可以让处理器做一些数据处理通常一条伪指令会由多条汇编指令联合实现 4.注释 单行注释 多行注释 /* */ 条件注释 .if 1/0 指令段1 .else 指令段2 .endif 汇编指令的基本语法格式 指令的基本格式 opcode {cond} {s} Rd, Rn, shifter_operand opcode指令的操作码 cond:条件码后缀 s:指令的执行结果将会影响CPSR中的条件标志位。 Rd目标寄存器指令的运算结果保存在目标寄存器中 Rn第一操作寄存器只能是寄存器 shifter_operand 第二操作数既可以是寄存器编号又可以是立即数 意义让第一操作寄存器中的值和第二操作数按照指令操作码进行运算并且将运算的结果保存在目标寄存器中 注意 1.一般一条汇编指令就占据一行代码 2.汇编不区分大小写 3.操作数前面要跟一个# 汇编指令
数据搬移指令 opcode {cond} {s} Rd, shifter_operand 解释 opcode指令的操作码 cond:条件码后缀 s:指令的执行结果将会影响CPSR中的条件标志位。 Rd目标寄存器指令的运算结果保存在目标寄存器中 shifter_operand 第一操作数既可以是寄存器编号又可以是立即数 指令码 mov:将操作数直接搬移到目标寄存器中 mvn将操作数按位取反之后搬移到目标寄存器中 立即数的概念
定义可以直接当作指令的一部分去执行的数据叫做立即数。立即数是通过一个0-255之间的数字循环右移偶数位获取循环右移低位移除补到高位
立即数的判断
如何判断一个数据是不是立即数 只要让这个数据或者这个数据按位取反的值循环右移偶数位能够得到一个0-255范围内的数字就说明这个数是立即数
如何将一个非立即数保存在寄存器中 利用伪指令ldr即可完成非立即数的操作 格式 ldr 目标寄存器名数据 移位操作指令 格式 opcode {cond} {s} Rd, Rn, shifter_operand 解释将第一操作寄存器的数值移位第二操作数位将结果保存在目标寄存器中 指令码 lsl:左移运算最高位移出最低位补0 lsr:右移运算最低位移出最高位补0 ror:循环右移最低位移出补到最高位 位运算指令
与、或、异或、按位清0 格式 opcode {cond} {s} Rd, Rn, shifter_operand 指令码 and:进行按位与 orr:进行按位或 eor:按位异或 bic按位清0 算数运算指令 格式 opcode{cond}{s} Rd, Rn, shifter_operand 指令码 add:加法运算 RdRnshifter_operand adc:进行加法运算时考虑CPSR的C位 RdRnshifter_operandCPSR[c] sub:减法运算 RdRn-shifter_operand sbc:进行减法运算时考虑CPSR的c位 RdRn-shifter_operand-!CPSR[c] RSB :逆向减法Rdshifter_operand-Rn RSC带借位的逆向减法指令 Rd shifter_operand – Rn - !CPSR[c] mul:乘法运算 RdRn*shifter_operand 进行64位算数运算 MOV R1,#0xfffffffe 第一个数据的低32位 mov r2,#0x00000004 第一个数据的高32位 MOV R3,#0x00000005 第二个数据的低32位 mov r4,#0x00000004 第二个数据的高32位 加法 低32位 adds r5,r1,r3 高32位 adc r6,r2,r4 数据比较指令 格式 cmp Rn, shifter_operand 比较指令的本质 拿第一操作寄存器和第二操作数进行减法运算并且减法运算的结果会影响到CPSR的条件位 可以根据比较指令之后的条件位的数值进行不同的运算相当于c里的选择语句 这里需要对CPSR的条件位进行判断我们依赖条件位的助记词{cond}后缀实现 跳转指令
一般实现程序的跳转有两种方式 1.直接修改PC的值 2.通过跳转指令 1.b label 解释跳转到label标签所在代码此时跳转lr寄存器不保存返回地址 2. bl label 解释跳转到label标签所在代码此时跳转lr寄存器保存返回地址 3. bx 地址 跳转到地址对应的的指令位置此时跳转LR不保存返回地址 4.blx 地址 跳转到地址对应的的指令位置此时跳转LR保存返回地址 今日任务
.text
.globl _start
/*累加1-100*/
_start:mov r0,#0summov r1,#0累加的值mov r2,#12标记位add r1, r1,#1add r0,r0,r1cmp r1,#100beq stopbne continuefuncontinuefun:bx r2stop:b stop
.end
another
.text
.globl _start
/*累加1-100*/
_start:mov r0,#0summov r1,#0累加的值continuefun:add r1, r1,#1add r0,r0,r1cmp r1,#100beq stopbne continuefunstop:b stop
.end