1.设计方案
由题意可知,自变量X是一个有符号的8位二进制数,可采用累加器A判零条件转移和位控制条件转移指令来设计。程序流程图如图4-6所示。
由图4-6可见,本设计方案主要可分为3个步骤:
1)将X送入A中,以A的内容为判据这是利用条件转移指令的一个前提。
2)先分支,
图4-6 先分支后赋值程序流程图
3)分支后,送入A
最后将累加器A中内容送入FUNC单元。
2.关键指令选用
图4-7 先分支指令作用过程
显然,在这3个步骤中的关键一步是“先分支”,按公式可采用“JZ DONE”和“JNB ACC.7,POSI”两条语句来实现按A值分成三支。先分支指令作用过程如图4-7所示。
首先,判断累加器A是否为零,如果为零,即JZ条件成立,CPU执行分支2,否则CPU继续执行下一条指令“JNB ACC.7,POSI”来判断累加器A中的数是正数还是负数,如果条件成立,即ACC.7=0,CPU执行分支1,否则,继续执行下一条指令“MOV A,#0FFH”,即分支3。
3.参考程序与说明
上述先分支程序设计方案的参考程序如下:
ORG 0100H
VAR DATA 30H
FUNC DATA 31H
此程序的作用是将一个有符号数X放入RAM的30H单元后,从程序存储区的0100H单元启动执行该程序,就可在RAM的31H单元得到相应的Y值。
下面进一步着重说明几条指令的功能和使用要点。
(1)“ORG 0100H”语句说明
1)定义与功能。ORG是汇编程序的伪指令,放在程序段的开始,用于确定程序段所在起始地址。伪指令ORG功能示意如图4-8所示。(www.xing528.com)
图4-8 伪指令ORG功能示意图
2)使用要点。“ORG 0100H”在自动汇编时,汇编程序将此后的程序写在0100H开始的ROM单元;而在人工汇编时,则必须人为将此后的程序指令写在0100H开始的ROM单元内。
3)讨论:
问题①:MCS-51系列单片机开机后,如何才能执行此程序段?
答:在ROM的0000H单元写入“LJMP 0100H”转移指令。这是因为:MCS-51系列单片机开机后,上电复位使程序指针PC复位,PC值=0000H,即MCS-51系列单片机开机后一定从ROM单元0000H开始执行程序,这样必须采用转移指令将PC值变为0100H,才能使单片机立即进入此程序段。
问题②:伪指令与一般单片机指令有什么区别?
答:所谓伪指令是仅供汇编程序使用的指令,而不是MCS-51系列单片机可执行的指令。伪指令ORG的功能如图4-8所示。
(2)“VAR DATA 30H”语句说明
1)定义与功能。DATA是伪指令,用以对字符名称VAR分配一个片内RAM单元字节的地址,字符名称VAR在本程序中是代表自变量X单元,执行此伪指令后,RAM的30H单元被分配用作X单元,即30H单元的内容就是X值。伪指令DATA作用说明如图4-9所示。
2)使用要点。自动汇编时,用汇编程序完成VAR=30H;人工汇编时,必须人为将直接地址30H写入VAR。
3)特点。便于记忆,书写程序灵活,可赋任一内存地址,便于修改程序。
(3)“MOV A,VAR”语句说明
1)定义:内部数据传送指令,直接寻址。
图4-9 伪指令DATA作用说明
2)要点:VAR为直接地址单元的标号,在自动汇编时用汇编程序完成VAR=30H;人工汇编时,必须人为将直接地址30H写入VAR。
3)讨论:
问题①:为什么在程序的一开始要将VAR(VAR=X)送入A?
答:A的状态是JZ及JNB指令跳转与否的判据。
问题②:为什么要用字符名称VAR来代表X,能不能用字符名称FUNC来代表Y?
答:这是用汇编语言写程序的常用方法,既便于记忆书写,又便于修改程序。
问题③:为什么在程序中,当X=0时,程序就直接跳转到DONE标号语句?
答:因为此时A的内容等于0,则可直接写入FUNC单元。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。