B001-Atmega16-汇编-地址空间分配

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

地址空间规划

打开m16def.inc、可以看到如下面的定义,它和手册里面描述的FlashROM、SRAM、EEPROM等的地址空间一一对应。


; ***** DATA MEMORY DECLARATIONS *****************************************

.equ FLASHEND = 0x1fff    ; Note: Word address、这里一共是8K word的flash ROM

.equ IOEND     = 0x003f ; IO寄存器的地址空间是0x0000-0x003F、但它们被映射到0x0020-0x005F

.equ SRAM_START  = 0x0060 ; 0x0060-0x0045F这1KB的地址空间是内部RAM使用的地址空间

.equ SRAM_SIZE   = 1024   ;

.equ RAMEND = 0x045f     ;

.equ XRAMEND = 0x0000     ; 这里可能是为外部RAM预留的地址空间 - question-001

.equ E2END    = 0x01ff  ; EEPROM一共有512B,占据着0x0000-0x01FF的地址空间

.equ EEPROMEND  = 0x01ff  ; 这个地址送到EEPROM控制寄存器使用

.equ EEADRBITS  = 9       ; 512个单元需要9位地址线来访问

#pragma AVRPART MEMORY PROG_FLASH 16384    ; 8K word = 16K byte

#pragma AVRPART MEMORY EEPROM 512

#pragma AVRPART MEMORY INT_SRAM SIZE 1024

#pragma AVRPART MEMORY INT_SRAM START_ADDR 0x60

编译器编译结束后会给出FlashROM(.cseg)、SRAM(.dseg)、EEPROM(.eseg)这三者的使用情况:

说明:

1、使用 in、 out指令访问 IO寄存器时、这两个指令使用的是 0x0000-0x003F的 地址空间来访问 IO寄存器的。

2、使用ld、st指令访问IO寄存器时、需要使用映射后的地址空间0x0020-0x005F([0x0000,0x003F]+0x0020)来访问IO寄存器。


       PORTB、SREG等IO寄存器在m16def.inc文件中是按照0x0000-0x003F的地址空间来定义的,


       所以使用ld、st指令时,寄存器地址需要加上0x0020:PORTB + 0x20、SREG + 0x20。



RAM中的栈空间

0、堆栈(实际指的是栈)也是RAM的一部分,只是可以使用专门的指令push/pop、通过堆栈指针SP来做FILO形式的访问(地址在SP中自动增减变化)。


      在DEBUG模式下看到SP指针是放在RAM的末尾,从最后面开始向下生长。


1、在复位中断服务程序中、设置了堆栈指针SP为0x045F、是RAM地址空间的最后一个单元:

RAMEND在m16def.inc中定义如下(就是上面代码中的一部分):


.equ RAMEND = 0x045f

2、 push指令将 R20中的数据保存到 SP指针指向的 RAM单元,也即 入栈:

3、pop指令、将SP指针指向的RAM单元中的内容取出、并放入R20,也即出栈:

关键字:Atmega16  汇编 引用地址:B001-Atmega16-汇编-地址空间分配

上一篇:B001-Atmega16-PORTA的定义-(ques=1)
下一篇:B001-Atmega16-对齐模式和大小端

推荐阅读最新更新时间:2024-11-17 13:49

