汇编语言是一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
它相比机器语言来说,要稍微高级一些,因为它通过一些助记符来帮助我们记忆。
MOV称为助记符
#0x1200称为源操作数
w0称为目的操作数
一条汇编指令,基本上就分为 助记符 源操作数 目的操作数,三个部分。一般来说,汇编语言在不同的平台的单片机之间是不能相互移植的。要知道使用汇编语言编程,要用到的一些寄存器。
这16个工作寄存器都可以作为数据、地址或者偏移量寄存器使用,但是大家要注意,w14和w15是有特殊用途的,所以一般我们都是只使用w0-w13这14个工作寄存器。w14就是在堆栈空间里面又拿出一段空间给局部变量使用,这个W14就是访问这段局部空间的。
W15是专门用作软件堆栈指针使用的。它会被函数调用、异常处理以及返回自动修改。
MAC就是相乘并累加,然后两个相乘的寄存器需要 是w4-w7这几个的组合。
这里的SPLIM寄存器啊,它是堆栈指针限制寄存器。它的作用是用来防止堆栈指针上溢以及对超出用户分配堆栈存储区的存储空间进行访问。
单片机中,有两个40位的累加器,在我们使用DSP 类指令的时候,可以通过累加器执行数学和移位操作。
然后程序计数器,它是用来存放将要执行的指令的地址的,
循环指令对应的计数值,表示循环的次数。使用这两个寄存器,汇编语言也能实现循环控制。 repeat循环是指上一条指令要重复执行的次数,DO循环是一个范围内的指令,可以是很多条指令,重复执行。如果主程序和中断都使用DO循环,那么中断需要对DO循环寄存器压栈。DOSTART 和DOEND就存放了do循环的起始和结束地址。
最后一个是状态寄存器。它用来指示一些数学运算的结果,里面有一个运算结果的标志位。
接下来我们对dsPIC33EP128MC506单片机汇编语言的寻址方式进行下介绍。
第一个是 固有寻址,它是指不需要操作数即可完成所需功能的一种寻址方式。
接下来我们来看第二种:相对寻址,它是指以程序计数器PC的内容为基址,然后再加上一给定的偏移量,形成一个新的PC值的一种寻址方式。
第三种是立即数寻址,它是指将一常数(可以是十进制或十六进制或其他进制数)写到某一内存单元地址或者某一寄存器里的一种寻址方式。
第四个是寄存器直接寻址,它是指将一寄存器中的内容传送到另一寄存器中的一种寻址方式。
双字模式就是32位传送,这里是指把w2和w3里面的内容传送到w6和w7里面。
16位的单片机 一个字表示16位,那么双字就是32位。
第五个是寄存器间接寻址,它是指寄存器中存了某一内存单元的地址,将这寄存器的值送到另一寄存器中,另一寄存器就获得前一寄存器中存放的地址中的值,这一寻址方式,称为寄存器间接寻址。
第五种寻址方式有点相当于C语言中的指针的引用方式。
这种加偏移量的也属于间接寻址的一种。就是把[ ]里面的地址内的数据送到后面对应的寄存器中。
W8+0x13 = 0x101B,这个是奇数地址,然后指令字节传输,所以就是把 高八位0x33赋值给w10的低八位。
接下来是存储器直接寻址(也就是文件寄存器寻址),它是指将某一内存单元中的数据传到某一寄存器或从某一寄存器中传送数据到某一内存单元中的一种寻址方式。
比如这个例子就是文件寄存器直接寻址。
接下来我们介绍下,这款单片机的汇编指令
我们先来看下汇编指令的分类,主要分为以下10种:
①传送类指令
②数学类指令
③逻辑指令
④循环/移位指令
⑤位操作指令
⑥比较/调过和比较/转移指令
⑦程序流指令
⑧影子/堆栈指令
⑨控制指令
⑩DSP类指令
第一类,传送指令。
这就是所有的传送指令对应的汇编语法。将一个数据或地址传送到另一个地址或寄存器里面。
下一类是数学类指令:
比如,我们要实现一个加法,可以这样写。
接下来看下逻辑指令:
逻辑指令就是实现一些逻辑运算,包括与 或 非 异或等等。
比如这条指令就是实现逻辑与的操作。
这里的0F70 里的 09 是怎么变成EF的?
程序存储器里面的奇数地址对应 0xEF ,然后放到奇数地址0x0F71 也就是0x0F70的高八位。