|
3.9 习题 |
一、简答题
1.简述单片机各个寻址方式的区别。
答:立即寻址相当于直接给出操作数,此时的操作数称为立即数。立即数的前面采用标识符“#”来表示,是寻址指令中直接出现的数据。
直接寻址方式相当于将操作数存放的地址告诉指令,此时为了和立即寻址相区别,地址前没有标识符“#”。
寄存器寻址相当于告诉指令操作数所存放的寄存器,此时,寄存器中的内容作为操作数。
寄存器间接寻址相当于绕了更大的弯,此时数据存放在RAM中,而该RAM的地址放在寄存器中。这样,通过访问寄存器来获得RAM中操作数的寻址方式便是寄存器间接寻址。
变址寻址提供了16位地址的寻址能力,其采用基址寄存器加变址寄存器方式来寻址。其中,基址寄存器为DPTR或PC,变址寄存器为累加器A,用于存放地址偏移量。
相对寻址是根据指定地址的偏移量,然后从当前PC值跳转到偏移量所指向的地址的方式。这里地址偏移量为带符号的8位二进制数,其取值范围为-128~+127。因此,相对寻址可以寻址当前PC的-128~127之间的某段程序存储器。
位寻址是特别为位操作区域提供的寻址方式,在指令中直接给出位地址即可。
2.简述循环结构程序的构成。
答:一个典型的循环程序由4部分组成,即循环初始化部分、循环处理部分、循环控制部分和循环结束部分。对于各个部分,读者可以参阅本章中的介绍。
3.简述Keil μ Vision3集成开发环境中使用单片机汇编语言的步骤。
答:主要包括创建项目、编辑源文件、编译项目和仿真调试几步,具体可以参阅书中例子。
二、编程题
1.假定一个十六进制数存放在20H单元,其值在00H~0FH之间,利用汇编语言,将其转换成ASCII码,并送入21H单元中。
答:这里,相当于将0~F这16个数字转换为相应的ASCII码字符,也就是’0’~’F’。程序中可以使用查表程序结构来实现。程序中定义一个ASCII码表格,存放’0’~’F’对应的ASCII码。根据20H单元存放的数据,通过变址调整,来在ASCII表格中查找对应得ASCII字符,并送入21H单元。
2.假定一个单字节数存放在20H单元,将其转换成BCD码并送入21H~23H单元中。
答:单字节十六进制数据在0~255之间,首先将其除以100后,商为百位数,余数除以10,商为十位数,余数为个位数。程序转换后,百位数送入21H单元中,十位送入22H单元,个位数送入23H单元中。
3.假定双字节数的高字节和低字节分别存放在20H单元和21H单元,对其进行求补,并保存相应的结果。
答:这里可以使用分支结构来实现,通过JZ指令来进行跳转。首先,对低字节数取补,然后判断其结果是否为0,如果为0,则对高字节数进行取补,即取反加1,否则直接取反就可以了。程序将求补以后的结果,高字节存放于地址21H单元中,低字节存放于22H单元中。
4.单片机20H~29H单元存放了10个数据,计算其最小值并保存在通用寄存器R2中。
答:这里可以通过循环结构的程序来实现。在程序中,采用了比较和交换的方法来依次对比各个数据。数据块的首地址为20H,把第一个数据作为基准数送入累加器A,通过CJNE指令与第二个数据进行比较。如果基准数小,则不做交换,否则进行一次数据交换。然后,再取下一个数进行比较,直至全部比较完毕。这里的基准数始终保持为最小的数值,因此,全部比较完毕后,累加器A中即是最小值,将其保存在通用寄存器R2中。
5.编程实现单片机P1.0引脚的方波输出。
答:这里可以通过循环结构来实现,在循环内部,通过MOV指令分别向P1端口写入#00H和#00H,便可以实现P1.0引脚交替的方波输出。读者还可以在Keil μVision3中进行仿真。
6.单片机20H~29H单元存放了10个数据,计算累加和。
答:这里可以通过循环结构的程序来实现。首先取第一个数据送入累加器A,通过循环依次取后面的数据进行累加,最终的结果可以存放在通用寄存器中。这里需要注意的是,最终的累加和有可能超过1个字节,程序中需要进行相应的处理,使最终结果的高字节送入R2,低字节送入R3中。
7.编写8位带符号整数除法的汇编子程序。
答:这是一个比较综合的程序,这里给出完整的汇编子程序,读者可以对照注释加深理解。