ARM 汇编器对C的扩展
__swi void ledtest(); //:声明 edtest 是个软中断。 __asm 内嵌汇编 //:通常在C程序里面需要嵌入汇编代码,这是就可以用__asm关键字来指示编译器下面的代码是用汇编语言来写的, __inline 定义内联函数 //:就像在C语言中用define定义宏一样,用__inline关键字定义的函数在调用的地方被展开,这主要就是为了解决频繁的函数调用开销过大的问题,如果用__inline关键字定义的函数过大,每个调用函数的地方都会将其展开,这样的话在一定程度上也增加代码量,所以说一般用__inline 定义的函数代码量并不是很大。 由于在C语言中无法直接访问COSR, 因此需要通过嵌入
[单片机]
51单片机汇编语言子程序调用指令RET RETI
控制转移 指令 用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移 指令 相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 . 子程序调用指令(1条) 子程序是为了便于程序编写,减少那些需反复执行的程序占用多余的地址空间而引入的程序分支,从而有了主程序和子程序的概念,需要反复执行的一些程序,我们在编程时一般都把它们编写成子程序,当需要用它们时,就用一个调用命令使程序按调用的地址去执行,这就需要子程序的调用指令和返回指令。 LCALL
[单片机]
两机串行通讯单片机汇编语言编程举例
A、B两机之间串行通讯(方式1),用‘检验和’校验波特率为2400,发送缓冲区和接收缓冲区都为片内30H开始的16个字节单元。已知:fosc=11.0592MHz。 设计A发送,B接收的双方协议如下: 1、首先A发送‘AA’信号,B接收到后发送‘BB’应答; 2、A方最多只发送20次‘AA’,若无应答,置错误标志,退出。 3、A收到‘BB’后,开始发送缓冲区的数据,同时求检验和,共16个字节。 4、B接收数据,存入缓冲区,并同时求检验和。 5、当一个数据块发送完后,A再发送检验和(一个字节)。 6、B接收到A的检验和后,再与本身的检验和比较。 7、若接收正确,B方发送‘00’,否则发送‘EE‘,请求重发。 8、若
[单片机]
两机串行通讯单片机<font color='red'>汇编</font>语言编程举例
STM32 启动代码汇编指令详解
● EQU 伪指令EQU用来为一个数字常量或一个和内核寄存器相关的数值或一个和程序计数器相关的数值定义的一个符号名称,类似于C语言中的 #define 。 语法格式:name EQU expr{ , type} 注意:语法格式中的{ }不属于语法格式的部分,并且{ }中的内容是可选的; name:数值(expr)的符号名称; expr:一个与内核寄存器相关的地址,或一个绝对地址,或一个与PC相关的地址,或一个32位整型常量; type:可选项,它可以是ARM、THUMB、CODE16、CODE32或DATA中的任何一个。 举个例子: fiq EQU 0x1C,CODE32 ● AREA 伪指令AREA用来定义一个代
[单片机]
AVR单片机汇编器伪指令
  伪指令不属于 单片机 的指令系统,而是由汇编器提供的指令,用于调整 存储器 中程序的位置、定义宏、初始化存储器等。AVR单片机的汇编器共提供18条伪指令(见附表)。      其中,ORG、DB、DW、EQU读者比较熟悉,这里不再赘述。下面对部分伪指令加以说明。      BYTE-保存单字节数据到SRAM中。BYTE伪指令仅用在数据存储器。为提供数据保存的位置,在BYTE前应有标号。在由CSEG、ESEG定义的代码段和E2PROM段中不能使用BYTE伪指令。      格式LABEL:.BYTE表达式 CSEG-定义程序存储器代码段的起始位置一个汇编文件可以包括若干个代码段,汇编时这些代码段被连成一个代码段。在代码
[单片机]
AVR单片机<font color='red'>汇编</font>器伪指令
KEIL C51程序中如何嵌入汇编
模块内接口: 使用如下标志符: asm 汇编语句 endasm 注意:如果在程序中使用了,注意在Keil编译器中需要激活Properties中的 “Generate Assembler File” 和“Assembler File ”两个选项 1、把 xx.c 加入工程中,右击 xx.c 选择“options for file xx.c 选择 “Generate Assembler File”和“Assemble SRC File”打上黑勾有效; 2、根据选择的编译模式,把相应的库文件象加 xx.c 一 样加入工程中并放在 xx.c 下面,如smail模式下选 keil\\lib\s.lib 加入工程中,如果要进行把 keil\c
[单片机]
KEIL C51程序中如何嵌入<font color='red'>汇编</font>
C51编译器-高级编程技巧(3)-C语言与汇编的接口
C程序与汇编的接口 Cx51程序可以方便地与8051汇编程序接口。A51汇编器是一个以OMF-51格式发射对象模块的8051宏汇编器。通过观察一些编程规则,你可以在C程序中调用汇编程序,反之亦然。在汇编模块中声明的公有变量在C程序中也可以使用。 在C程序中调用汇编程序有几个方面的原因。一是可以使用已有的汇编程序,二是在希望运行速度快的地方使用,三是在希望直接用汇编操作SFR或使用I/O存储器映像的地方使用。 对于一个将在C程序中调用的汇编程序,它的参数传递规和值返回规则必须与C函数一致。就应用上来说,它必须看起来像一个C函数。 Function Parameters函数参数 一般情况下,C函数可以通过寄存器传递三个参数。其
[单片机]
ARM汇编中的ldr和adr的区别及其在uboot中相关源码的分析
ARM汇编有ldr指令以及ldr、adr伪指令,它们都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别。 ldr r0, _start adr r0, _start ldr r0, =_start _start: b _start 编译的时候设置 RO 为 0x30000000,下面是反汇编的结果: 0x00000000: e59f0004 ldr r0, ; 0xc 0x00000004: e28f0000 add r0, pc, #0 ; 0x0 0x00000008: e59f0000 ldr r0, ; 0x10 0x0000000c: eaf
[单片机]

