打印

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

[复制链接]
1583|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 改写吧

使用特权

评论回复
5
ningling_21| | 2014-3-9 18:36 | 只看该作者
很像是反汇编的代码,看起来是挺费劲但也看不懂...

使用特权

评论回复
6
itelectron|  楼主 | 2014-3-9 19:31 | 只看该作者
本帖最后由 itelectron 于 2014-3-9 19:33 编辑

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

if(Ram58<i)P1=0x01;

使用特权

评论回复
7
天风立马| | 2014-3-9 22:30 | 只看该作者
就这几句,画流程图慢慢悟吧。

使用特权

评论回复
8
xlfy909| | 2014-3-9 22:57 | 只看该作者
结果低8位存入R7
高位存入R6

这是什么编译器。常量运算一般是编译的时候处理好了。。。

使用特权

评论回复
9
four_zhg| | 2014-3-10 10:08 | 只看该作者
还是改C吧,汇编好多年没碰了

使用特权

评论回复
10
Simon21ic| | 2014-3-10 12:57 | 只看该作者
这种反汇编看不懂的话,那没人能帮你了

使用特权

评论回复
11
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与另一个常量相加。

使用特权

评论回复
12
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)

使用特权

评论回复
13
lukunn| | 2014-3-24 13:23 | 只看该作者
itelectron 发表于 2014-3-10 16:38
谢谢你这么耐心的 解答,但是 你说的我都知道  
我的问题是 编译器  为什么不 直接 MOV A #C9H    (C9=0 ...

编译器没那么智能,而且程序员想要C9H,为什么还要用83H+46H呢?直接赋值C9H多好。而程序员定义了83H和46H两个常量,有了能别的地方还要用到这两个常量,所以不能把这两个常量省略。

使用特权

评论回复
14
four_zhg| | 2014-3-24 13:45 | 只看该作者
本帖最后由 four_zhg 于 2014-3-24 13:49 编辑

同意楼上,编译器没有那么智能

使用特权

评论回复
15
xuyaqi| | 2014-3-24 16:22 | 只看该作者
还要看前面的语句,不能死扣这一段。

使用特权

评论回复
16
bbser| | 2014-3-24 19:22 | 只看该作者
运算的部分用c,
用汇编,就做好说明.看不懂的部分,就实际运行,代入一些数据看结果.再不行就重写.

使用特权

评论回复
17
天风立马| | 2014-3-24 19:50 | 只看该作者
先看整体,再看模块,再看局部。我刚参加工作时就他妈画了个1W多行的反汇编程序的流程图。这些玩意都是承上启下的,部分代码神能懂。

使用特权

评论回复
18
itelectron|  楼主 | 2014-3-28 21:08 | 只看该作者
楼上强人

使用特权

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

本版积分规则

个人签名:MARK: zhi kan ji shu

274

主题

2764

帖子

8

粉丝