PIC中档单片机汇编指令详解(7)完

摘要:
目标地址由包含在该指令中的11位地址代码和特殊寄存器PCLATH组成,以形成完整的13位地址。命令示例:ORG0x000;伪指令指定程序GOTOMain的起始地址;程序跳转到标签指定的位置,并继续执行MOVLWW寄存器。语法形式:MOVLWk操作数:k是8位立即数。执行时间:一个指令周期。执行过程:k→ W状态标志。影响:无。注意:此指令为W寄存器分配初始值。BTFSCSTATUS,Z如果W不等于0x34,则跳过下一条指令GOTOW34;W等于0x34,转到执行相关操作

GOTO 程序无条件跳转到指定的地址

语法形式:GOTO m

操作数:m为11位立即数指定的目标地址

执行时间:2个指令周期

执行过程:

m→PC【10:0】

PCLATH【4:3】→PC【12:11】

状态标志影响:无

说明:程序无条件立即强行跳转到目的地址处继续执行。目的地址由本指令内含的11位地址码和特殊寄存器PCLATH中的【4:3】一起构成完整的13位地址。

指令范例:

ORG 0x000 ;伪指令指定程序的起始地址

GOTO Main ;程序跳转到标号指定的位置处继续执行

MOVLW W寄存器赋立即数

语法形式:MOVLW k

操作数:k为8位立即数

执行时间:一个指令周期

执行过程:k→W

状态标志影响:无

说明:该指令对W寄存器赋一个初值。任何其他数据寄存器如果要赋一个立即数值,必须通过W寄存器传送。

指令范例:

MOVLW 0x55 ;【W】=0x55

MOVWF Tmp ;【Tmp】=【W】=0x55

ADDLW W寄存器和8位立即数相加

语法形式:ADDLW k

操作数:k为8位立即数

执行时间:一个指令周期

执行过程:【W】+k→W

状态标志影响:Z DC C

说明:W寄存器的值和8位立即数相加,结果放入W寄存器内

指令范例:

MOVLW 0xAA ;W=0xAA

ADDLW 0x11 ;W=0xAA+0x11=0xBB

SUBLW 立即数减去W寄存器

语法形式:SUBLW k

操作数:k为8位立即数

执行时间:一个指令周期

执行过程:k-【W】→W

状态标志影响:Z DC C

说明:必须注意W寄存器在这条指令中是减数

如果k=W,相减结果为0,则Z=1

如果k>W,没有借位发生,则C=1

如果k<W,有借位发生,则C=0

在PIC单片机内部这条减法指令的执行是先对W寄存器求补码,然后和被减数k相加,所以在判断是否有借位标志时要千万小心

指令范例:

MOVLW 0x23 ;W=0x23

SUBLW 0x32 ;W=0x32-0x23=0x0f,k>W所以C=1

IORLW W寄存器和立即数做逻辑或操作

语法形式:IORLW k

操作数:k为8位立即数

执行时间:一个指令周期

执行过程:【W】|k→W

状态标志影响:Z

说明:W寄存器和8位立即数相或,结果放入W寄存器内。按照逻辑或有1出1的法则,此指令可以把W寄存器的任意位设置成数据1

指令范例:

IORLW b‘00001111’ ;W寄存器低4位置1

ANDLW W寄存器和立即数做逻辑与操作

语法形式:ANDLW k

操作数:k为8位立即数

执行时间:一个指令周期

执行过程:【W】&k→W

状态标志影响:Z

说明:W寄存器和8位立即数相与,结果放入W寄存器内。按照逻辑与有0出0的法则,可以把W寄存器的任意位置清0

指令范例:

ANDLW b‘00001111’ ;W寄存器高4位清0

XORLW W寄存器和立即数做逻辑异或操作

语法形式:XORLW k

操作数:k为8位立即数

执行时间:一个指令周期

执行过程:【W】^k→W

状态标志影响:Z

说明:W寄存器和8位立即数异或,结果放入W寄存器内。按照逻辑异或的法则,任何数和1异或,结果为其反码;任何数和其自身异或,结果为0。所以该指令可以把W寄存器的任意位数反转,或者判断W寄存器的内容是否为特定值

指令范例:

例1:任意数据按位取反

XORLW b‘11111111’ ;取W寄存器8位反码

例2:判断W寄存器内容是否为特定值

XORLW 0x34 ;判断W=0x34?

BTFSC STATUS,Z ;W不等于0x34,则跳过下条指令

GOTO W34 ;W等于0x34,转去执行相关操作

免责声明:文章转载自《PIC中档单片机汇编指令详解(7)完》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MySQL修改字符集服务器端Session和客户端Session(和Cookie区别)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Linux PCI网卡驱动的详细分析

学习应该是一个先把问题简单化,在把问题复杂化的过程。一开始就着手处理复杂的问题,难免让人有心惊胆颤,捉襟见肘的感觉。读Linux网卡驱动也是一 样。那长长的源码夹杂着那些我们陌生的变量和符号,望而生畏便是理所当然的了。不要担心,事情总有解决的办法,先把一些我们管不着的代码切割出去,留下必 须的部分,把框架掌握了,哪其他的事情自然就水到渠成了,这是笔者的心得...

x86汇编指令(push,pop,call,ret)

举例这些指令做了什么? 1.push指令 pushl %eax将eax数值压入栈中,可分解为: subl $4, %esp ——> esp = esp - 4 movl %eax, (%esp) ——> *(int32_t *)esp = eax 2.popl指令 pop %eax将eax数值弹出栈,可分解为: movl (%esp),...

单片机中的ROM,RAM和FLASH的作用

ROM,RAM和FLASH的区别,下面主要是具体到他们在单片机中的作用。 一、ROM,RAM和FLASH在单片中的作用ROM——存储固化程序的(存放指令代码和一些固定数值,程序运行后不可改动)c文件及h文件中所有代码、全局变量、局部变量、’const’限定符定义的常量数据、startup.asm文件中的代码(类似ARM中的bootloader或者X86中的...

FPU:fldpi,fmul等指令说明

协处理器共有68条不同的指令,汇编程序在遇到协处理器指令助记符时,都会将其转换成机器语言的ESC指令,ESC指令代表了协处理器的操作码。 协处理器指令在执行过程中,需要访问内存单元时,CPU会为其形成内存地址。协处理器在指令执行期间内利用数据总线来传递数据。80287协处理器利用I/O地址00FAH~00FFH来实现其与CPU之间的数据交换,而80387~...

利用opencv3中的kmeans实现抠图功能

kmeans算法主要用来实现自动聚类,是一种非监督的机器学习算法,使用非常广泛。在opencv3.0中提供了这样一个函数,直接调用就能实现自动聚类,非常方便。 函数原型: C++: double kmeans(InputArray data, int K, InputOutputArray bestLabels, TermCriteria criteria...

MODBUS-寄存器与功能码学习

分类 简称 起始地址 结束地址 能够使用的功能码 输出逻辑线圈/(可读写位)/(DI/O)(如继电器开关控制) 0x 00000 09999 0x01读一组逻辑线圈 0x05写单个线圈 0x0f写多个线圈 离散量触点/开关量输入/只读位(DI)如按键是否按下 1x 10000 19999 0x02读一组开关输入 输入寄存器(AI...