推荐帖子

我在AD中创建PCB文件时提示这个,怎么解决?
我在AD中创建PCB文件时提示这个,怎么解决?首次出现吗?是不是没有破解啊关掉重新运行。 不行 是第一次创建,我记得破解了,怎么看有没有破解?
lemonn PCB设计
谁用TPS63001啊?
用了2片TPS63001,烧了2片,好象都是温度很高,L1脚对GND已经击穿,用过朋友指点下,用这个片子要注意什么!电感已经按推荐型号使用了!谁用TPS63001啊?从你的描述看,是芯片里面的接在L1和PGND之间的MOS管挂掉了,这个管子挂掉只有两种可能,一个是过流,一个是过压。发个图上来看下吧,不知道你的应用,不好分析。很有可能是你L1脚的电压太高击穿了里面的MOS管,这样开关管再导通的时候就相当于短路,肯定会过流烧片子。你的应用条件是什么呀现在问题应该跟器件布局,走线
蓝雨夜 模拟与混合信号
初学单片机的弥漫!!!!
条件:1、两台电脑2、自认C语言还是可以的(现在用C#)3、一些单片机的视频教程(网上找的)4、打算投入一个月的工资(5千左右)5、电子方面的知识基本是=0弥漫:1、学单片机编程必须要懂单片机的工作原理吗?2、需要买什么做学习单片机编程的必要条件?总结:希望搞这一块的朋友指点一下!!!不用告诉我学这块有多么难。虽然单片机跟我现在用的,差十万八千里。但我也不信搞单片机天生都是高手初学单片机的弥漫!!!!1)需要,基本的数模电知识。2)万用表,电铬铁,这是很常用的
krg_07 嵌入式系统
求助ARM
有做arm方面的吗,我们公司刚用ARM,公司做了一块板子,用到了AT91RM9200,这款芯片片内没有flash,我们外扩了个三个flash,现在ulink能识别到内核,但程序下不进去,各位有什么建议的话麻烦说一下,谢谢。我没有可用分了,请原谅。求助ARM我们外扩了个三个flash,要3个吗,一个应该就够了,硬件有问题吧?引用1楼schlafenhamster的回复:我们外扩了个三个flash,要3个吗,一个应该就够了,硬件有问题吧? 同问,三个?~~问题说得不清
czl1983 ARM技术
微分和积分电路的异同
输出电压与输入电压成微分关系的电路为微分电路,通常由电容和电阻组成;输出电压与输入电压成积分关系的电路为积分电路,通常由电阻和电容组成。微分电路、积分电路可以分别产生尖脉冲和三角波形的响应。积分运算和微分运算互为逆运算,在自控系统中,常用积分电路和微分电路作为调节环节;此外,他们还广泛应用于波形的产生和变换以及仪器仪表之中。以集成运放作为放大电路,利用电阻和电容作为反馈网络,可以实现这两种运算电路。(一)积分电路和微分电路的特点1:积分电路可以使输入方波转换成三角波或者斜波
Aguilera 模拟与混合信号
供电LDO的选择
我现在需要一个3.3V和一个2.5V供电,之前的设计方案中是使用LDO分别提供这两种电压,现在我想要通过3.3V串联分压电阻得到2.5V输出,可行吗?有什么需要注意的问题没有?有人能帮忙解答一下吗,谢谢供电LDO的选择这要看你2.5V连接的负载是什么样的,负载可以等效为一个电阻会参与进你的串联分压电路里面导致分压不准。只有特定场合可以采用分压电阻。这个绝大多数情况下是不可以的,,【我想要通过3.3V串联分压电阻得到2.5V输出,可行吗?】多数情况下,不可行。除非2.5V输出
scake PCB设计
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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