【计算机组成原理01】汇编代码与机器码的生成/指令和数据的存储方式
汇编代码与机器码的生成
WinAVR编译器编译:
编译命令:avr-gcc.exe -Wall -O -g -mmcu=attiny88 -o example example.c
* `-Wall`表示启动编译警告提醒 W(warning)all
* `-O`表示启动编译优化(Optimization)
* `-g`表示支持调试
* `-mmcu`表示制定编译平台, `mcu`表示Micro-Controller Unit(微控制单元)`-mmcu=attiny88`表示将源代码编译到AVR处理器系列attiny88微处理器上运行
* `-o example`表示将编译后产生的目标文件命名为example, o表示output(默认名称为a.out)
生成汇编程序与机器码
avr-objdump.exe -S example > example_S.txt
-
avr-objdump.exe
为Binutils工具,集中对目标文件信息进行分析,从中导出汇编程序和机器码。 -
example
为要提取信息的目标文件名 -
-S
表示提取出目标文件example中的汇编程序和机器码 -
> example_S.txt
表示将导出的信息导入至example_S.txt
中,没有该命令则直接显示在cmd终端中
如第一行:
84:
表示这一行机器码存储首地址
84 e1
表示指令经编译后生成的机器码0x84、 0xe1
Idi r24, 0x14
为汇编指令
; 20
为注释 将0x14
转化为10进制
批量执行命令
make工具
创建makefile,没有拓展名
注意:每一条命令以Tab
开头
批处理文件
创建.bat
批处理文件,将要批量运行的命令按顺序写入文件中,即可批量执行。
注意:需在文件最后加上一条pause
命令,使运行时弹出的终端界面处于暂停状态,以便查看各条命令的运行状态信息。若未使用该命令,则命令执行完毕后终端界面自动退出。
C语言的system系统命令调用接口
将要执行的命令置于system函数中
编译后将生成的.exe
文件放入example.c所在目录中运行即可。
指令和数据的存储方式
存储器的分类
AVR处理器的存储部件主要包含FLASH和SRAM。
FLASH用于存储指令,也即函数编译后产生的机器码指令。
SRAM用于存储数据,也即程序中定义的全局变量、静态变量等变量值。
-
C程序中函数-FLASH, 变量-SRAM
SRAM存储数据规则
-
char 1个字节; int 2字节; long int 4字节; float 4字节
-
仅存储全局变量和静态变量,不存储局部变量
-
并非从
0x00
开始存储 -
先存储已经初始化的变量(data区),再存储未初始化的变量(bss区)
-
按照变量定义的先后顺序存储
-
默认赋初值为0
-
每个存储单元存储1字节,若有多个字节,一般高地址存高位
char k[2] = {1,2};
int b, a = 256;
float f = -60.6875; //4字节0xC2 72 C0 00
int main(void)
{
char *p = k;//数组首地址 指针p初值为0x100
int *q = &a;//整形a首地址0x102
*(p+3) = 0;//1个char占1个字节,指针p每加1,往后1个地址,故p+3指向0x103
*(q+2) = 0x42A9;//int占2个字节 指向0x106,向0x106写入0x42A9;其中低字节0xA9存在0x106,0x42存在0x107
}
FLASH存储数据规则
-
先存系统默认的启动代码
-
依次存放函数编译后的指令机器码
-
最后存放程序结束部分机器码
生成数据与指令的存储地址映射表
avr-gcc.exe -Wall -O -g -mmcu=attiny88 -Wl,-Map=example_Map.txt -o example example.c
-Wl,-Map=example_Map.txt
可将example.c
中定义的全局或静态变量的地址以及各个函数的地址输出到地址映射文件example_Map.txt
本文来自博客园,作者:EisenJi,转载请注明原文链接:https://www.cnblogs.com/eisenji/p/14529565.html