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 指令用于执行乘法操作,计算结果存放在 R0R1 寄存器中。默认执行的是无符号数乘法,后缀带 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个: ZNVC

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

参考资料

  1. ATmega328P Datasheet
  2. AVR Instruction Set Manual
  3. Programming and Interfacing ATMEL's AVRs

AVR汇编(五):算术和逻辑指令的更多相关文章

  1. (32位汇编 五)mov/add/sub/and/or/xor/not

    本文链接:https://blog.csdn.net/pl20140910/article/details/78227133说明符号 说明r 通用寄存器m 代表内存imm 代表立即数r8 代表8位通用 ...

  2. 嵌入式ARM汇编详解

    文章目录 零.预备知识 1.ARM与X86 2.ARM中指令的执行 3.ARM的九种寻址方式 立即数寻址 寄存器寻址 寄存器间接寻址 寄存器偏移寻址 寄存器基址变址寻址 批量寄存器寻址 相对寻址 堆栈 ...

  3. 对X86汇编的理解与入门

    本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理 ...

  4. 【嵌入式开发】 ARM 汇编 (指令分类 | 伪指令 | 协处理器访问指令)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42408137 转载请著名出处 本博客相关文档下载 :  -- AR ...

  5. 寄存器理解 及 X86汇编入门

    本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令.不同架构的CPU指令并不相同,如x86,powerpc ...

  6. X86汇编概要

    来自:https://www.cnblogs.com/jiftle/p/8453106.html 本文翻译自:http://www.cs.virginia.edu/~evans/cs216/guide ...

  7. ARM 常用汇编指令

    ARM 汇编程序的框架结构 .section .data <初始化的数据> .section.bss <未初始化的数据> .section .text .global _sta ...

  8. Arm寄存器介绍及汇编基础

    一.ARM处理器支持7种工作模式 ① 用户模式(USR): 用于正常执行程序(The normal ARM program execution state) ② 快速中断模式(FIQ): 用于高速数据 ...

  9. AVR之BOOTLOADER技术详解(转)

    源:http://blog.csdn.net/zhenhua10/article/details/6442412 ATmega128具备引导加载支持的用户程序自编程功能(In-System Progr ...

  10. 使用GNU工具链进行嵌入式裸机开发

    Embedded-Programming-with-the-GNU-Toolchain Vijay Kumar B. vijaykumar@bravegnu.org 翻译整理:thammer gith ...

随机推荐

  1. 2023-04-28:将一个给定字符串 s 根据给定的行数 numRows 以从上往下、从左到右进行 Z 字形排列 比如输入字符串为 “PAYPALISHIRING“ 行数为 3 时,排列如下 P

    2023-04-28:将一个给定字符串 s 根据给定的行数 numRows 以从上往下.从左到右进行 Z 字形排列 比如输入字符串为 "PAYPALISHIRING" 行数为 3 ...

  2. 2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据。数据库不能停,并且还有增删改操作。请问如何操作?

    2020-01-20:mysql中,一张表里有3亿数据,未分表,要求是在这个大表里添加一列数据.数据库不能停,并且还有增删改操作.请问如何操作?福哥答案2020-01-20: 陌陌答案:用pt_onl ...

  3. 2022-04-18:things是一个N*3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:价格300,重要度2,它是6号商品的附属

    2022-04-18:things是一个N3的二维数组,商品有N件,商品编号从1~N, 比如things[3] = [300, 2, 6], 代表第3号商品:价格300,重要度2,它是6号商品的附属商 ...

  4. 2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色的格子数必须相同的,上下左右的格子算相邻,相邻格子染的颜色必须不同,所有格子必须染色,返回至少多少种颜色可以完成任务。 福大大 答

    2021-08-29:N * M的棋盘(N和M是输入参数),每种颜色的格子数必须相同的,上下左右的格子算相邻,相邻格子染的颜色必须不同,所有格子必须染色,返回至少多少种颜色可以完成任务. 福大大 答案 ...

  5. PyQt5入门之QLineEdit

    QLineEdit:输入单行文本 下面描述了默认的键绑定.行编辑还提供了一个上下文菜单(通常通过单击鼠标右键进行调用),它提供了其中一些编辑选项. 按键 动作 Left Arrow 将光标向左移动一个 ...

  6. SqliLabs 第六关 报错注入!!!

    点开网址,首先看到一个页面,首先尝试闭合字符 id=1 报错 id=1' 报错 id=1"成功 然后开始爆字段?id=1" order by 3 --+ 发现有三个字段然后查询显示 ...

  7. 2013年蓝桥杯C/C++大学B组省赛真题(翻硬币)

    题目描述: 明正在玩一个"翻硬币"的游戏. 桌上放着排成一排的若干硬币.我们用 * 表示正面,用 o 表示反面(是小写字母,不是零). 比如,可能情形是:**oo***oooo 如 ...

  8. 【python基础】基本数据类型-字符串类型

    1.初识字符串 字符串就是一系列字符.在python中,用引号括起来文本内容的都是字符串. 其语法格式为:'文本内容'或者"文本内容" 我们发现其中的引号可以是单引号,也可以是双引 ...

  9. 1、初认 AS400

    一.AS400 简介 AS/400是一种主机型计算机,是IBM公司开发的.AS/400是IBM的应用服务器产品,针对企业级应用开发.重要应用系统支持进行设计开发.AS/400的系统工作环境中同时支持多 ...

  10. OAuth2.0andmultifactorauthentication:Howtocreateasecure

    目录 1. 引言 2. 技术原理及概念 2.1. 基本概念解释 2.2. 技术原理介绍 2.3. 相关技术比较 3. 实现步骤与流程 3.1. 准备工作:环境配置与依赖安装 随着数字化时代的到来,人们 ...