求助啊~汇编不会编~

[复制链接]
 楼主| spirits_hyx 发表于 2012-3-21 16:32 | 显示全部楼层 |阅读模式
uchar code shift_code[16]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //128个激光接受管位置编码
uchar DAT_DIM[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88}; //16组数据初始值
void scan_dats(void)
{
    uchar i,j,temp;
P1 = 0xff;
P2 = 0xff;
                                   //强制EN0-EN15使能控制为无效状态,所有574输出为高阻态
for(i=0; i<8; i++)               //读取1-8 单元
{
  P1 = shift_code[i];
  DAT_DIM[i] = ~P3;
  P1 |=  0xff;
  if(DAT_DIM[i]!=0xff)
  {
   temp = DAT_DIM[i];
   group = i;
   for(j=1; j<9; j++)
   {
    if((temp & 0x01) == 0)
    {
     position = j;
     break;
    }
    else temp = temp >> 1;
   }
  }
}  
for(i=8; i<16; i++)                //读取9-16单元
{   
   P2 = shift_code[i];
      DAT_DIM[i] = ~P3;
   P2 |=  0xff;
     if(DAT_DIM[i]!=0xff)
   {  
     temp = DAT_DIM[i];
    group = i;
    for(j=1; j<9; j++)
    {
     if((temp & 0x01) == 0)
     {
      position = j;
      break;
     }
    else temp = temp >> 1;
    }
   }
}
data1 = group*8+position;  
}
如何将这段C语言的函数写成汇编程序呢?用的片子是C8051F,汇编真的是一点不会啊~一听都头疼!求助各位大侠~~~~
ayb_ice 发表于 2012-3-21 16:37 | 显示全部楼层
生成SRC文件即可
tianheyun 发表于 2012-3-21 19:25 | 显示全部楼层
这个不难吧
NE5532 发表于 2012-3-21 20:14 | 显示全部楼层
知道原理照着写就是了啊,汇编跟C其实没啥区别,都是用来描述问题的。楼主难是难在不知道汇编指令,不知道单片机内核结构,要补这部分的课。
gx_huang 发表于 2012-3-21 20:18 | 显示全部楼层
对于从来没有搞过汇编的,就难了。
我刚学的时候,把别人的单板机监控程序活生生的反汇编,自然就精通了。
 楼主| spirits_hyx 发表于 2012-3-21 20:57 | 显示全部楼层
4# NE5532
是啊,原理都知道,就是不清楚汇编指令,哎,看来真得恶补一下啦~
 楼主| spirits_hyx 发表于 2012-3-21 21:03 | 显示全部楼层
3# tianheyun
其实,原理自己都清楚,就是从来没用过汇编,一直习惯C,只知道几个基本的代码~所以,汗颜了!
 楼主| spirits_hyx 发表于 2012-3-21 21:03 | 显示全部楼层
