打印

求助啊~汇编不会编~

[复制链接]
3437|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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其实没啥区别,都是用来描述问题的。楼主难是难在不知道汇编指令,不知道单片机内核结构,要补这部分的课。

使用特权

评论回复
5
gx_huang| | 2012-3-21 20:18 | 只看该作者
对于从来没有搞过汇编的,就难了。
我刚学的时候,把别人的单板机监控程序活生生的反汇编,自然就精通了。

使用特权

评论回复
6
spirits_hyx|  楼主 | 2012-3-21 20:57 | 只看该作者
4# NE5532
是啊,原理都知道,就是不清楚汇编指令,哎,看来真得恶补一下啦~

使用特权

评论回复
7
spirits_hyx|  楼主 | 2012-3-21 21:03 | 只看该作者
3# tianheyun
其实,原理自己都清楚,就是从来没用过汇编,一直习惯C,只知道几个基本的代码~所以,汗颜了!

使用特权

评论回复
8
spirits_hyx|  楼主 | 2012-3-21 21:03 | 只看该作者
正是苦于不同汇编的代码啊~~~ 5# gx_huang

使用特权

评论回复
9
sunhq02| | 2012-3-22 08:30 | 只看该作者
你直接copy编译器的汇编结果, 然后人工优化一下就是了

使用特权

评论回复
10
刘前辈| | 2012-3-22 09:09 | 只看该作者
很简单。按照#2楼,用SRC命令即可。

NAME        TEST4

#include <reg52.inc>

?PR?scan_dats?TEST4  SEGMENT CODE
?C_INITSEG           SEGMENT CODE
?CO?TEST4            SEGMENT CODE
?DT?TEST4            SEGMENT DATA
        PUBLIC        position
        PUBLIC        data1
        PUBLIC        group
        PUBLIC        DAT_DIM
        PUBLIC        shift_code
        PUBLIC        scan_dats

        RSEG  ?DT?TEST4
        DAT_DIM:   DS   16
          group:   DS   1
          data1:   DS   1
       position:   DS   1

        RSEG  ?CO?TEST4
shift_code:
        DB        0FEH
        DB        0FDH
        DB        0FBH
        DB        0F7H
        DB        0EFH
        DB        0DFH
        DB        0BFH
        DB        07FH
        DB        0FEH
        DB        0FDH
        DB        0FBH
        DB        0F7H
        DB        0EFH
        DB        0DFH
        DB        0BFH
        DB        07FH


        RSEG  ?C_INITSEG
        DB        010H
        DB        DAT_DIM
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        000H
        DB        088H


;
; typedef unsigned char uchar;
;
; uchar group, position,data1;
;
; 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)

        RSEG  ?PR?scan_dats?TEST4
scan_dats:
        USING        0
                        
