pa
=
pb
:
直接将pb的值也就是B的地址给pa
:pa
=
&b
pa
=
pb
:
a
=
b
看来你对指针还是不太理解
这样的东西,你可自己写个代码,测试一下就明白了,学计算机语言都是这样的
只是普通8个LED灯共阳级,那另一端分别接P0~P7端口,对应端口初始高电平, 需要哪个LED亮直接对应端口置低电平就好了。
如果你说的是单独1位的8字显示器(包含小数点)
每段加小数点就相当于8个独立led灯,也是一样公共端接电源,另一端分别接P0~P7口,区别就是多一个组合(想显示某个数字,需要同时点亮其中几个灯)。
A处执行完毕后,数组c并不一定设置好。
以本题为例:
程序顺次执行
c[0]=a[0],pc++,pa++;
c[1]=a[1],pc++,pa++;
c[2]=b[0],pc++,pb++;
c[3]=a[2],pc++,pa++;
到这一步pa-ay已经超过A_NUM了,所以while(pa-a<A_NUM && pb-b<B_NUM)的条件不满足,循环终止。
在下来执行while(pb-b<B_NUM) //C处的循环来完成数组c的设置。
程序顺次执行
c[4]=b[1],pc++,pb++;
c[5]=b[2],pc++,pb++;
完毕!
你明白了么?
自己找个编译器,运行一下不就知道了吗
我个人认为是:
0 0
1 2
2 4
1 1
2 5
4 13
不过没有上机调试,具体要上机调试才好
#include<stdioh>
void main()
{
int va[10],vb[10],pa,pb,i;
pa=va;pb=vb;
for(i=0;i<3;i++,pa++,pb++)
{
pa=i;/va[0]=0,va[1]=a,va[2]=2/
pb=2i;/vb[0]=0,vb[1]=2,vb[2]=4/
printf("%d\t%d\n",pa,pb);
}
pa=&va[0],pb=&vb[0];
for(i=0;i<3;i++)
{
pa=pa+i; //va[0]=0,va[1]=2,va[2]=4
pb=pbi; //vb[0]=0,vb[1]=4,vb[2]=12
printf("%d\t%d\n",pa++,pb++);/这里的++比运算符低,所以是对值自加,而不是地址/
}
}
1、如果程序代码空间不紧张的话,建议你全部使用LJMP,或者如果跳转的目标段程序相隔很近,也可以使用SJMP。个人认为AJMP最麻烦:其机器码所标注的地址位从A10到A0,计11位,000H~7FFH,也就是说跳转到的地址与当前地址的A10到A0必须一样,比如:
原来AJMP地址为:07F8H,目标地址:07F0H,如果调试软件修改后,变为
AJMP地址为:0800H,目标地址:07F8H,A11不一样,不在一页范围,此时还得将其改成LJMP,否则编译出错。其实就省了一个字节,执行时间上都是2个机器周期,没区别,所以犯不上。如果像此例,使用SJMP倒是个较好的选择,只是要求你对代码间的间隔有数才行。
总之,尽量用LJMP吧。
2、二者区别其实就是转移的目标是绝对地址,还是针对当前转移指令所在地址的相对偏移量
绝对转移51中只有AJMP、LJMP是绝对转移指令,都是直接跳转到固定地址。我们平时写的比如LJMP MAIN语句,源程序中并未表示出这一点,假设MAIN标志的程序段是从0102H开始的,此句编译后的机器码是02 01 02,02代表LJMP跳转,后两个字节0102则为目标地址,由于使用了2个字节指明目标地址,所以其范围就是整个64K的空间,没有限制;AJMP在这一点上就要差些,只能在所在的2K页内跳转。
相对转移剩下的转移指令都是相对转移指令,包括SJMP,它们是以当前语句的下一条语句所在地址为准,PC值向前或向后偏移数个字节地址开始执行,偏移量范围从-128到+127,以补码方式存在。比如
ORG 0100H
NO1: CLR A
SJMP NO1
编译后地址及机器码:
0100H: 0E4H (CLR A)
0101H: 80H 0FDH (SJMP NO1,从0103跳回0100,倒退3字节,3的补码即取反+1=FDH
0103H: 00H
3、要想能高效的调试大的汇编程序,首先要求程序本身的编制应该规范。关于这一点我有些感触,就算是经验吧,供参考(我曾经用汇编做过50多K机器码的程序)。
单片机的执行其实是单一线程的,一般只有两种情况会偏离原来的流程,一种是中断服务子程序,注意别忘了使用RETI;还有就是普通子程序,别忘了使用RET;再加上注意出栈、入栈 *** 作,而且该 *** 作因成对并保证先进后出原则,这样的话才真正做到模块化编程,调试时才能不理睬其它部份,单独调试某个模块,提高效率。这一点C语言就比较好,以函数方式实现,少写括号编译通不过,不像汇编,少些个RET照样能通过。
另外,编写程序时应养成一种习惯:对程序体中的寄存器 *** 作尽量不要直接使用其地址,比如:MOV 30H,A,这里直接写30H不好,因为大的汇编程序对寄存器地址的调整是很常见的现象,一旦修改,程序中每个地方都要改,容易遗漏,一旦遗漏,非常难找原因的。可以用EQU伪指令对其定义,程序体中使用。同样,这一点C语言要好的多,至少不需要去分配寄存器了。
还有一个最容易出错的地方,就是关于标志位C:比如CJNE指令,它的判断是会影响C标志位的,如果程序后面有对C标志位判断的语句又没有考虑这种情况,问题极难查。很多人包括我自己会忽略这种细节。这类问题只能靠细致了。
最后谈谈调试
调试过程一般都是逐个模块(子程序)分别调试,完成一个再检查下一个,不能指望一上来就正确。调试完后还要多次、多人测试,自己有时形成了固定思维,发现不了问题。
终极方法:分部仿真设断点甚至于单步执行。对一些外部输入可以采用到断电后修改寄存器数值的方法来模拟。当然最理想的情况是不用,只是初期恐怕是免不了的。比如对上面所说的C标志位问题,我个人当初几乎都是这样找出的问题
大的汇编程序的调试确实比较麻烦,首先要求你对软件流程很清晰,对单片机的运行模式也要很了解。至于你现在的程序如果有问题,我建议还是采用仿真设断点的方式来找问题,尤其是如果搞单片机的时间不长的话,这样其实可能更快些。
希望所说能对你有所帮助。
参考答案: 在所有的关系中,最重要的是和自己的关系。和自己相处好了,就会和他人相处好。对他人的不满、指责和抱怨,其实是内心深处对自己的不满、不接纳、不自信。每一次,对他人表达各种不满之前,都问问自己:是否也怀有对自己同样的不满。如此,会知己知彼,会慢慢变得智慧。
以上就是关于C语言里,int a=11,b=22,*pa,*pb;pa=&a;pb=&b;在上面程序段的基础上,执行语句~全部的内容,包括:C语言里,int a=11,b=22,*pa,*pb;pa=&a;pb=&b;在上面程序段的基础上,执行语句~、用c语言怎样编辑PA0~PA7控制8个共阳LED灯的程序、c语言简单程序解释一下等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)