正是苦于不同汇编的代码啊~~~ 5# gx_huang
sunhq02 发表于 2012-3-22 08:30 | 显示全部楼层
你直接copy编译器的汇编结果, 然后人工优化一下就是了
刘前辈 发表于 2012-3-22 09:09 | 显示全部楼层
很简单。按照#2楼,用SRC命令即可。

  1. NAME        TEST4

  2. #include <reg52.inc>

  3. ?PR?scan_dats?TEST4  SEGMENT CODE
  4. ?C_INITSEG           SEGMENT CODE
  5. ?CO?TEST4            SEGMENT CODE
  6. ?DT?TEST4            SEGMENT DATA
  7.         PUBLIC        position
  8.         PUBLIC        data1
  9.         PUBLIC        group
  10.         PUBLIC        DAT_DIM
  11.         PUBLIC        shift_code
  12.         PUBLIC        scan_dats

  13.         RSEG  ?DT?TEST4
  14.         DAT_DIM:   DS   16
  15.           group:   DS   1
  16.           data1:   DS   1
  17.        position:   DS   1

  18.         RSEG  ?CO?TEST4
  19. shift_code:
  20.         DB        0FEH
  21.         DB        0FDH
  22.         DB        0FBH
  23.         DB        0F7H
  24.         DB        0EFH
  25.         DB        0DFH
  26.         DB        0BFH
  27.         DB        07FH
  28.         DB        0FEH
  29.         DB        0FDH
  30.         DB        0FBH
  31.         DB        0F7H
  32.         DB        0EFH
  33.         DB        0DFH
  34.         DB        0BFH
  35.         DB        07FH


  36.         RSEG  ?C_INITSEG
  37.         DB        010H
  38.         DB        DAT_DIM
  39.         DB        000H
  40.         DB        000H
  41.         DB        000H
  42.         DB        000H
  43.         DB        000H
  44.         DB        000H
  45.         DB        000H
  46.         DB        000H
  47.         DB        000H
  48.         DB        000H
  49.         DB        000H
  50.         DB        000H
  51.         DB        000H
  52.         DB        000H
  53.         DB        000H
  54.         DB        088H


  55. ;
  56. ; typedef unsigned char uchar;
  57. ;
  58. ; uchar group, position,data1;
  59. ;
  60. ; uchar code shift_code[16]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};  //128
  61. ; uchar DAT_DIM[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x88}; //16
  62. ;
  63. ; void scan_dats(void)

  64.         RSEG  ?PR?scan_dats?TEST4
  65. scan_dats:
  66.         USING        0
  67.                         
  68. ;---- Variable 'j?041' assigned to Register 'R7' ----
  69. ;---- Variable 'temp?042' assigned to Register 'R6' ----
  70. ; {
  71.                         
  72. ;     uchar i,j,temp ;
  73. ; P1 = 0xff;                        
  74.         MOV          P1,#0FFH
  75. ; P2 = 0xff;                        
  76.         MOV          P2,#0FFH                           
  77. ; for(i=0; i<8; i++)              
  78.                         
  79. ;---- Variable 'i?040' assigned to Register 'R5' ----
  80.         CLR          A
  81.         MOV          R5,A
  82. ?C0001:
  83. ; {                        
  84. ;   P1 = shift_code;
  85.                         
  86.         MOV          A,R5
  87.         MOV          DPTR,#shift_code
  88.         MOVC         A,@A+DPTR
  89.         MOV          P1,A
  90. ;   DAT_DIM = ~P3;                        
  91.         MOV          A,P3
  92.         CPL          A
  93.         MOV          R4,A
  94.         MOV          A,#LOW (DAT_DIM)
  95.         ADD          A,R5
  96.         MOV          R0,A
  97.         MOV          @R0,AR4
  98. ;   P1 |=  0xff;                        
  99.         MOV          P1,#0FFH
  100. ;   if(DAT_DIM!=0xff)
  101.                         
  102.         MOV          A,#LOW (DAT_DIM)
  103.         ADD          A,R5
  104.         MOV          R0,A
  105.         MOV          A,@R0
  106.         MOV          R4,A
  107.         CPL          A
  108.         JZ           ?C0003
  109. ;   {                        
  110. ;    temp = DAT_DIM;                        
  111.         MOV          R6,AR4
  112. ;    group = i;                        
  113.         MOV          group,R5
  114. ;    for(j=1; j<9; j++)                        
  115.         MOV          R7,#01H
  116. ?C0005:
  117. ;    {                        
  118. ;     if((temp & 0x01) == 0)                        
  119.         JB           ACC.0,?C0008
  120. ;     {                        
  121. ;      position = j;                        
  122.         MOV          position,R7
  123. ;      break;
  124.                         
  125.         SJMP         ?C0003
  126. ;     }                        
  127. ?C0008:
  128. ;     else temp = temp >> 1;                        
  129.         MOV          A,R6
  130.         CLR          C
  131.         RRC          A
  132.         MOV          R6,A
  133. ;    }                 
  134. ?C0007:
  135.         INC          R7
  136.         CJNE         R7,#09H,?C0005
  137. ;   }                 
  138. ; }  
  139.                         
  140. ?C0003:
  141.         INC          R5
  142.         CJNE         R5,#08H,?C0001
  143. ?C0002:
  144. ; for(i=8; i<16; i++)
  145.         MOV          R5,#08H
  146. ?C0010:
  147. ; {                           
  148. ;    P2 = shift_code;                        
  149.         MOV          A,R5
  150.         MOV          DPTR,#shift_code
  151.         MOVC         A,@A+DPTR
  152.         MOV          P2,A
  153. ;       DAT_DIM = ~P3;
  154.                         
  155.         MOV          A,P3
  156.         CPL          A
  157.         MOV          R4,A
  158.         MOV          A,#LOW (DAT_DIM)
  159.         ADD          A,R5
  160.         MOV          R0,A
  161.         MOV          @R0,AR4
  162. ;    P2 |=  0xff;
  163.                         
  164.         MOV          P2,#0FFH
  165. ;      if(DAT_DIM!=0xff)
  166.                         
  167.         MOV          A,#LOW (DAT_DIM)
  168.         ADD          A,R5
  169.         MOV          R0,A
  170.         MOV          A,@R0
  171.         MOV          R4,A
  172.         CPL          A
  173.         JZ           ?C0012
  174. ;    {  
  175.                         
  176. ;      temp = DAT_DIM;
  177.                         
  178.         MOV          R6,AR4
  179. ;     group = i;
  180.                
  181.         MOV          group,R5
  182. ;     for(j=1; j<9; j++)
  183.                         
  184.         MOV          R7,#01H
  185. ?C0014:
  186. ;     {
  187.                         
  188. ;      if((temp & 0x01) == 0)
  189.                         
  190.         MOV          A,R6
  191.         JB           ACC.0,?C0017
  192. ;      {                        
  193. ;       position = j;
  194.                         
  195.         MOV          position,R7
  196. ;       break;                        
  197.         SJMP         ?C0012
  198. ;      }
  199.                         
  200. ?C0017:
  201. ;     else temp = temp >> 1;                        
  202.         MOV          A,R6
  203.         CLR          C
  204.         RRC          A
  205.         MOV          R6,A
  206. ;     }                        
  207. ?C0016:
  208.         INC          R7
  209.         CJNE         R7,#09H,?C0014
  210. ;    }                        
  211. ; }                        
  212. ?C0012:
  213.         INC          R5
  214.         CJNE         R5,#010H,?C0010
  215. ?C0011:
  216. ; data1 = group*8+position;  
  217.                         
  218.         MOV          A,group
  219.         MOV          B,#08H
  220.         MUL          AB
  221.         ADD          A,position
  222.         MOV          data1,A
  223. ; }
  224.                
  225.         RET         
  226. ; END OF scan_dats

  227.         END



