建立网站 域名 服务器吗,好用的在线代理,wordpress 设置邮件,网站里的动态是如何制作汇编语言的组成
伪操作 不参与程序的执行#xff0c;但是用于告诉编译器程序该怎么编译 如#xff1a; .text .global .end .if .else .endif .data
汇编指令 汇编器将一条汇编指令编译成一条机器码#xff0c;在内存里一条指令…汇编语言的组成
伪操作 不参与程序的执行但是用于告诉编译器程序该怎么编译 如 .text .global .end .if .else .endif .data
汇编指令 汇编器将一条汇编指令编译成一条机器码在内存里一条指令占4字节内存一条指令可以实现一个特定的功能。
伪指令 不是指令但是看似一条指令可以实现指令类似的功能一条伪指令可能是由多条指令共同实现。
注释 单行注释 多行注释/**/
条件编译
.if 0
text
.else
text
.endif
汇编指令的介绍
基本数据操作指令 数据搬移指令 数据位移指令 数据算数运算指令 - * / 位运算指令$ | ~ ^ 数据比较指令cmp 第一操作数第二操作寄存器其有很多条件码如果条件码满足则执行对应的指令 跳转指令 内存读写指令 状态寄存器读写指令 软中断指令
汇编指令的基本语法格式 基本格式 opcode{cond}{s} Rd,Rn,#oprand2 解释 opcode指令码 cond条件码 指令不加条件码指令默认无条件执行 指令加条件码指令有条件执行 s状态位 指令不加s,指令执行的结果不会影响CPSR寄存器 指令加s,指令执行的结果会影响CPSR寄存器 Rd目标寄存器 Rn第一操作寄存器 #oprand2第二操作数 1)立即数 2)有效数将一个数取反之后变成立即数 3)寄存器 4)经过移位的寄存器 注意事项 1汇编指令中不区分大小写 2汇编指令不需要以号结尾 3opcode{cond}{s}需要连在一起写 4Rd,Rn,#oprand2需要用逗号分隔开 5 opcode{cond}{s}和Rd,Rn,#oprand2需要用空格分隔开
数据搬移指令 指令码mov mvn 格式opcode{cond}{s} Rd,#oprand2 代码1mov r0,#0xf r0 0xfmov r1,#0xff mov r2,#0xfff error mov r3,#0xffff error mov r4,#0xfffff errormov r5,#0xffffffmov r6,#0xfffffffmov r7,#0xffffffff/*------------------ ------------------ ---------------*/代码2mvn r5,#0xff 0xff按位取反之后赋值给r5mov r0,#0xff000000 0xff 8mov r1,#0x1f800000 0x7e 10mov r2,#0x00ffffff ~r2 0xff000000mov r3,#0x0fffffff ~r3 0xf0000000mov r4,#0xffffffff ~r4 0x00000000
立即数判断 要从这个数中间找到0~0xff之间的数而且要包含所有1如果能找到循环右移偶数位如果能够得到要判断的数则该数为立即数。
伪指令 如何用伪指令将非立即数保存到寄存器中 伪指令 LDR 目标寄存器数值
移位指令 格式opcode{cond}{s} Rd,Rn,#oprand2 指令码 lsl:逻辑左移 高位移出低位补0 lsr:逻辑右移 低位移出高位补0 asr:算数右移 有符号数右移低位移出高位补符号位 ror:循环右移 低位移出补高位
位运算指令 格式opcode{cond}{s} Rd,Rn,#oprand2 方法看到清零用 看到置1用 | and按位与(amp;)------与0清0与1不变 orr按位或(|) ------或0不变或1置1 eor按位异或(^) ------异或0不变异或1取反 bic按位清除 ------ 哪一位写1对应的位进行清0
算数运算指令 指令码add adc sub sbc mul 基本格式 opcode{cond}{s} Rd,Rn,#oprand2 add: 普通加法指令 adc带进位加法指令 sub普通减法指令 sbc带借位减法指令 mul乘法指令 格式opcode{cond}{s} Rd,Rn
64位数据进行算数运算
原则 一个 64位数保存在两个寄存 高32位运算低32位运算 mov r1,#0XFFFFFFFE 保存第一个数据的低32位 mov r2,#2 保存第一个数据的高32位 mov r3,#3 保存第二个数据的低32位 mov r4,#4 保存第2数据的高32位 低32位运算要求影响条件位 ADDS R5,R1,R3 R5保存运算后结果的低32位 ADC R6,R2,R4 R6寄存器保存运算结果的高32位需要考虑条件位
比较指令
指令码cmp 基本格式 opcode{cond} Rn,#oprand2 1比较指令没有目标寄存器 2比较指令本质做减法运算 3比较指令的执行结果会影响CPSR寄存器的NZCV位不需要加s 4比较指令需要和条件码搭配使用 5前面所有学习的指令都属于无条件指令比较指令属于有条件执行
示例
比较两个数大小 第一个数比第二个数大第一个数减第二个数 第一个数比第二个数小第二个数减第一个数 mov r0,#0x3 mov r1,#0x4 cmp r0,r1 subhi r0,r0,r1 r0 r0 - r1 subcc r1,r1,r0 r1 r1 - r0 跳转指令
指令码b
格式b {cond} 标签
b指令码有去无回不会保存函数的返回地址到LR寄存器中-------------------b loop------------------- loop:-------------------/****************************************************/指令码 bl
格式bl{cond} 标签
bl指令码有去有回会保存函数的返回地址到LR寄存器中-------------------bl loop------------------- -----会保存函数的返回地址到LR寄存器中loop:-------------------