Thông báo

Collapse
No announcement yet.

Giúp dịch code C sang asm

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Giúp dịch code C sang asm

    Bạn nào biết dịch từ C sang asm thì giúp mình nha, mình đang cần để làm đồ án. Thansk
    Đây là code C:

    #include<reg52.h>
    sbit DATA1 = P2^7;
    sbit SCK1 = P2^6;
    sbit LACH1 = P2^5;
    sbit set=P3^5;
    sbit up=P3^6;
    sbit down=P3^7;

    sbit sdi1 = P3^1;
    sbit str1 = P3^2;
    sbit clk1 = P3^0;
    unsigned char m1[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
    unsigned char m2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
    unsigned char m3[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};


    unsigned char hour, minute, second,c;
    unsigned char ma[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x9 0};
    unsigned char kt=0,a=0,i,k,x=0;
    bit set0=1,set1=1,up1=1,up0=1,down0=1,down1=1;
    sbit SCL = P1^0;
    sbit SDA = P1^1;
    void delay(){
    unsigned char i;
    for (i = 0; i < 4; i++){};
    }

    //-----------------------------------------
    void SCL_high(){
    SCL = 1;
    delay();
    }

    //------------------------------------------
    void SCL_low(){
    SCL = 0;
    delay();
    }

    //-------------------------------------------
    void I2C_Start(){
    SDA = 1;
    SCL = 1;
    SDA = 0;
    delay();
    SCL = 0;
    SDA = 1;
    }

    //--------------------------------------------
    void I2C_Stop(){
    SDA = 0;
    SCL_high();
    SDA = 1;
    }

    //----------------------------------------------
    bit I2C_Write(unsigned char dat){
    unsigned char i;
    bit outbit;
    for (i = 1; i <= 8; i++){
    outbit=dat&0x80;
    SDA = outbit;
    dat = dat << 1;
    SCL_high();
    SCL_low();
    }
    SDA = 1;
    SCL_high();
    outbit = SDA;
    SCL_low();
    return(outbit);
    }

    //----------------------------------------------------
    unsigned char I2C_Read(bit ack){
    unsigned char i, dat;
    bit inbit;

    dat = 0;
    for(i=1;i<=8;i++) {
    SCL_high();
    inbit = SDA;
    dat = dat << 1;
    dat = dat | inbit;
    SCL_low();
    }
    if (ack) SDA = 0;
    else SDA = 1;
    SCL_high();
    SCL = 0;
    SDA = 1;
    delay();
    return(dat);
    }

    //-------------------------------------------------------------
    void rtc_write(unsigned char add, unsigned char dat){
    I2C_Start();
    I2C_Write(0xd0);
    I2C_Write(add);
    I2C_Write(((dat/10)<<4)|(dat%10));
    I2C_Stop();
    }

    unsigned char rtc_read(unsigned char add){
    unsigned char dat;
    I2C_Start();
    I2C_Write(0xd0);
    I2C_Write(add);
    I2C_Start();
    I2C_Write(0xd1);
    dat = I2C_Read(0);
    I2C_Stop();
    dat = (dat & 0x0f) + (dat>>4)*10;
    return (dat);
    }
    void writeds(){
    rtc_write(0x00, second);
    rtc_write(0x01, minute);
    rtc_write(0x02, hour);
    }

    void readds()
    {
    if(kt==0)
    {
    if(a==1)
    {writeds();a=0;
    }
    second = rtc_read(0x00);
    minute = rtc_read(0x01);
    hour = rtc_read(0x02);
    }
    }

    void hienthi(unsigned char x)
    {
    unsigned int i,temp;
    for(i=0;i<8;i++)
    {
    temp=x;
    temp=temp&0x80;
    if(temp==0x80)
    DATA1=1;
    else
    DATA1=0;
    x*=2;
    SCK1=0;
    SCK1=1;
    }
    }
    void quetled()
    {

    if(kt==0)
    {
    hienthi(ma[second%10]);
    hienthi(ma[second/10]);
    hienthi(ma[minute%10]);
    hienthi(ma[minute/10]);
    hienthi(ma[hour%10]);
    hienthi(ma[hour/10]);
    LACH1=0;
    LACH1=1;
    }
    if(kt==1)
    {
    hienthi(0xff);
    hienthi(0xff);
    hienthi(0xff);
    hienthi(0xff);
    hienthi(ma[hour%10]);
    hienthi(ma[hour/10]);
    LACH1=0;
    LACH1=1;
    }
    if(kt==2)
    {
    hienthi(0xff);
    hienthi(0xff);
    hienthi(ma[minute%10]);
    hienthi(ma[minute/10]);
    hienthi(0xff);
    hienthi(0xff);
    LACH1=0;
    LACH1=1;
    }
    if(kt==3)
    {
    hienthi(ma[second%10]);
    hienthi(ma[second/10]);
    hienthi(0xff);
    hienthi(0xff);
    hienthi(0xff);
    hienthi(0xff);
    LACH1=0;
    LACH1=1;
    }
    }
    void ktphim()
    {
    set0=set1;set1=set;
    if((set0==1)&&(set1==0))
    {
    kt++;
    if(kt>3)kt=0;
    }
    switch(kt)
    {
    case 0:break;
    case 1:
    {
    up0=up1;up1=up; a=1;
    if((up0==1)&&(up1==0))
    {
    hour++;
    if(hour>23)hour=0;
    }
    down0=down1;down1=down;
    if((down0==1)&&(down1==0))
    {
    hour--;
    if(hour==-1)
    hour=23;
    }
    break;
    }
    case 2:
    {
    up0=up1;up1=up; a=1;
    if((up0==1)&&(up1==0))
    {
    minute++;
    if(minute>59)
    minute=0;
    }
    down0=down1;down1=down;
    if((down0==1)&&(down1==0))
    {
    minute--;
    if(minute==-1)
    minute=59;
    }
    break;
    }

    case 3:
    {
    up0=up1;up1=up;a=1;
    if((up0==1)&&(up1==0))
    {
    second++;
    if(second>59)
    second++;
    }
    down0=down1;down1=down;
    if((down0==1)&&(down1==0))
    {
    second=0;
    }
    break;
    }
    }
    }

    void ghi_dich(unsigned char t1,unsigned char t2,unsigned char t3,unsigned char t4,unsigned char t5,unsigned char t6,unsigned char t7,unsigned char t8)
    {unsigned char i,Q;
    Q=t8; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    Q=t7; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    Q=t6; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    Q=t5; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    Q=t4; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    Q=t3; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    Q=t2; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    Q=t1; for(i=0;i<8;i++){sdi1=(Q&0x01)?1:0;clk1=1;clk1=0;Q >>=1; }
    str1=0; str1=1;
    }
    void sosanh(unsigned char gia_tri)
    {unsigned char k1,k2,k3;
    k1=0;k2=m1[gia_tri%8];k3=0xff;
    if((gia_tri>=0)&&(gia_tri<8)) ghi_dich(k2,k3,k3,k3,k3,k3,k3,k3);
    if((gia_tri>=8)&&(gia_tri<16)) ghi_dich(k1,k2,k3,k3,k3,k3,k3,k3);
    if((gia_tri>=16)&&(gia_tri<24))ghi_dich(k1,k1,k2,k 3,k3,k3,k3,k3);
    if((gia_tri>=24)&&(gia_tri<32))ghi_dich(k1,k1,k1,k 2,k3,k3,k3,k3);
    if((gia_tri>=32)&&(gia_tri<40))ghi_dich(k1,k1,k1,k 1,k2,k3,k3,k3);
    if((gia_tri>=40)&&(gia_tri<48))ghi_dich(k1,k1,k1,k 1,k1,k2,k3,k3);
    if((gia_tri>=48)&&(gia_tri<56))ghi_dich(k1,k1,k1,k 1,k1,k1,k2,k3);
    if((gia_tri>=56)&&(gia_tri<60))ghi_dich(k1,k1,k1,k 1,k1,k1,k1,k2);
    }

    void main()
    {
    I2C_Start();
    I2C_Write(0xD0);
    I2C_Write(0x07);
    I2C_Write(0x10);
    I2C_Stop();
    while(1)
    {
    ktphim();
    readds();
    quetled();
    sosanh(second);
    }
    }
    Nhận vẽ mạch in ^_^
    TEL: 0167 4500 365
    Mail:

  • #2
    Bạn có xài Keil C ko, bạn tạo một project trong C rồi tạo file soạn thảo C. Sau đó bạn copy hết đoạn code trên vào đó và ấn F7 -> dịch sang file hex. Xong rồi bạn Debug (Ctrl + F5). Trong phần debuf đó bạn sẽ thấy có vài khung, nhưng có 2 khung bạn cần. Đó là khung chứa nội dung code mà bạn copy hồi nãy, và khung kia tên là Disaseembly (hình như thế). Trong khung đó nó sẽ ghi cho bạn từng đoạn code C, dưới mỗi đoạn code C là mã ASM tương ứng với đoạn code C đó. Như thế bạn sẽ dễ hiểu mỗi đoạn code C sẽ dịch ra asm như thế nào, đồng thời bạn có thể copy hết nội dung asm trong đó ra. Thế là có code asm mà bạn đang cần.


    Trong Keil C, mấy cái code asm đó nó dịch ra khá dài dòng, cho nên trước khi nhấn F7 để tạo file hex, bạn nên chọn Optimizer ở mức 9 (maximum đó), đồng thời chọn ở khung phía dưới là Size (sr mình đang onl ngoài tiệm net nên chẳng có vũ khí nào trong máy tính hết, nhớ sao viết vậy). Sau đó bạn cứ F7, khi đó dung lượng code của bạn sẽ thấp hơn, code asm cũng dễ hiểu hơn vì nó đã được thiết lập là cố gắng nén cho dung lượng code thật nhỏ bằng cách dùng chương trình con (sub-routine). Có lẽ bạn biết đường vào phần Optimizer mà he, nếu ko thì google(onl tiệm nên ko có keil nên ko coi cụ thể đc)

    Trong Keil C, code asm được dịch ra hơi khó nhìn ở chỗ tên của mấy chương trình con dùng để rẽ nhánh(sau mấy cái lệnh xJMP, djnz, cjne, jb,jnb...v.v... nói chung là lệnh rẽ nhánh), cho nên bạn ráng đọc rồi tìm vị trí mà nó muốn rẽ tới và sửa tên lại sao cho bạn dễ hiểu là đc(nếu cần).

    Hình như code này xử lý con DS1307 phải ko bạn!

    Comment


    • #3
      Có phần cứng đọc còn mệt huống chi là chỉ có 1 cái code C. Có phần cứng, hiểu phần cứng hoạt động ra sao, sau đó đọc phần mềm của người ta, viết lưu đồ giải thuật theo code C. Có lưu đồ giải thuật thì chế lại qua ASM. Có như thế thì khi sai mới biết chổ mà sửa. Còn trường hợp chỉ cần lấy code giông như ruột 89x thì là C, mà code là ASM để báo cáo thì bạn có thể tham khảo cách ở trên.

      Comment


      • #4
        thực sự mình chỉ thấy có dịch từ code ASM sang C thôi
        đây là lần đầu tiên mình gặp chuyển từ C sang ASM
        chắc thầy giáo bạn này bắt dùng ASM đây
        cách dễ nhất là bạn dịch ra file hex
        sau đó dùng dis8051 bạn sẽ có mã ASM

        Comment


        • #5
          Nguyên văn bởi kidteam Xem bài viết
          thực sự mình chỉ thấy có dịch từ code ASM sang C thôi
          đây là lần đầu tiên mình gặp chuyển từ C sang ASM
          chắc thầy giáo bạn này bắt dùng ASM đây
          cách dễ nhất là bạn dịch ra file hex
          sau đó dùng dis8051 bạn sẽ có mã ASM
          Dis8051 là phần mềm gì vậy bạn, bạn hướng dẫn cụ thể cho mình được không?. Do trường mình chỉ dạy Asm thôi nên gặp C bó tay
          Nhận vẽ mạch in ^_^
          TEL: 0167 4500 365
          Mail:

          Comment


          • #6
            Nguyên văn bởi 4rev Xem bài viết
            Bạn có xài Keil C ko, bạn tạo một project trong C rồi tạo file soạn thảo C. Sau đó bạn copy hết đoạn code trên vào đó và ấn F7 -> dịch sang file hex. Xong rồi bạn Debug (Ctrl + F5). Trong phần debuf đó bạn sẽ thấy có vài khung, nhưng có 2 khung bạn cần. Đó là khung chứa nội dung code mà bạn copy hồi nãy, và khung kia tên là Disaseembly (hình như thế). Trong khung đó nó sẽ ghi cho bạn từng đoạn code C, dưới mỗi đoạn code C là mã ASM tương ứng với đoạn code C đó. Như thế bạn sẽ dễ hiểu mỗi đoạn code C sẽ dịch ra asm như thế nào, đồng thời bạn có thể copy hết nội dung asm trong đó ra. Thế là có code asm mà bạn đang cần.


            Trong Keil C, mấy cái code asm đó nó dịch ra khá dài dòng, cho nên trước khi nhấn F7 để tạo file hex, bạn nên chọn Optimizer ở mức 9 (maximum đó), đồng thời chọn ở khung phía dưới là Size (sr mình đang onl ngoài tiệm net nên chẳng có vũ khí nào trong máy tính hết, nhớ sao viết vậy). Sau đó bạn cứ F7, khi đó dung lượng code của bạn sẽ thấp hơn, code asm cũng dễ hiểu hơn vì nó đã được thiết lập là cố gắng nén cho dung lượng code thật nhỏ bằng cách dùng chương trình con (sub-routine). Có lẽ bạn biết đường vào phần Optimizer mà he, nếu ko thì google(onl tiệm nên ko có keil nên ko coi cụ thể đc)

            Trong Keil C, code asm được dịch ra hơi khó nhìn ở chỗ tên của mấy chương trình con dùng để rẽ nhánh(sau mấy cái lệnh xJMP, djnz, cjne, jb,jnb...v.v... nói chung là lệnh rẽ nhánh), cho nên bạn ráng đọc rồi tìm vị trí mà nó muốn rẽ tới và sửa tên lại sao cho bạn dễ hiểu là đc(nếu cần).

            Hình như code này xử lý con DS1307 phải ko bạn!
            -Mình không có phần mềm Keil C, mình vẫn chưa hiểu bạn có hình minh hoạ không.
            -Đúng rồi bạn code này là của đồng hồ số sử dụng 89 và DS1307
            Nhận vẽ mạch in ^_^
            TEL: 0167 4500 365
            Mail:

            Comment


            • #7
              Bạn kidteam ấy nói "sau đó dùng dis8051 bạn sẽ có mã ASM" thì biết là soft đó có khả năng dịch C > ASM rùi, bạn minhthanh29 cứ việc google là có ngay mà vọc thôi (mình hum biết soft đó)

              Keil C thì google có một nùi đó, có cr..k luôn. Bạn ko hiểu gì cứ copy đoạn ko hiểu cho vào google là có thôi!

              Tui thấy cách của bạn binh_an_2012 có lý lắm đó, nhưng chủ topic chỉ học ASM chứ chưa học C thì coi như pó tej phần "viết lưu đồ giải thuật theo code C" rùi

              Thân!

              Comment


              • #8
                Nguyên văn bởi 4rev Xem bài viết
                Bạn kidteam ấy nói "sau đó dùng dis8051 bạn sẽ có mã ASM" thì biết là soft đó có khả năng dịch C > ASM rùi, bạn minhthanh29 cứ việc google là có ngay mà vọc thôi (mình hum biết soft đó)

                Keil C thì google có một nùi đó, có cr..k luôn. Bạn ko hiểu gì cứ copy đoạn ko hiểu cho vào google là có thôi!

                Tui thấy cách của bạn binh_an_2012 có lý lắm đó, nhưng chủ topic chỉ học ASM chứ chưa học C thì coi như pó tej phần "viết lưu đồ giải thuật theo code C" rùi

                Thân!
                Bạn đọc được C không giúp mình viết lưu đồ giải thuật, thanks
                Nhận vẽ mạch in ^_^
                TEL: 0167 4500 365
                Mail:

                Comment


                • #9
                  Bạn nói rõ hơn đi, giúp thì giúp cho chót
                  Nhận vẽ mạch in ^_^
                  TEL: 0167 4500 365
                  Mail:

                  Comment


                  • #10
                    Nguyên văn bởi kidteam Xem bài viết
                    thực sự mình chỉ thấy có dịch từ code ASM sang C thôi
                    đây là lần đầu tiên mình gặp chuyển từ C sang ASM
                    chắc thầy giáo bạn này bắt dùng ASM đây
                    cách dễ nhất là bạn dịch ra file hex
                    sau đó dùng dis8051 bạn sẽ có mã ASM

                    làm chi có dich được asm sang C. chỉ có C sang asm thì có
                    email:
                    chỉ được liên lạc từ 19h00 - 21h30



                    Comment


                    • #11
                      Nguyên văn bởi minhthanh29 Xem bài viết
                      Bạn đọc được C không giúp mình viết lưu đồ giải thuật, thanks
                      Để về mình ngâm thử xem. Mình cũng đang cần giao tiếp con ds1307 làm đồ chơi
                      Mà bạn có cái sơ đồ mạch ko, mình ko biết code này có phần cứng gì nên ko đảm bảo đc lưu đồ!

                      Thân!

                      Comment


                      • #12
                        Nguyên văn bởi sang_dientu Xem bài viết
                        làm chi có dich được asm sang C. chỉ có C sang asm thì có
                        Thì mình nhờ các bạn dịch giúp từ C sang asm mà
                        Nhận vẽ mạch in ^_^
                        TEL: 0167 4500 365
                        Mail:

                        Comment


                        • #13
                          Nguyên văn bởi 4rev Xem bài viết
                          Để về mình ngâm thử xem. Mình cũng đang cần giao tiếp con ds1307 làm đồ chơi
                          Mà bạn có cái sơ đồ mạch ko, mình ko biết code này có phần cứng gì nên ko đảm bảo đc lưu đồ!

                          Thân!
                          Bạn giúp mình nha, thanks
                          Click image for larger version

Name:	main.jpg
Views:	1
Size:	86.0 KB
ID:	1362649
                          Nhận vẽ mạch in ^_^
                          TEL: 0167 4500 365
                          Mail:

                          Comment


                          • #14
                            Nguyên văn bởi minhthanh29 Xem bài viết
                            Bạn giúp mình nha, thanks
                            [ATTACH=CONFIG]46484[/ATTACH]
                            Thiếu khúc dưới kìa bạn, khúc dưới có lẽ cũng là một mớ led với IC dịch, còn P1.0 với P1.1 nó mắc đi đâu thế?? SDA với SCL à!

                            Comment


                            • #15
                              Nguyên văn bởi 4rev Xem bài viết
                              Thiếu khúc dưới kìa bạn, khúc dưới có lẽ cũng là một mớ led với IC dịch, còn P1.0 với P1.1 nó mắc đi đâu thế?? SDA với SCL à!
                              Bạn xem lại file nay xem

                              Click image for larger version

Name:	main.jpg
Views:	1
Size:	74.1 KB
ID:	1362665
                              Nhận vẽ mạch in ^_^
                              TEL: 0167 4500 365
                              Mail:

                              Comment

                              Về tác giả

                              Collapse

                              minhthanh29 Tìm hiểu thêm về minhthanh29

                              Bài viết mới nhất

                              Collapse

                              Đang tải...
                              X