、、
yewuyi 发表于 2012-3-22 09:17 | 显示全部楼层
吃饭会不会?
icecut 发表于 2012-3-22 09:18 | 显示全部楼层
刘前辈的代码还算很好.和手写差不多了....可以直接用了
xwj 发表于 2012-3-22 10:25 | 显示全部楼层
哈哈,本来就是自动生成的。

Keil对51的优化还是不错的,毕竟做了这么多年了。
 楼主| spirits_hyx 发表于 2012-3-22 23:10 | 显示全部楼层
谢谢楼上的点拨,虽然有人贬,但是承认自己确实不会,如果有机会还是要学学汇编的。一步一步补上来,充实下自己,继续前行。
刘前辈 发表于 2012-3-23 09:18 | 显示全部楼层
学C恐怕一辈子也学不到头,还要回头学汇编?人都是往前走的。

不信现在给你出道C语言题目,答案非常简单,但是你恐怕一年、三年也做不出来。做出来就是高手了。

想接招吗?

、、
 楼主| spirits_hyx 发表于 2012-3-30 22:30 | 显示全部楼层
呵呵,前辈出招吧,我会尽力去做,但是估计希望不大,抱有一颗学习的心态,我C语言也是入门级的,只是需要时间的精确控制才想到了汇编。 15# 刘前辈
刘前辈 发表于 2012-3-31 08:53 | 显示全部楼层
等我。

最快的进步就是有挑战目标。
没事,入门级题目。“不是做不到,而是想不到”的C语言题目。

、、
 楼主| spirits_hyx 发表于 2012-3-31 21:31 | 显示全部楼层
好的,愿意学习,嘿嘿,在实战中锻炼自己,前辈有空就给我出出题目。 17# 刘前辈
刘前辈 发表于 2012-4-1 10:22 | 显示全部楼层

一道题就够长进一大截。

本帖最后由 刘前辈 于 2012-4-1 10:28 编辑

如何把下面16x20的字符序列变换为25 x N 的字符序列打印输出,并且:
1、将源文本中的连续2个双星号'**'改成单字符'^ ';
2、源文件每行后面的空格(符)打印出来;
3、最好用C51,在89C52系列上完成。
   是否使用外部XDATA随意,我是仅使用89C52内部256字节RAM完成的。

举例:假设输入字符序列:

"Thecompiler**ct",
"cognizedirecter",
"call**atoainter",
"punctions*sande",
"rejectsthemabcd",
"Itispoi**lesstt",
"toacallptnterru",
"pte**procedures",
"dire*ctlylbecau",
"exitingtheproce",
"ceduree**causes",
"executionofthee",
"RETIains**truct",
"whichaaffectsty",
"the*hardwareoft",
"interruptsystem",
"the8051*chipemy",
"Becausenointerr",
"irruptreque**st",
"thepartof\n";

则:输出结果字符序列:

//

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
受不了了 发表于 2012-4-1 11:07 | 显示全部楼层
对于从来没有搞过汇编的,就难了。
我刚学的时候,把别人的单板机监控程序活生生的反汇编,自然就精通了。
gx_huang 发表于 2012-3-21 20:18

找一个别人开发的但自己又比较熟悉的产品,一句句看过来,比看侦探小说还更有意思:lol
我们公司有一款产品,前人只留下了HEX文件,一直不稳定,虽然不大生产,但没法维修和升级。前阵子闲得蛋疼,反汇编出来,发现里面好多漏洞,原来的一个产品要用10片单片机,1万4千多行,我给改成了两片,7千行就搞定了,效果那是相当的好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

25

帖子

0

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