打印
[STC单片机]

c语言转汇编代码的理解疑问

[复制链接]
1253|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
XLDZZ|  楼主 | 2017-5-22 15:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 XLDZZ 于 2017-5-22 15:39 编辑

我的目的是想在简单的51上写一个简单的rtos
于是开始从汇编开始理解
没想到水平实在是差 第一次就遇到问题 还请各位大师帮忙解答
我的c语言是这样的
while(1)
   {
    val++;
    if(val>=1000)
     val=0;
   }
汇编代码是这样的
    27:    while(1)
    28:    {
    29:     val++;
C:0x0003    0509     INC      0x09
C:0x0005    E509     MOV      A,0x09
C:0x0007    7002     JNZ      C:000B
C:0x0009    0508     INC      val(0x08)
    30:     if(val>=1000)
C:0x000B    C3       CLR      C
C:0x000C    94E8     SUBB     A,#0xE8
C:0x000E    E508     MOV      A,val(0x08)
C:0x0010    6480     XRL      A,#P0(0x80)
C:0x0012    9483     SUBB     A,#DPH(0x83)
C:0x0014    40ED     JC       main(C:0003)
    31:      val=0;
C:0x0016    E4       CLR      A
C:0x0017    F508     MOV      val(0x08),A
C:0x0019    F509     MOV      0x09,A
    32:    }  
我的问题是这样的 C:0x0003    0509     INC      0x09
C:0x0005    E509     MOV      A,0x09
C:0x0007    7002     JNZ      C:000B
C:0x0009    0508     INC      val(0x08)
在内存地址0x09上加1
然后把数据送到acc
然后检查进位位是否为0 如果不是则跳转到0x00b的地址上运行
否则直接 val+1  问题是为什么一开始就加了 后面还要加

相关帖子

沙发
吾要单片机| | 2017-5-22 16:05 | 只看该作者
你的val是16位,51是8位机,只能这样做

使用特权

评论回复
板凳
XLDZZ|  楼主 | 2017-5-22 16:20 | 只看该作者
感谢 我明白了
一下子没反应过来
用惯了32位机了

使用特权

评论回复
地板
john_lee| | 2017-5-22 16:24 | 只看该作者
地址 8和9,分别存储了 val 数据的高字节和低字节。先低字节 + 1,如果有进位,就再把高字节 + 1。
虽然看起来有点怪异(没有使用 ADDC 指令),但由于 51 指令的特点,这么写实际上比使用 ADDC 指令的方法效率还要高一些。
附,使用 ADDC 指令的方法:
MOV A,9
ADD A,#1
MOV 9,A
MOV A,8
ADDC A,#0
MOV 8,A

使用特权

评论回复
5
dukecheng| | 2018-5-17 11:16 | 只看该作者
看起来很麻烦

使用特权

评论回复
6
chunk| | 2018-5-19 08:56 | 只看该作者
终于有人把C源程序编译成汇编语言做分析了。

既然你提到了想做RTOS,我就借贴说点题外话,可能以后对你有用。

在8位CPU上,“val++”生成了多条指令,CPU在执行这几条指令时,如果出现了硬件中断会怎样?显然中断可以发生在“MOV”指令后,可以发生在“INC”指令后,也可以发生在“JNZ”指令后,那么,如果中断服务程序中恰好又要用到val变量,那会是个什么情况呢?

在RTOS里有个叫做“Critical Section”的东东,你这个例子恰好有助于你理解这个“临界代码段”的概念。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

64

主题

182

帖子

0

粉丝