;---- Variable 'j?041' assigned to Register 'R7' ----
;---- Variable 'temp?042' assigned to Register 'R6' ----
; {
                        
;     uchar i,j,temp ;
; P1 = 0xff;                        
        MOV          P1,#0FFH
; P2 = 0xff;                        
        MOV          P2,#0FFH                           
; for(i=0; i<8; i++)              
                        
;---- Variable 'i?040' assigned to Register 'R5' ----
        CLR          A
        MOV          R5,A
?C0001:
; {                        
;   P1 = shift_code;
                        
        MOV          A,R5
        MOV          DPTR,#shift_code
        MOVC         A,@A+DPTR
        MOV          P1,A
;   DAT_DIM = ~P3;                        
        MOV          A,P3
        CPL          A
        MOV          R4,A
        MOV          A,#LOW (DAT_DIM)
        ADD          A,R5
        MOV          R0,A
        MOV          @R0,AR4
;   P1 |=  0xff;                        
        MOV          P1,#0FFH
;   if(DAT_DIM!=0xff)
                        
        MOV          A,#LOW (DAT_DIM)
        ADD          A,R5
        MOV          R0,A
        MOV          A,@R0
        MOV          R4,A
        CPL          A
        JZ           ?C0003
;   {                        
;    temp = DAT_DIM;                        
        MOV          R6,AR4
;    group = i;                        
        MOV          group,R5
;    for(j=1; j<9; j++)                        
        MOV          R7,#01H
?C0005:
;    {                        
;     if((temp & 0x01) == 0)                        
        JB           ACC.0,?C0008
;     {                        
;      position = j;                        
        MOV          position,R7
;      break;
                        
        SJMP         ?C0003
;     }                        
?C0008:
;     else temp = temp >> 1;                        
        MOV          A,R6
        CLR          C
        RRC          A
        MOV          R6,A
;    }                 
?C0007:
        INC          R7
        CJNE         R7,#09H,?C0005
;   }                 
; }  
                        
?C0003:
        INC          R5
        CJNE         R5,#08H,?C0001
?C0002:
; for(i=8; i<16; i++)
        MOV          R5,#08H
?C0010:
; {                           
;    P2 = shift_code;                        
        MOV          A,R5
        MOV          DPTR,#shift_code
        MOVC         A,@A+DPTR
        MOV          P2,A
;       DAT_DIM = ~P3;
                        
        MOV          A,P3
        CPL          A
        MOV          R4,A
        MOV          A,#LOW (DAT_DIM)
        ADD          A,R5
        MOV          R0,A
        MOV          @R0,AR4
;    P2 |=  0xff;
                        
        MOV          P2,#0FFH
;      if(DAT_DIM!=0xff)
                        
        MOV          A,#LOW (DAT_DIM)
        ADD          A,R5
        MOV          R0,A
        MOV          A,@R0
        MOV          R4,A
        CPL          A
        JZ           ?C0012
;    {  
                        
;      temp = DAT_DIM;
                        
        MOV          R6,AR4
;     group = i;
               
        MOV          group,R5
;     for(j=1; j<9; j++)
                        
        MOV          R7,#01H
?C0014:
;     {
                        
;      if((temp & 0x01) == 0)
                        
        MOV          A,R6
        JB           ACC.0,?C0017
;      {                        
;       position = j;
                        
        MOV          position,R7
;       break;                        
        SJMP         ?C0012
;      }
                        
?C0017:
;     else temp = temp >> 1;                        
        MOV          A,R6
        CLR          C
        RRC          A
        MOV          R6,A
;     }                        
?C0016:
        INC          R7
        CJNE         R7,#09H,?C0014
;    }                        
; }                        
?C0012:
        INC          R5
        CJNE         R5,#010H,?C0010
?C0011:
; data1 = group*8+position;  
                        
        MOV          A,group
        MOV          B,#08H
        MUL          AB
        ADD          A,position
        MOV          data1,A
; }
               
        RET         
; END OF scan_dats

        END



、、

使用特权

评论回复
11
yewuyi| | 2012-3-22 09:17 | 只看该作者
吃饭会不会?

使用特权

评论回复
12
icecut| | 2012-3-22 09:18 | 只看该作者
刘前辈的代码还算很好.和手写差不多了....可以直接用了

使用特权

评论回复
13
xwj| | 2012-3-22 10:25 | 只看该作者
哈哈,本来就是自动生成的。

Keil对51的优化还是不错的,毕竟做了这么多年了。

使用特权

评论回复
14
spirits_hyx|  楼主 | 2012-3-22 23:10 | 只看该作者
谢谢楼上的点拨,虽然有人贬,但是承认自己确实不会,如果有机会还是要学学汇编的。一步一步补上来,充实下自己,继续前行。

使用特权

评论回复
15
刘前辈| | 2012-3-23 09:18 | 只看该作者
学C恐怕一辈子也学不到头,还要回头学汇编?人都是往前走的。

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

想接招吗?

、、

使用特权

评论回复
16
spirits_hyx|  楼主 | 2012-3-30 22:30 | 只看该作者
呵呵,前辈出招吧,我会尽力去做,但是估计希望不大,抱有一颗学习的心态,我C语言也是入门级的,只是需要时间的精确控制才想到了汇编。 15# 刘前辈

使用特权

评论回复
17
刘前辈| | 2012-3-31 08:53 | 只看该作者
等我。

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

、、

使用特权

评论回复
18
spirits_hyx|  楼主 | 2012-3-31 21:31 | 只看该作者
好的,愿意学习,嘿嘿,在实战中锻炼自己,前辈有空就给我出出题目。 17# 刘前辈

使用特权

评论回复
19
刘前辈| | 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";

则:输出结果字符序列:

//

使用特权

评论回复
20
受不了了| | 2012-4-1 11:07 | 只看该作者
对于从来没有搞过汇编的,就难了。
我刚学的时候,把别人的单板机监控程序活生生的反汇编,自然就精通了。
gx_huang 发表于 2012-3-21 20:18

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

使用特权

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

本版积分规则

0

主题

25

帖子

0

粉丝