您尚未登录。

楼主 # 2021-06-04 21:22:40

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 683
积分: 653.5

玩一玩avr汇编,探究计算机的本质

avr单片机是很经典的8位mcu,因为arduino的火爆,直到现在依然很流行。在8位单片机开创性的引入了32个寄存器,两级流水线,risc结构直接降维打击了同时代的8051。以avr为例,探究一下计算机的本质。研究计算机原理可以看书,也可以做试验。我选择从试验开始,这样更有趣一些。现在做实验简单多了,各种虚拟环境和ide非常丰富。我选择用真机做实验,这样更实用和真实一些。

首先介绍一下用到的工具:
1.atmel studio,主要用它编译和仿真汇编代码
2.硬件,一个avr最小系统,我选择attiny13,研究汇编够用了
3.烧写器usb isp,以及烧写工具智峰下载器
4.avr汇编指令集手册,以及attiny13的手册

开篇上点灯程序:

.cseg 
.org $0
        rjmp start
.org $000A
start:
	sbi DDRB,DDB0
	sbi PORTB,PB0
Loop:
	rjmp loop

机器码对照:

                                 .cseg 
                                 .org $0
000000 c009                              rjmp start
                                 .org $000A
                                 start:
00000a 9ab8                      	sbi DDRB,DDB0
00000b 9ac0                      	sbi PORTB,PB0
                                 Loop:
00000c cfff                      	rjmp loop

hex格式

:020000020000FC
:0200000009C035
:06001400B89AC09AFFCF6C
:00000001FF

flash memery快照:

prog 0x0000  09 c0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff b8 9a c0 9a 
prog 0x0018  ff cf ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

hex格式解释:
  数据个数   地址      类型    数据          crc校验
: 00           0000     00     000000...    00

下载器使用hex文件烧录数据到avr,中间经过了解析hex文件的过程。主要是取出机器码并烧录到flash。
avr的汇编格式是:
操作码---操作数/地址/空---操作数/地址/空
整条指令是16位或是32位(32位很少)

avr整个工作过程是,从mcu上电开始,pc指向flash的0地址,开始取指-执行重复下去,直至结束。我们每天使用的电脑办公、手机刷视频,在cpu看来都是一堆01010101。

我们可以用汇编开发mcu,也可以直接用机器码开发。上古计算机就是机器码编程,那时候是没有falsh,直接把01代码用纸带打孔的方式来表示,也就是说纸带相当于falsh。即使现在用机器码开发,比那时候也简单多了,直接在电脑上查询寄存器的地址并转为相应的机器码,然后烧进falsh即可。

离线

楼主 #1 2021-06-04 21:29:13

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 683
积分: 653.5

Re: 玩一玩avr汇编,探究计算机的本质

挖掘avr手册,发现保留寄存器,可以当作普通寄存器存储数据。


Screensho202212657.png

离线

#2 2021-06-04 22:00:09

cube
会员
注册时间: 2021-03-11
已发帖子: 52
积分: 28

Re: 玩一玩avr汇编,探究计算机的本质

欢迎进入裸机的世界, 我最近也在玩 arm9 gcc 汇编.

离线

楼主 #3 2021-06-04 22:30:28

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 683
积分: 653.5

Re: 玩一玩avr汇编,探究计算机的本质

最近想研究一下单片机的汇编器,发现开源的汇编器非常少,基本上只有gnu家的,看来底层的东西很少人碰了。gcc的汇编器太复杂,毕竟他需要统筹考虑众多架构芯片,提取出了很多共有代码,看起来太费力。arm自家的汇编器又不开源,只能自己慢慢研究。可能cpu厂家也是为了省事,直接基于gcc写个新cpu的目标代码生成器就马上上市。没必要再单独再开发一个汇编器,毕竟现在最低层有人用的也是c语言。

离线

#4 2021-06-04 22:37:29

cube
会员
注册时间: 2021-03-11
已发帖子: 52
积分: 28

Re: 玩一玩avr汇编,探究计算机的本质

想要玩深入一点这是必经之路,汇编,Makefile, Linkscript, 体系结构都要涉猎。

离线

楼主 #5 2021-06-04 22:46:25

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 683
积分: 653.5

Re: 玩一玩avr汇编,探究计算机的本质

从开始学编程就对操作系统、编译器这些东西感兴趣,大学时学8051汇编时就想用汇编写个调度器,最后写出了个简单的虚拟机跑在8051上

离线

#6 2021-06-05 00:51:22

novice
会员
注册时间: 2019-07-26
已发帖子: 57
积分: 51.5

Re: 玩一玩avr汇编,探究计算机的本质

8位机的汇编还是很简单的吧?x86才复杂。

离线

楼主 #7 2021-06-14 19:25:45

kekemuyu
会员
注册时间: 2018-12-13
已发帖子: 683
积分: 653.5

Re: 玩一玩avr汇编,探究计算机的本质

单独学一种汇编不过瘾,顺便和其他架构汇编对比学习更有意思。今天看到arm架构比较有意思,37个寄存器,但有很多同名的寄存器,在不同工作模式加以区分。不知道为什么当初这样设计,7种工作模式,不同模式可访问寄存器是一般是不一样的。

离线

#8 2021-06-14 20:14:46

孤星泪
会员
注册时间: 2020-03-18
已发帖子: 230
积分: 227

Re: 玩一玩avr汇编,探究计算机的本质

@kekemuyu
当然是为了效率, 这样入栈出栈就不用保存那么多寄存器了.

离线

#9 昨天 22:05:04

echo
会员
注册时间: 2020-04-16
已发帖子: 73
积分: 66

Re: 玩一玩avr汇编,探究计算机的本质

要是没有Arduino续命,AVR坟头的草得20米高了吧

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn