AVR汇编(五):算术和逻辑指令
AVR汇编(五):算术和逻辑指令
算术运算指令
AVR中对于算术运算提供了加法、减法和乘法指令,没有除法指令。
ADD
ADD
指令用于执行加法操作,相关的变体指令有:一般加法 ADD
、带进位加法 ADC
、16位立即数加法 ADIW
。
例如:
LDI R16, 0x01 ; R16 = 0x01
LDI R17, 0x02 ; R17 = 0x02
ADD R16, R17 ; R16 = 0x03
SEC ; C = 1
ADC R16, R17 ; R16 = 0x06, C = 0
LDI R25, 0x0F ; R25 = 0x0F
LDI R24, 0xF0 ; R24 = 0xF0
ADIW R24, 0x10 ; R25:R24 = 0x1000
注意:AVR不支持8位数的立即数加法,即没有 ADDI
/ ADCI
这样的指令!
SUB
SUB
指令用于执行减法操作,相关的变体指令有:一般减法 SUB
、立即数减法 SUBI
、带进位的减法 SUBC
、带进位的立即数减法 SBCI
、16位立即数减法 SBIW
。
例如:
LDI R16, 0x81 ; R16 = 0x81
LDI R17, 0x80 ; R17 = 0x80
SUB R16, R17 ; R16 = 0x01
SUBI R17, 0x10 ; R17 = 0x70
SEC ; C = 1
LDI R16, 0x80 ; R16 = 0x80
SBC R16, R17 ; R16 = 0x0F, C = 0
SEC ; C = 1
SBCI R16, 0x02 ; R16 = 0x0C, C = 0
LDI R25, 0x02 ; R25 = 0x02
LDI R24, 0x03 ; R24 = 0x03
SBIW R24, 0x04 ; R25:R24 = 0x01FF
INC
/ DEC
INC
指令用于执行加一操作, DEC
指令用于执行减一操作。需要注意的是,这两条指令都不会影响标志位 C
。
例如:
LDI R16, 0x7F ; R16 = 0x7F
INC R16 ; R16 = 0x80
DEC R16 ; R16 = 0x7F
MUL
MUL
指令用于执行乘法操作,计算结果存放在 R0
和 R1
寄存器中。默认执行的是无符号数乘法,后缀带 S
表示执行的是符号数乘法,后缀带 SU
表示执行的是符号数与无符号数乘法,前缀带 F
表示执行分数乘法。
例如:
LDI R16, 0xFE ; R16 = 0xFE (-2/254)
LDI R17, 0x03 ; R17 = 0x03 (3)
MUL R16, R17 ; R1:R0 = 0x02FA (762)
MULS R16, R17 ; R1:R0 = 0xFFFA (-6)
MULSU R16, R17 ; R1:R0 = 0xFFFA (-6)
FMUL R16, R17 ; R1:R0 = 0x05F4 (1524)
FMULS R16, R17 ; R1:R0 = 0xFFF4 (-12)
FMULSU R16, R17 ; R1:R0 = 0xFFF4 (-12)
逻辑运算指令
AND
/ OR
/ EOR
AND
用于执行“与”操作, OR
用于执行“或”操作, EOR
用于执行“异或”操作,后缀带 I
表示操作数是立即数。
例如:
LDI R16, 0xAA ; R16 = 0xAA
LDI R17, 0x0F ; R17 = 0x0F
AND R16, R17 ; R16 = 0x0A
ANDI R16, 0x03 ; R16 = 0x02
OR R16, R17 ; R16 = 0x0F
ORI R16, 0xAA ; R16 = 0xAF
EOR R16, R17 ; R16 = 0xA0
注意:AVR中“异或”操作不支持立即数,即没有 EORI
这样的指令!
COM
/ NEG
COM
指令用于计算反码(对原码取反), NEG
指令用于计算补码(对原码取反加一)。
例如:
LDI R16, 0xA5 ; R16 = 0xA5
COM R16 ; R16 = 0x5A
NEG R16 ; R16 = 0xA6
SBR
/ CBR
SER
指令用于根据掩码 K
设置寄存器中的某些位,与 ORI
指令作用相同。 CBR
指令用于根据掩码 K
清除寄存器中的某些位,即执行“与非”操作。
LDI R16, 0x0F ; R16 = 0x0F
SBR R16, 0x55 ; R16 = 0x5F
CBR R16, 0x55 ; R16 = 0x0A
TST
/ CLR
/ SER
TST
指令用于测试寄存器的值是否是零或者负数, CLR
指令将寄存器值设为0, SER
指令将寄存器值设为0xFF。
例如:
LDI R16, 0xAA ; R16 = 0xAA
TST R16 ; S = 1, V = 0, N = 1, Z = 0
CLR R16 ; R16 = 0, S = 0, V = 0, N = 0, Z = 1
SER R16 ; R16 = 0xFF
状态标志位
和上一篇介绍的数据传送指令不同,算术和逻辑指令会改变 SREG
寄存器中的标志位,下面介绍其中最常用的4个: Z
、 N
、 V
、 C
。
Z
标志位
Z
标志位指示计算结果是否为0,当结果为0时置位。
例如:
LDI R16, 5 ; Z = ?
SUBI R16, 2 ; result = 3, Z = 0
SUBI R16, 3 ; result = 2, Z = 1
N
标志位
N
标志位指示计算结果是否为负数,当结果小于0时置位。
例如:
LDI R16, 1 ; N = ?, Z = ?
LDI R17, 2 ; N = ?, Z = ?
ADD R16, R17 ; result = 3, N = 0, Z = 0
SUBI R16, 3 ; result = 0, N = 0, Z = 1
SUBI R16, 1 ; result = -1, N = 1, Z = 0
C
/ V
标志位
C
标志位指示计算结果是否超过无符号数范围,当结果超过[0, 255]时置位。
V
标志位指示计算结果是否超过符号数范围,当结果超过[-128, 127]时置位。
比如,对于0x7F+0x01=0x80,从无符号数角度看,就是127+1=128,没有超过无符号数范围,故 C
为0。从符号数角度看,127+1=128(-128),超过了符号数范围,故 V
为1。
再比如,对于0xFE+0x02=0x00,从无符号数角度看,为254+2=256(0),超过了无符号数范围,故 C
为1。从符号数角度看,-2+2=0,没有超过符号数范围,故 V
为0。
更多例子:
LDI R17, 4 ; N = ?, Z = ?, V = ?, C = ?
LDI R18, 2 ; N = ?, Z = ?, V = ?, C = ?
LDI R19, 1 ; N = ?, Z = ?, V = ?, C = ?
LDI R16, 250 ; N = ?, Z = ?, V = ?, C = ?
ADD R16, R17 ; result = 0xFE/-2/254, N = 1, Z = 0, V = 0, C = 0
ADD R16, R18 ; result = 0x00/0/256(0), N = 0, Z = 1, V = 0, C = 1
ADD R16, R19 ; result = 0x01/1/1, N = 0, Z = 0, V = 0, C = 0
SUBI R16, 2 ; result = 0xFF/-1/-1(255), N = 1, Z = 0, V = 0, C = 1
参考资料
AVR汇编(五):算术和逻辑指令的更多相关文章
- (32位汇编 五)mov/add/sub/and/or/xor/not
本文链接:https://blog.csdn.net/pl20140910/article/details/78227133说明符号 说明r 通用寄存器m 代表内存imm 代表立即数r8 代表8位通用 ...
- 嵌入式ARM汇编详解
文章目录 零.预备知识 1.ARM与X86 2.ARM中指令的执行 3.ARM的九种寻址方式 立即数寻址 寄存器寻址 寄存器间接寻址 寄存器偏移寻址 寄存器基址变址寻址 批量寄存器寻址 相对寻址 堆栈 ...
- 对X86汇编的理解与入门
本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理 ...
- 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 : -- AR ...
- 寄存器理解 及 X86汇编入门
本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令.不同架构的CPU指令并不相同,如x86,powerpc ...
- X86汇编概要
来自:https://www.cnblogs.com/jiftle/p/8453106.html 本文翻译自:http://www.cs.virginia.edu/~evans/cs216/guide ...
- ARM 常用汇编指令
ARM 汇编程序的框架结构 .section .data <初始化的数据> .section.bss <未初始化的数据> .section .text .global _sta ...
- Arm寄存器介绍及汇编基础
一.ARM处理器支持7种工作模式 ① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state) ② 快速中断模式(FIQ): 用于高速数据 ...
- AVR之BOOTLOADER技术详解(转)
源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...
- 使用GNU工具链进行嵌入式裸机开发
Embedded-Programming-with-the-GNU-Toolchain Vijay Kumar B. vijaykumar@bravegnu.org 翻译整理:thammer gith ...
随机推荐
- 2022-11-17:组合两个表。请写出sql语句,执行结果是{“headers“: [“first_name“, “last_name“, “city“, “state“], “values“: [
2022-11-17:组合两个表.请写出sql语句,执行结果是{"headers": ["first_name", "last_name", ...
- 2022-10-31:以下go语言代码输出什么?A:map[];B:nil;C:Panic;D:编译错误。 package main import “fmt“ func main() {
2022-10-31:以下go语言代码输出什么?A:map[]:B:nil:C:Panic:D:编译错误. package main import "fmt" func main( ...
- 2020-10-22:谈谈java中的LongAdder和LongAccumulator的相同点和不同点。
福哥答案2020-10-22: 简单回答:相同点:都是多个单元操作.不同点:LongAdder相加,LongAccumulator自定义计算规则. 中级回答:相同点: LongAddr与LongAcc ...
- 2022-05-19:给定一个数组arr,给定一个正数M, 如果arr[i] + arr[j]可以被M整除,并且i < j,那么(i,j)叫做一个M整除对。 返回arr中M整除对的总数量。 来自微软。
2022-05-19:给定一个数组arr,给定一个正数M, 如果arr[i] + arr[j]可以被M整除,并且i < j,那么(i,j)叫做一个M整除对. 返回arr中M整除对的总数量. 来自 ...
- 2021-09-07:单词接龙 II。按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s1 -
2021-09-07:单词接龙 II.按字典 wordList 完成从单词 beginWord 到单词 endWord 转化,一个表示此过程的 转换序列 是形式上像 beginWord -> s ...
- Python MQTT客户端 paho-mqtt
Python中MQTT Python有许多优秀的MQTT客户端,比较有代表性的有paho-mqtt.hbmqtt.gmqtt等,各有特色 paho-mqtt 有着最优秀的文档,代码风格易于理解,同时有 ...
- c3p0的配置及简单应用
首先简单了解一下JDBC和c3p0 Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸 ...
- 17.AQS中的Condition是什么?
欢迎关注:王有志 期待你加入Java人的提桶跑路群:共同富裕的Java人 今天来和大家聊聊Condition,Condition为AQS"家族"提供了等待与唤醒的能力,使AQS&q ...
- Cobalt Strike 连接启动教程(1)
第一步:把cobaltstrike4(解压后)拷贝到虚拟机Kali系统的root目录下 第二步:进入cobalstrike4文件夹中 第三步:选寻kali系统 IP地址 第四步: 启动服务端:(t ...
- Singleton 单例模式简介与 C# 示例【创建型】【设计模式来了】
〇.简介 1.什么是单例模式? 一句话解释: 单一的类,只能自己来创建唯一的一个对象. 单例模式(Singleton Pattern)是日常开发中最简单的设计模式之一.这种类型的设计模式属于创建型 ...