计硬实验四 指令系统和寻址方式.docx
- 文档编号:25252946
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:11
- 大小:148.45KB
计硬实验四 指令系统和寻址方式.docx
《计硬实验四 指令系统和寻址方式.docx》由会员分享,可在线阅读,更多相关《计硬实验四 指令系统和寻址方式.docx(11页珍藏版)》请在冰豆网上搜索。
计硬实验四指令系统和寻址方式
计算机硬件基础
周浩2015011685
班号:
33机器号:
22
实验4寻址方式和指令系统
任务一:
1.在反汇编main函数里面,代码中用到了哪些指令?
哪几种寻址方式?
指令:
核心指令:
mov、call、jmp、jnc、jne、cmp
仿真指令:
clr、inv、adc、tst、decd、inc、ret
寻址方式:
立即数寻址、
绝对地址寻址、
相对地址寻址
寄存器寻址
2.用单步执行命令F11,跟踪dalay的调用和返回,记录堆栈指针SP和堆栈内容的变化
程序刚开始时SP指向0x400,进入main函数之后SP自动-2变为0x03FE,执行delay函数时,SP变为0x03FC,在delay中SP的值一直为0x03FC,delay循环结束SP又变为0x03FE,之后一直循环变化。
堆栈中只有R15的值发生变化,因为R15存放了变量i的值,因此不断变化。
3.将变量i定义为全局变量。
与i是局部变量时有什么不同,分析为什么?
I为全局变量下的delay函数的汇编
此时,采用的寻址方式为绝对地址寻址
i局部变量下的delay函数的汇编指令
此时i采用的寻址方式是寄存器寻址。
因为全局变量是存放在内存RAM区0x0200处,而局部变量i存放在R14寄存器内。
4.将变量i的类型从unsignedint类型,改为unsignedlong类型,反汇编看看函数dalay的代码发生了什么变化?
程序执行的结果有什么不同?
为什么?
delay函数的地址变到main函数上部,i由两个字节变为四个字节,delay函数的执行时间变长,LED灯的变化速率变慢。
因为变量i从int变为long,因此i的增加速率变慢,delay函数的执行时间也就变长。
任务二
程序L4_problem.c欲实现按下P1.1连接的按键K2,就点亮P2.0连接的灯L1;反之释放按键K2,就熄灭L1。
可是程序运行的结果是L1始终不亮。
通过反汇编查看L4_problem.c对应的汇编指令程序,发现这段程序没有设置P2.0为0的相关代码。
请解释为什么?
首先通过反汇编,可以看到
并没有判断K2是否按下就&P1IN的值给了R14,没有执行if后面的语句,然后就直接运行下一语句,因此程序问题出现在了
这里。
经过修改应该是
任务三
1.void_delay_cycles(unsignedlongcycles)是一个真正意义上的函数定义吗?
为什么?
void_delay_cycles(unsignedlongcycles)不是一个函数定义,因为它不符合c语言定义函数的语法规则。
2.括号中的unsignedlongcircles取不同的值,会影响什么?
Unsignedlongcircles取不同的值影响是延时长短。
(因为void_delay_cycles(unsignedlongcycles)在功能上与一个延时函数作用相同)
3.__delay_cycles(unsignedlongcycles)实现什么功能以及应该如何使用?
__delay_cycles(unsignedlongcycles)实现了延时的功能,括号内的unsignedlongcycles决定延时的长短。
使用时赋予(unsignedlongcycles)具体的值即可。
结合以上3个实验,总结如何利用反汇编c语言的程序代码,分析实验中遇到的一些底层问题。
1.弄清楚汇编常用的指令。
2.程序代码没有出现语法错误的时候,可以采用反汇编的方式来查看是否有逻辑问题。
3.善用deugger里面的调试功能。
任务四
了解c语言程序的执行过程
以L4_instruction.c的项目为例。
1.请问实验中查看到的第一条指令的地址是多少?
可以看到PC寄存器从存储系统地址为0xffff~0xfffe获取到的第一条指令的地址是0xc000.
2.程序执行的第一条指令是什么?
由于PC指针取到的第一条指令地址是0xc000,因此程序执行的第一条指令应该是0xc000处的指令。
3.main函数入口处的第一条指令是单片机上电就被执行的第一条语句吗?
由上两个问题分析可以看出,main函数入口处的第一条指令不是被执行的第一条指令。
提高:
C语言中带初始化变量的定义及其实现
程序L4.string.c,在debug下反汇编程序,比较一个数组分别定义成const型常量、全局变量、局部变量三种不同的形式,系统在初始值的实现上有何不同?
数组string分别指向存储系统的哪些地方?
各有什么特点?
首先来看const型常量
可以看出在main函数开始前,const型常量就被存放在了0xc000处并完成初始化。
定义成全局变量
数组被定义为全局变量时开始没有被初始化,但是数组被分配在0x0200地址里,数组里面数据储存在0xC000中,因此上电后开始执行初始化SP,已经将0xC000的值赋给R13,将0x0200赋给R12,接着跳转执行__datal16_memcpy,并在memcpy函数里完成对数组初始化,然后返回main函数。
定义成局部变量
数组被定义为局部变量时开始没有被初始化,也没有分配储存地址,但是数据里的数据还是储存在0xC000中,上电后执行到main函数里初始化数组的语句时程序将0xC000赋给R15,接着用SP和R15完成初始化数据,并将数组分配在0x03FA中。
思考:
在局部变量前加上static,看看有什么不同?
数组被定义为static型局部变量时,和定义为全局变量时类似,数组被一开始没有被初始化,但是数组被分配在0x0200地址里,数组里面数据存储在0xC000中,因此上电后开始执行初始化SP,以及将0xC000的赋给R13,将0x0200赋给R12,接着跳转执行__datal16_memcpy,并在memcpy函数里完成对数组初始化,然后返回main函数。
自主探究:
(全局变量)二维数组在程序中是如何初始化的?
代码如下:
#include"io430.h"
//constcharstring[4]={'1','A',0x10,0x02};//第1种const型常量
//二维数组
charstring[4][2]={{'1','2'},{'A','B'},{0X01,0X02},{'a','b'}};
intmain(void)
{//charstring[4]={'1','A',0x10,0x02};//第3种局部变量
charsum;
unsignedchari;
WDTCTL=WDTPW+WDTHOLD;
P2SEL=0;
P2SEL2=0;
P2DIR=0xff;
sum=0;
for(i=0;i<4;i++)
{sum=sum+string[i][1];}
P2OUT=sum;
while
(1);
}
反汇编结果如下:
可以看出,全局变量下的二维数组与全局变量下的一维数组初始化过程都一样,被分配在0x0200处,数据存储在0xc000处。
且可以看出,二维数组在被初始化时,本质上是被看作一维数组来对待的。
仅仅是被调用时略有不同。
实验总结:
通过本次实验我学到了有关汇编语言以及计算机寻址方式的有关知识。
了解很多汇编语句所代表的含义以及作用,了解了对于各种变量计算机是如何储存如何识别如何调用的。
更清晰的了解了计算机的工作过程与方式。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计硬实验四 指令系统和寻址方式 实验 指令系统 寻址 方式