继续请教 51 汇编/汇编真难啊!认识 单词 不认 句子

[复制链接]
2243|17
 楼主| itelectron 发表于 2014-3-9 16:23 | 显示全部楼层 |阅读模式
本帖最后由 itelectron 于 2014-3-10 16:39 编辑

NUMBER_1:
        MOV  A,#83H ;有符号数 / signed short  i=
        ADD  A,#46H  ;有符号数 short i= 0x0046+0x83/??// 编译器  为什么不 直接 MOV A #C9H    (C9=0X83+0X46)
        MOV  R7,A
        CLR  A        
        ADDC A,#00H ;//是为了两个数相加 得到 进位 么?/CY=1/??
        MOV  R6,A     ;

        ;================================================
        CLR  C               ;//  if(Ram58<i)P1=0x01;
        MOV  A,58H
        SUBB A,R7     
        MOV  A,R6   
        XRL  A,#80H   
        MOV  R0,A
        MOV  A,#80H  
        SUBB A,R0
        JNC  FUN2:   
        MOV  P1,#01H   
======================================


红色部分看不明白
wangch_sh 发表于 2014-3-9 16:39 | 显示全部楼层
哪儿不懂?
teddeng 发表于 2014-3-9 16:59 | 显示全部楼层
反汇编的吧?反汇编后不一定是原代码。
airwill 发表于 2014-3-9 18:34 | 显示全部楼层
就这样看一段代码, 真有点费劲的.
所以, 现在汇编已经基本退出工程师们的手心了.
有心, 不如直接用 C 改写吧
ningling_21 发表于 2014-3-9 18:36 | 显示全部楼层
很像是反汇编的代码,看起来是挺费劲但也看不懂...
 楼主| itelectron 发表于 2014-3-9 19:31 | 显示全部楼层
本帖最后由 itelectron 于 2014-3-9 19:33 编辑

用C改写 也 得 弄明白 才能改写 呀
signed short  i;
i= 0X83+0x46; 编译后和上面红色部分 不 相同

if(Ram58<i)P1=0x01;
天风立马 发表于 2014-3-9 22:30 | 显示全部楼层
就这几句,画流程图慢慢悟吧。
xlfy909 发表于 2014-3-9 22:57 | 显示全部楼层
结果低8位存入R7
高位存入R6

这是什么编译器。常量运算一般是编译的时候处理好了。。。
four_zhg 发表于 2014-3-10 10:08 | 显示全部楼层
还是改C吧,汇编好多年没碰了
Simon21ic 发表于 2014-3-10 12:57 | 显示全部楼层
这种反汇编看不懂的话,那没人能帮你了
lukunn 发表于 2014-3-10 14:57 | 显示全部楼层
NUMBER_1:
        MOV  A,#83H ;有符号数 / signed short  i=     //把83这个十六进制数(无符号)移动到累加器 A中,
        ADD  A,#46H  ;有符号数 short i= 0x0046+0x83/??//为什么要这么写   //累加器A中的数和十六进制数46相加,结果存在A中
在51中所有的运算都需要累加器A的参与,所以需要先把一个数存到A中,再让A与另一个数相加,结果存在A中。而无法直接让两个数相加;这是由51单片机的寻址方式决定的,51单片机无法同时寻址两个外部的存储地址;也就是说虽然你预先定义了两个常量;并给这两个常量分配了存储的空间,但是没有一个指令同时读取这两个地址中的数据,然后相加再存到A中。所以这两个常量如果需要运算,还是需要先把一个常量读到A中,再让A与另一个常量相加。
 楼主| itelectron 发表于 2014-3-10 16:38 | 显示全部楼层
lukunn 发表于 2014-3-10 14:57
NUMBER_1:
        MOV  A,#83H ;有符号数 / signed short  i=     //把83这个十六进制数(无符号)移动到 ...

谢谢你这么耐心的 解答,但是 你说的我都知道  
我的问题是 编译器  为什么不 直接 MOV A #C9H    (C9=0X83+0X46)
lukunn 发表于 2014-3-24 13:23 | 显示全部楼层
itelectron 发表于 2014-3-10 16:38
谢谢你这么耐心的 解答,但是 你说的我都知道  
我的问题是 编译器  为什么不 直接 MOV A #C9H    (C9=0 ...

编译器没那么智能,而且程序员想要C9H,为什么还要用83H+46H呢?直接赋值C9H多好。而程序员定义了83H和46H两个常量,有了能别的地方还要用到这两个常量,所以不能把这两个常量省略。
four_zhg 发表于 2014-3-24 13:45 | 显示全部楼层
本帖最后由 four_zhg 于 2014-3-24 13:49 编辑

同意楼上,编译器没有那么智能
xuyaqi 发表于 2014-3-24 16:22 | 显示全部楼层
还要看前面的语句,不能死扣这一段。
bbser 发表于 2014-3-24 19:22 | 显示全部楼层
运算的部分用c,
用汇编,就做好说明.看不懂的部分,就实际运行,代入一些数据看结果.再不行就重写.
天风立马 发表于 2014-3-24 19:50 | 显示全部楼层
先看整体,再看模块,再看局部。我刚参加工作时就他妈画了个1W多行的反汇编程序的流程图。这些玩意都是承上启下的,部分代码神能懂。
 楼主| itelectron 发表于 2014-3-28 21:08 | 显示全部楼层
楼上强人
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:MARK: zhi kan ji shu

274

主题

2761

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部