Появилась необходимость перепесить немного ассемблерного кода на С под 68020 моторольные процы. Собственно асмовый код не особо большой, строк 400, но сидеть в ручную все это переписывать не вариант. Хотел сначала переписывать инстуркцию за инстуркцией (типа делать вызов асмовой функции сначала из С, потом из асма делать вызов Сишной функции в которой уже будут новые данные, которые уже потом брать с асма). Но както много багов, постоянно надо думать о сохранении того и там .. в общем было бы гуд заюзать какойнибудь примитивный и тупой конвертор который просто тупо все преобразует в Сишные лонги-инты и тд просто базируясь на инстуркциях). Поискал в инете, нашел 2 не бесплатных. Первый самый качественный: Relogix Assembler to C translator. На сайте есть пример как их тулза работает = было бы гуд такое заиметь себе. Второй вариант - ASM68k2C. Не знаю какой код он в итоге выдает по сравниению с Relogix, но мне даже самый примитив был бы норм (проще разбираться в месеве нелепых С команд, чем в месеве асма который чуть что сразу баги). Но пока в инете тоже не нашел. Был бы благодарен еслиб ктото или с тулзой помог найти где необходимую (напоминаю что проц не интел, и к x86 отношение все это никакого не имет, а только к 68к моторольным процам). На край можно идею о том как все это переписать, но имхо идей тут только 2: все с нуля на С написать, и как я попытаться инстуркцию за инстуркцией..
@tss Не вариант. Займет у меня кучу времени, долго, нудно, писать буду месяц (а то и больше), эти 400 строк такого гемора не стоят. К тому же в асмовую функцию передаются некоторые параметры, и на выходе берутся результаты и все это имеет ввиду что просто тупо преобразовать прсевдокод не прокатит, надо минимум будет забоится о стэке, о том как все это передается и берется и тд .. В общем написани плагина имхо будет тоже самое что и руками инструкцию за инструкцией переписать с багами и прочим .. Может еще какие идеи ?
Самый примитивный вариант: написать функции mov(), add() и т.д. и завести переменные eax, ebx и т.д., после чего программа плавно превращается во что-то вроде mov (eax,123) sub (eax,ebx) call (lbl1) ...
CyberManiac, если чесно не очень понял о чем речь. В твоем примере все плавно превращается в то что у меня и так уже есть Прикрепил сорец о котором речь. Входные данные это буффер и вершины (тоесть с сишного кода делать DrawObjecT(screenbuffer,object). Ассемблерные функции это тупо подсчет, провернуть матрицу и нарисовать линию. Сосбвтенно мне все это и надо на С ператащить. Но я не особо программер, поэтому хотелось бы какойто автоматизированной помощи которая решит проблемы со стэками, сохранениями, возвратами и тд.
Punxer - в смысле наврал ? Вроде оно и есть что надо. Только хз будет ли оно с процами отличными от x86 работать или нет.
Хотя на сайте вот вижу: Currently the decompiler supports 32bit x86 compiled generated code for the x86 processors.
kas1e У тебя есть текст на ассемблере x86. А я предлагаю написать набор функций на языке Си для моторолы, и чтобы у этих функций имена совпадали с ассемблерными мнемониками: void mov (int32 a, int32 b); inline; { a=b; } Таким образом, бОльшая часть работы по переводу превращается в расстановку скобочек в файле "моя_прога.asm"? написание соответствующих функций и последющем переименовании асм-исходника в "моя_прога.c".
CyberManiac, я наверно не особо правильно выразился. У меня и ассемблер и все остальное 68k. Т.е. переводить надо не x86 в 68k, а 68к ассемблер в С. Я так понимаю что ты предлагаешь пример чтобы из 86 асма зделать 68к асм используя С ? Мне тупо надо 68к асм в С перевести и все. Сейчас структура проги такая: Код (Text): c.c: main() { call_asm_fucntion(aaaaa,bbbbb); } asm.s: _call_asm_function: тут_ассемблер_пошел На данный момент я делаю такую кривоту: Код (Text): c.c: void call_from_asm(void) { iabalblablablab; } main() { call_asm_fucntion(aaaaa,bbbbb); } asm.s: _call_asm_function: move #1, d0 move #2, d1 jsr call_from_asm ..... ..... И в функцию которую вызываю с асма ставлю например int i = 5; Функция вызывается, в стэк ложится значение, я после функции его вытаскиваю и ложу в регист в который оно ложилось. И так хочу инструкцию за инструкцией , но это гемор просто п..ец.
А нафига? У тебя же в комментариях пол-исходника готовый сишный код: Код (Text): * a0.l = where to store matrix * * d0.l = x angle << 16 | y angle * * d1.w = z angle * * * * -- -- * * |a, b, c| * * |d, e, f| * * |g, h, i| * * -- -- * * * * (ymatr*xmatr)*zmatr * * * * tb=sin(ya)*sin(xa) * * a=cost(yv)*cost(zv)-tb*sint(zv) * * b=cost(yv)*-sint(zv)-tb*cost(zv) * * c=-sint(yv)*cost(xv) * * d=cost(xv)*sint(zv) * * e=cost(xv)*cost(zv) * * f=-sint(xv) * * th=cost(yv)*sint(xv) * * g=sint(yv)*cost(zv)+th*sint(zv) * * h=sint(yv)*-sint(zv)+th*cost(zv) * * i=cost(yv)*cost(xv) ... move.w d3,d6 ; NewY = y1 - x1 * (y2 - y1) / (x2 - x1) ... moveq #0,d0 ; NewX = 0 Просто посмотри на этот исходник с другого ракурса - комментарии сделай программой, а программу рассматривай как комментарий и по аналогии с тем что есть типа: Код (Text): move.w #127,d6 ; NewY = (319 - x1) * (y2 - y1) / (x2 - x1) + y1 move.w d3,d7 sub.w d0,d6 sub.w d1,d7 sub.w d2,d0 muls.w d7,d6 divs.w d0,d6 sub.w d6,d1 доделай некоментированные части
@Y_Mur Ну собственно так и делаю, но хотелось бы какието неясные куски заменять инструкцию за инстуркцией. На данный момент мне надо както возращаться значения полученные в С куске, в Асм. Как я понимаю, когда я делаю допустим unsigned long i=5; в С , то переменная ложится в стэк. Однако потом при выходе из функции, стэк деаллоцируется, и всему тому что в стэке (переменным моим и тд) наступает аманга. Тоесть мне какимто образом нужно передавать мои данные в асм из С. Я так понимаю что функция return должна бы об этом заботиться, но както не понятно куда она все ложит. Допустим у меня есть: Код (Text): call_from_asm() { unsigned long a =5; unsigned long b =6; unsigned long c =7; } как в асм вернуть переменных значения ? return(a,b,c) ? Если да, то куда значения будут положены, в стэк , в регистры, или же в какойто из регистров адресс по которому будут лежать эти данные ? Дизасмный код с добавлением return(a,b,c); выглядит так: Код (Text): ...prologue... moveq #05,d7 moveq #06,d6 ; разложили в регистры moveq #07,d5 move.l d5,d0 ; return(a,b,c) - странно както. возвращается только ulong c в d0. ...epilogue... Собственно вопрос, как возвращать все данные ?
Во первых ретурн не функция, а скорее директива для возврата из функции, во вторых: return(a,b,c) - ??? что моторольный компилятор такое проглатывает? в первый раз вижу саму мысль о возврате функцией сразу трёх значений, совершенно не понимаю как можно практически использовать это в программах. Например x = r*sin(alpha), а если ф-я sin вдруг вернёт сразу 3 значения, то как енто использовать в формуле? ) Я в моторольное программирование не лазил, но обычно разместить локальные переменные на стеке не проблема - резервируешь в нём место, посредством вычитания из указателя стека суммарного размера всех локальных переменных функции, а потом так же их и удаляешь, путём прибавления этого размера. Адресовать их можно как от вершины стека, так и от регистра указывающего на стековый кадр - асм всё это позволяет, а С обычно делает сам. А что в моторолле какието проблемы с глобальными переменными? В х86 их прекрасно видно и из С и из асм вставок. Да и локальные С переменные из асм вставок внутри той функции где они определены вполне доступны.
@Y_Mur Да, ты прав про ретурн, я просто мало програмлю, и ретурн юзал всегда только аля return(TRUE), return(FALSE) и забыл уже 100 раз как и что и где На данный момент я стал делать так для возврата кучи переменных: Такого плана. Адрес возвращается в d0, и я в асмовом сорце делаю: Сейчас запара в том, что из за каждой новой строки я теряю кучу времени. То ULONG напишу, и это все портит, т.к. надо LONG, то в память пишу не так , как в асмовом сорце, то ищу как конретно какая инструкция работает .. корчое тупая рутинная работа , и именно поэтому хотелось бы какойнибудь авто конвертор. Мне даже знать как все это работает то не надо, просто нужно тупо скомпилять как С без асма и все. Пускай даже кишмиш будет а не читабельный код..