Авто конверт с асма в С для 68k

Тема в разделе "WASM.ASSEMBLER", создана пользователем kas1e, 9 июл 2009.

  1. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    Появилась необходимость перепесить немного ассемблерного кода на С под 68020 моторольные процы. Собственно асмовый код не особо большой, строк 400, но сидеть в ручную все это переписывать не вариант. Хотел сначала переписывать инстуркцию за инстуркцией (типа делать вызов асмовой функции сначала из С, потом из асма делать вызов Сишной функции в которой уже будут новые данные, которые уже потом брать с асма). Но както много багов, постоянно надо думать о сохранении того и там .. в общем было бы гуд заюзать какойнибудь примитивный и тупой конвертор который просто тупо все преобразует в Сишные лонги-инты и тд просто базируясь на инстуркциях).

    Поискал в инете, нашел 2 не бесплатных. Первый самый качественный: Relogix Assembler to C translator. На сайте есть пример как их тулза работает = было бы гуд такое заиметь себе.

    Второй вариант - ASM68k2C. Не знаю какой код он в итоге выдает по сравниению с Relogix, но мне даже самый примитив был бы норм (проще разбираться в месеве нелепых С команд, чем в месеве асма который чуть что сразу баги). Но пока в инете тоже не нашел.

    Был бы благодарен еслиб ктото или с тулзой помог найти где необходимую (напоминаю что проц не интел, и к x86 отношение все это никакого не имет, а только к 68к моторольным процам). На край можно идею о том как все это переписать, но имхо идей тут только 2: все с нуля на С написать, и как я попытаться инстуркцию за инстуркцией..
     
  2. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Плагин к Иде напиши который переведет асм в псевдокод на С.
     
  3. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    @tss
    Не вариант. Займет у меня кучу времени, долго, нудно, писать буду месяц (а то и больше), эти 400 строк такого гемора не стоят. К тому же в асмовую функцию передаются некоторые параметры, и на выходе берутся результаты и все это имеет ввиду что просто тупо преобразовать прсевдокод не прокатит, надо минимум будет забоится о стэке, о том как все это передается и берется и тд .. В общем написани плагина имхо будет тоже самое что и руками инструкцию за инструкцией переписать с багами и прочим .. Может еще какие идеи ?
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Самый примитивный вариант: написать функции mov(), add() и т.д. и завести переменные eax, ebx и т.д., после чего программа плавно превращается во что-то вроде
    mov (eax,123)
    sub (eax,ebx)
    call (lbl1)
    ...
     
  5. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    CyberManiac, если чесно не очень понял о чем речь. В твоем примере все плавно превращается в то что у меня и так уже есть :) Прикрепил сорец о котором речь. Входные данные это буффер и вершины (тоесть с сишного кода делать DrawObjecT(screenbuffer,object). Ассемблерные функции это тупо подсчет, провернуть матрицу и нарисовать линию. Сосбвтенно мне все это и надо на С ператащить. Но я не особо программер, поэтому хотелось бы какойто автоматизированной помощи которая решит проблемы со стэками, сохранениями, возвратами и тд.
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Попробуй в иде. Плагин для с-декомпиляции HexRays.
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Наврал.
     
  8. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    Punxer - в смысле наврал ? Вроде оно и есть что надо. Только хз будет ли оно с процами отличными от x86 работать или нет.
     
  9. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    Хотя на сайте вот вижу: Currently the decompiler supports 32bit x86 compiled generated code for the x86 processors.
     
  10. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    kas1e
    У тебя есть текст на ассемблере x86. А я предлагаю написать набор функций на языке Си для моторолы, и чтобы у этих функций имена совпадали с ассемблерными мнемониками:

    void mov (int32 a, int32 b); inline; { a=b; }

    Таким образом, бОльшая часть работы по переводу превращается в расстановку скобочек в файле "моя_прога.asm"? написание соответствующих функций и последющем переименовании асм-исходника в "моя_прога.c".
     
  11. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    CyberManiac, я наверно не особо правильно выразился. У меня и ассемблер и все остальное 68k. Т.е. переводить надо не x86 в 68k, а 68к ассемблер в С. Я так понимаю что ты предлагаешь пример чтобы из 86 асма зделать 68к асм используя С ? Мне тупо надо 68к асм в С перевести и все.

    Сейчас структура проги такая:

    Код (Text):
    1. c.c:
    2. main()
    3. {
    4.     call_asm_fucntion(aaaaa,bbbbb);
    5. }
    6.  
    7. asm.s:
    8.  
    9. _call_asm_function:
    10.    тут_ассемблер_пошел
    На данный момент я делаю такую кривоту:

    Код (Text):
    1. c.c:
    2.  
    3. void call_from_asm(void)
    4. {
    5.     iabalblablablab;
    6. }
    7.  
    8. main()
    9. {
    10.     call_asm_fucntion(aaaaa,bbbbb);
    11. }
    12.  
    13. asm.s:
    14.  
    15. _call_asm_function:
    16.           move #1, d0
    17.           move #2, d1
    18.           jsr call_from_asm
    19.            .....
    20.            .....
    И в функцию которую вызываю с асма ставлю например int i = 5; Функция вызывается, в стэк ложится значение, я после функции его вытаскиваю и ложу в регист в который оно ложилось. И так хочу инструкцию за инструкцией , но это гемор просто п..ец.
     
  12. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А нафига? У тебя же в комментариях пол-исходника готовый сишный код:
    Код (Text):
    1. * a0.l = where to store matrix                                                         *
    2. * d0.l = x angle << 16 | y angle                                                       *
    3. * d1.w = z angle                                                                       *
    4. *                                                                                      *
    5. *    --     --                                                                         *
    6. *    |a, b, c|                                                                         *
    7. *    |d, e, f|                                                                         *
    8. *    |g, h, i|                                                                         *
    9. *    --     --                                                                         *
    10. *                                                                                      *
    11. *    (ymatr*xmatr)*zmatr                                                               *
    12. *                                                                                      *
    13. *    tb=sin(ya)*sin(xa)                                                                *
    14. *    a=cost(yv)*cost(zv)-tb*sint(zv)                                                   *
    15. *    b=cost(yv)*-sint(zv)-tb*cost(zv)                                                  *
    16. *    c=-sint(yv)*cost(xv)                                                              *
    17. *    d=cost(xv)*sint(zv)                                                               *
    18. *    e=cost(xv)*cost(zv)                                                               *
    19. *    f=-sint(xv)                                                                       *
    20. *    th=cost(yv)*sint(xv)                                                              *
    21. *    g=sint(yv)*cost(zv)+th*sint(zv)                                                   *
    22. *    h=sint(yv)*-sint(zv)+th*cost(zv)                                                  *
    23. *    i=cost(yv)*cost(xv)                          
    24. ...
    25.         move.w  d3,d6                   ; NewY = y1 - x1 * (y2 - y1) / (x2 - x1)
    26. ...
    27.         moveq   #0,d0                   ; NewX = 0
    Просто посмотри на этот исходник с другого ракурса - комментарии сделай программой, а программу рассматривай как комментарий и по аналогии с тем что есть типа:
    Код (Text):
    1.         move.w  #127,d6                 ; NewY = (319 - x1) * (y2 - y1) / (x2 - x1) + y1
    2.         move.w  d3,d7
    3.         sub.w   d0,d6
    4.         sub.w   d1,d7
    5.         sub.w   d2,d0
    6.         muls.w  d7,d6
    7.         divs.w  d0,d6
    8.         sub.w   d6,d1
    доделай некоментированные части ;)
     
  13. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    @Y_Mur
    Ну собственно так и делаю, но хотелось бы какието неясные куски заменять инструкцию за инстуркцией. На данный момент мне надо както возращаться значения полученные в С куске, в Асм. Как я понимаю, когда я делаю допустим unsigned long i=5; в С , то переменная ложится в стэк. Однако потом при выходе из функции, стэк деаллоцируется, и всему тому что в стэке (переменным моим и тд) наступает аманга. Тоесть мне какимто образом нужно передавать мои данные в асм из С. Я так понимаю что функция return должна бы об этом заботиться, но както не понятно куда она все ложит. Допустим у меня есть:
    Код (Text):
    1. call_from_asm()
    2. {
    3. unsigned long a =5;
    4. unsigned long b =6;
    5. unsigned long c =7;
    6. }
    как в асм вернуть переменных значения ? return(a,b,c) ? Если да, то куда значения будут положены, в стэк , в регистры, или же в какойто из регистров адресс по которому будут лежать эти данные ? Дизасмный код с добавлением return(a,b,c); выглядит так:
    Код (Text):
    1. ...prologue...
    2. moveq  #05,d7
    3. moveq  #06,d6 ; разложили в регистры
    4. moveq  #07,d5
    5.  
    6. move.l d5,d0 ; return(a,b,c) - странно както. возвращается только ulong c в d0.
    7. ...epilogue...
    Собственно вопрос, как возвращать все данные ?
     
  14. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Во первых ретурн не функция, а скорее директива для возврата из функции, во вторых:
    return(a,b,c) - ??? что моторольный компилятор такое проглатывает? в первый раз вижу саму мысль о возврате функцией сразу трёх значений, совершенно не понимаю как можно практически использовать это в программах.
    Например x = r*sin(alpha), а если ф-я sin вдруг вернёт сразу 3 значения, то как енто использовать в формуле? ;))
    Я в моторольное программирование не лазил, но обычно разместить локальные переменные на стеке не проблема - резервируешь в нём место, посредством вычитания из указателя стека суммарного размера всех локальных переменных функции, а потом так же их и удаляешь, путём прибавления этого размера. Адресовать их можно как от вершины стека, так и от регистра указывающего на стековый кадр - асм всё это позволяет, а С обычно делает сам.
    А что в моторолле какието проблемы с глобальными переменными? В х86 их прекрасно видно и из С и из асм вставок. Да и локальные С переменные из асм вставок внутри той функции где они определены вполне доступны.
     
  15. kas1e

    kas1e New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    48
    Адрес:
    moskow
    @Y_Mur
    Да, ты прав про ретурн, я просто мало програмлю, и ретурн юзал всегда только аля return(TRUE), return(FALSE) и забыл уже 100 раз как и что и где :) На данный момент я стал делать так для возврата кучи переменных:

    Такого плана. Адрес возвращается в d0, и я в асмовом сорце делаю:

    Сейчас запара в том, что из за каждой новой строки я теряю кучу времени. То ULONG напишу, и это все портит, т.к. надо LONG, то в память пишу не так , как в асмовом сорце, то ищу как конретно какая инструкция работает .. корчое тупая рутинная работа , и именно поэтому хотелось бы какойнибудь авто конвертор. Мне даже знать как все это работает то не надо, просто нужно тупо скомпилять как С без асма и все. Пускай даже кишмиш будет а не читабельный код..