B001-Atmega16-位域的汇编实现

发布者:chi32最新更新时间:2022-01-12 来源: eefocus关键字:Atmega16  位域  汇编 手机看文章 扫描二维码
随时随地手机看文章

-------------------------------------------------------------------------------------------------------------------------------------

开发环境:AVR Studio 4.19 + avr-toolchain-installer-3.4.1.1195-win32.win32.x86

芯片型号:ATmega16

芯片主频:8MHz

-------------------------------------------------------------------------------------------------------------------------------------

第一种实现方式

(2016.10.28)

今天临时起意、去看了位域部分的反汇编,看看汇编如何实现位域。

使用到的位域如下定义:

// 事件队列的结构(type[7bit],lock[1bit],data[32bit])

typedef struct 

{

    uint8_t  type :7 ;  // 消息类型、如数码管数据有更新:EVENT_SEG_UPDATE

    uint8_t  lock :1 ;  // 加锁标志

    uint32_t data;      // 消息参数、如数码管的数据:1265214

}T_EVENT_LIST, *pT_EVENT_LIST;

使用这个结构的代码如下:

        // --------------------------------------

        event_buffer_task01[0].type = EVENT_SEG_UPDATE;  // EVENT_SEG_UPDATE = 0x06

        event_buffer_task01[0].data = second;

对应的反汇编代码如下:

87:               event_buffer_task01[0].type = EVENT_SEG_UPDATE;

+00000098:   918000CC    LDS       R24,0x00CC     Load direct from data space

+0000009A:   7880        ANDI      R24,0x80       Logical AND with immediate

+0000009B:   6086        ORI       R24,0x06       Logical OR with immediate

+0000009C:   938000CC    STS       0x00CC,R24     Store direct to data space

88:               event_buffer_task01[0].data = second;

+0000009E:   91800060    LDS       R24,0x0060     Load direct from data space  // second的地址是0x0060

+000000A0:   91900061    LDS       R25,0x0061     Load direct from data space

+000000A2:   91A00062    LDS       R26,0x0062     Load direct from data space

+000000A4:   91B00063    LDS       R27,0x0063     Load direct from data space

+000000A6:   938000CD    STS       0x00CD,R24     Store direct to data space   // event_buffer_task0[0].data的地址是0x00CD

+000000A8:   939000CE    STS       0x00CE,R25     Store direct to data space

+000000AA:   93A000CF    STS       0x00CF,R26     Store direct to data space

+000000AC:   93B000D0    STS       0x00D0,R27     Store direct to data space

可以看出,为了操作处于同一个字节里面的 .type和 .lock,汇编里面使用 与操作和 或操作来实现对 bit7(.lock)和 bit[6:0](.type)的操作。

关键字:Atmega16  位域  汇编 引用地址:B001-Atmega16-位域的汇编实现

上一篇:A004-移位范围超过变量宽度-(ques=1)
下一篇:D001-开发工具-AVR Studio 环境配置和使用笔记

推荐阅读最新更新时间:2024-11-10 16:56

51单片机原理及汇编教程(二)之汇编常用指令数,数据传输指令及寻址方式
一、内部数据传送指令 1、MOV指令 ① MOV R0 , #20H   #后面是立即数,要和地址区分开,20H是一个16进制的数。这句话的意思是将20H这个数送入寄存器R0中。直接寻址 ② MOV 30H , @R0   R0里面放的数,以这个数位地址,将这个地址里面的数给到30H地址中。间接寻址 ③MOV C,20.4H   位寻址,这个C是PSW程序状态字中的最高位,CY进位位,借位位。 2、访问外部RAM存储器 ① MOV DPTR ,#1234H   DPTR分为DPH和DPL(高8位和低8位),存放在内部RAM的SFR中,这句胡的作用是把立即数给DPTR。 ② MOVX A ,@DPTR   这句话的作用是从外部R
[单片机]
51单片机原理及<font color='red'>汇编</font>教程(二)之<font color='red'>汇编</font>常用指令数,数据传输指令及寻址方式
avr宏汇编和表达式
汇编器提供一些伪指令伪指令并不直接转换成操作数而是用于调整存储器中程序的位置 定义宏初始化存储器等全部伪指令在表4.2 中给出 1 BYTE 保存字节到变量 BYTE 伪指令保存存储的内容到SRAM 中为了能提供所要保存的位置BYTE 伪指令前应有 标号该伪指令带一个表征被保存字节数的参数该伪指令仅用在数据段内见伪指令CSEG DSEG 和ESEG 注意必须带一个参数字节数的位置不需要初始化 语法LABEL BYTE 表达式 2 CSEG 一代码段 CSEG 伪指令定义代码段的开始位置一个汇编文件包含几个代码段这些代码段在汇 编时 被连接成一个代码段在代码段中不能使用BYTE 伪指令典型的缺省段为代码段代码段有一个 字定
[单片机]
ARM体系下的GCC内联汇编
在操作系统级的编程中,有时候,C语言并不能完全的使用硬件的功能,这时候就需要嵌入一些汇编代码来实现功能。 有两种方式可以使C语言和assemly语言一起工作,一种是两种语言分开写成两个文件,链接的时候链接成一个文件;另一种就是在C语言中嵌入汇编代码。下面简单介绍一下如何在GCC中嵌入汇编代码。 GCC规定了一个内联汇编的语法,不同硬件平台上的GCC内联汇编几乎都是这样的: asm( 汇编指令列表 :输出运算符列表 :输入运算符列表 :被更改的资源列表 }; 在GCC中插入汇编代码,需要以asm关键字开头,中间四个部分用”:”分隔,如果你嵌入的汇编没有输入输出,或者更改资源,后面三项是可以省略的。 下面以
[单片机]
基于ATmega16的遥控密码锁系统的设计
简介:本文介绍了基于atmega16单片机遥控密码锁的硬件及程序实现流程的具体设计,采用AVR 单片机ATMEGA16 作为控制器,在实现了电子锁的密码键盘输入开启控制,液晶串行显示,出错声光报警基础上,设计了通过串口控制GSM 模块GTM900B 进行短信收发和拨号,实现了远程开启控制,同时满足了多方式,高可靠性,高时效等要求,为智能家居提供了可靠的方案。 1.引言 在日常生活和现代办公中,住宅与办公室的安全防范多以加锁的办法来解决。为满足人们对锁的使用要求,增加其安全性,避免不必要时的钥匙外泄。本文从高效以及高实时性的角度出发,出于安全、方便等方面的需要,尤其为实现远程控制,介绍一种由ATMEGA16编程实现的控制电路
[单片机]
汇编语言 字母的大小写转换
大小写转换问题 A 41H 0100 0001B or 0010 0000B 转换为小写 B 42H 0100 0010B C 43H 0100 0011B D 44H 0100 0100B a 61H 0110 0001B and 1101 1111B 转换为大写 b 62H 0110 0010B c 63H 0110 0011B d 64H 0110 0100B 方法一: assume cs:code data segment db 'ABcDEF' ; 将ABcDEF全部转换为小写 db 'abCdef'
[单片机]
<font color='red'>汇编</font>语言 字母的大小写转换
ATmega16单片机的特点和内部结构解析
下面就总结一下AVR单片机ATmega16的主要特点: (注: 括号内有红色 *x*符号的表示文章下方会有解释/扩展) 1) 采用 RISC 结构的AVR内核单片机。 131 条机器指令, 大多数指令为单个系统时钟周期执行的指令; 32 个 8 位通用工作寄存器; 全静态工作方式(Fully Static OperaTIon)。 (*A*) 工作在 16 MHz 时具有 16 MIPS 的性能。(注:ATmega16L 系列最大工作频率为 8 MHz); 内部配备有 2 个时钟周期的硬件乘法器。 2)片内自带大容量, 非易失的程序和数据存储器 (*B*) 16KB 在线可编程(ISP,In-System Programming)F
[单片机]
<font color='red'>ATmega16</font>单片机的特点和内部结构解析
ARM学习笔记12——GNU ARM汇编伪操作
1、.section   1.1、语法格式      .section section_name ]]   1.2、作用     定义一个段,每一个段以段名为开始,以下一个段名或者文件结尾为结束。     ELF格式允许的段标志: a:可分配                w:可写段                x:执行段   1.3、举例 .section .mysection   @自定义数据段,段名为“.mysection” 2、预定义段 .text、.data、.bss   2.1、语法格式   .text{subsection} .data{subsection}   
[单片机]
PIC汇编编程规范
一、程序命名规范 程序文件名由两部分构成:一部分为产品型号或功能描述,一部分为软件版本号。产品型号用字母描述,可为英文或中文拼音。软件版本号为4位,前一位固定为字母”V”,后3位为数字,编写软件版本号应按照从小到大的顺序递增。开发阶段版本号从001开始;中试之后版本号从100开始。 例如:光电感烟探测器JTY-GD-G3程序 GDG3V001 电子差定温探测器JTW-ZCD-G3N程序 GWG3NV101 二、程序头格式 在每个文件的开始要有一个对该文件总体功能的描述,软件版本,以及作者及编写时间。采用模版统一格式。 1. 在功能描述中,除了对软件实现的功能做简要描述外,还应包括使用的单片机,晶振频率,以及主要I/O口
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved