Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.06.2009, 21:46   #1
Archiserafim
 
Регистрация: 11.05.2009
Сообщений: 8
По умолчанию Из паскаля в ассемблер

Доброго времени суток.
Не могли бы вы мне помочь с кодом на ассемблере? т.к. с ним пока не очень дружу. Есть код на паскале, как он будет выглядеть на ассемблере?
Код:
Const
    A:Array [1..22] Of Char = ('1','H','e','l','l','o','2','W','o','r','l','d','3','I','4','R','u','s','l','a','n','5');

Var CountWord:Byte;
    I:Byte;
    LongWord:String;
    Flag:byte;
    TempWord:String;

Begin

  CountWord:=0;
  LongWord:='';
  Flag:=0;
  TempWord:='';

  For I:=1 To 22 Do
   Begin

    If A[I] In ['0'..'9'] Then
     Begin
      If Flag = 1 Then
       Begin
        Inc(CountWord);
        If Length(TempWord) > Length(LongWord) Then LongWord:=TempWord;
        Flag:=0;
       End;
      TempWord:='';
     End

      Else

     Begin
      Flag:=1;
      TempWord:=TempWord+A[I];
     End;

   End;
  WriteLn('Count Word: ',CountWord);
  WriteLn('Long Word: ',LongWord);
  readln;
End.
Archiserafim вне форума Ответить с цитированием
Старый 22.06.2009, 03:20   #2
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Наверно это не лучший ответ, но он подойдёт для любой программы, а не только для этой. Вобщем окомпилировать, потом открыть под IDA (дизассемблер) и найти ваши (а не те что повставлял компилятор) процедуры.
BaronTreep вне форума Ответить с цитированием
Старый 22.06.2009, 09:19   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Вобщем окомпилировать, потом открыть под IDA (дизассемблер) и найти ваши (а не те что повставлял компилятор) процедуры.
BaronTreep, а скажите честно, Вы лично хотя бы РАЗ так делали?! Дело в том, что компилятор туда насуёт ТАКОГО, что легче с нуля переписать... имхо, разумеется..

Примечания.
1) для TurboPascal ситуация с прозрачностью/наглядностью кода будет намного лучше, чем под Windows...
2) какие-то отдельные моменты реализации можно и подсмотреть в полученом exe-шнике...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.06.2009, 16:26   #4
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Цитата:
а скажите честно, Вы лично хотя бы РАЗ так делали?
Говорю положа руку на сердце)) Последнее время делаю ЭТО все чаще и чаще). В том то и дело, что компилятор пишет много ТАКОГО, и хорошо бы знать, что он пишет, чтобы лучше понимать язык, как ЭТО всё работает. Например считается, что в С первая функция это main или winmain, тем не менее компилятор первой вызывает свою специальную функцию start, а потом уже другие.

IDA достаточно умна, поэтому найти нужную процедуру в ней - нетрудно, в dll даже экспортные имена прописывает, а вот арифметические операции, условия и циклы в этих процедурах записаны вполне аутентично и можно по ним даже ассамблер учить.

Ещё она (IDA) по любом пишет имена всех API и импортных функций, поэтому цепочку-логику работы проследить тоже нетрудно.

По дизасму я читал Криса Касперского - "Искусство Дизвсамблера" и "Фундаментальные основы Хакерства". Довольно интересно.
BaronTreep вне форума Ответить с цитированием
Старый 22.06.2009, 17:01   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
тем не менее компилятор первой вызывает свою специальную функцию start
Дык это везде так...
Серж имеет ввиду то что скажем WriteLn('Count Word: ',CountWord); будет в асме не Врительном а обращение к прерыванию,+ подготовка к этому данных. Так что для автора это будет скорее всего непросто понять.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.06.2009, 17:19   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Спасибо, Виталий.
Да, именно так.
вот, чтобы не быть голословным.
всего одна (25-я) строчка из вышеупомянутого кода:

Код:
PROGRAM.25:          If Length(TempWord) > Length(LongWord) Then LongWord:=TempWord;
  cs:006A A06C01         mov    al,[PROGRAM.TEMPWORD]
  cs:006D 3A066A00       cmp    al,[PROGRAM.LONGWORD]
  cs:0071 7612           jbe    PROGRAM.26 (0085)
  cs:0073 BF6C01         mov    di,016C
  cs:0076 1E             push   ds
  cs:0077 57             push   di
  cs:0078 BF6A00         mov    di,006A
  cs:007B 1E             push   ds
  cs:007C 57             push   di
  cs:007D 68FF00         push   00FF
  cs:0080 9A46079F55     call   559F:0746
p.s. хотя некоторые вещи действительно, достаточно прозрачно реализованы.
например, мне понравился вот этот участок кода:
Код:
PROGRAM.20:  If A[i] In ['0'..'9'] Then
  cs:004C►A06900         mov    al,[PROGRAM.I]
  cs:004F 30E4           xor    ah,ah
  cs:0051 8BF8           mov    di,ax
  cs:0053 8A850100       mov    al,[di+0001]
  cs:0057 3C30           cmp    al,30
  cs:0059 7236           jb     PROGRAM.34 (0091)
  cs:005B 3C39           cmp    al,39
  cs:005D 7732           ja     PROGRAM.34 (0091)
я думал будет гораздо хуже...


ДОБАВЛЕНО.
а вот как будет выглядеть кусочек кода, о котором говорил Виталий:

Код:
PROGRAM.39:  WriteLn('Count Word: ',CountWord);
  cs:00D9 BF6C03         mov    di,036C
  cs:00DC 1E             push   ds
  cs:00DD 57             push   di
  cs:00DE BF0000         mov    di,0000
  cs:00E1 0E             push   cs
  cs:00E2 57             push   di
  cs:00E3 6A00           push   0000
  cs:00E5 9A70069F55     call   559F:0670
  cs:00EA A06800         mov    al,[PROGRAM.COUNTWORD]
  cs:00ED 30E4           xor    ah,ah
  cs:00EF 31D2           xor    dx,dx
  cs:00F1 52             push   dx
  cs:00F2 50             push   ax
  cs:00F3 6A00           push   0000
  cs:00F5 9AF8069F55     call   559F:06F8
  cs:00FA 9ADD059F55     call   559F:05DD
  cs:00FF 9A91029F55     call   559F:0291

Последний раз редактировалось Serge_Bliznykov; 22.06.2009 в 17:24.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 22.06.2009, 20:55   #7
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Ну вот видете, всё кроме WriteLn оптимально. Учтем ещё, что в реальном приложении скорее всего будет вместо него какая-нибудь 'MessageBoxA'.

(. Переводом кода в ассамблер компилятор заниматся должен)
BaronTreep вне форума Ответить с цитированием
Старый 28.06.2009, 20:21   #8
Archiserafim
 
Регистрация: 11.05.2009
Сообщений: 8
По умолчанию

Спасиб за отрывки кода.
BaronTreep
компилятор не может перевести этот код на асму.
Archiserafim вне форума Ответить с цитированием
Старый 28.06.2009, 22:19   #9
Archiserafim
 
Регистрация: 11.05.2009
Сообщений: 8
По умолчанию

BaronTreep
а не могли бы вы весь код выложить, как он будет выглядеть на асме?
Archiserafim вне форума Ответить с цитированием
Старый 30.06.2009, 09:30   #10
goblinyara
Форумчанин
 
Аватар для goblinyara
 
Регистрация: 02.01.2009
Сообщений: 340
По умолчанию

Цитата:
Сообщение от Archiserafim Посмотреть сообщение
компилятор не может перевести этот код на асму.
ого... а процессор что, читает паскалевские исходники?

весь смысл компилирования - перевод с языка высокого уровня на машинный язык... а ассемблер - это тот же самый машинный язык, только в удобоваримом для человека формате
DelphiWorld 6. Скачай, поставь, и будет тебе счастье=)
Программирование, как и любовь -- одно слово, за которым скрывается бесконечное множество занятий.
goblinyara вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сканнер Паскаля nusik Общие вопросы C/C++ 4 24.04.2009 23:04
Интерпретатор Паскаля SvetickPro Помощь студентам 1 17.10.2008 22:00
Русификация паскаля Exact Паскаль, Turbo Pascal, PascalABC.NET 7 21.03.2008 14:15
Настройка паскаля Snake_ua Паскаль, Turbo Pascal, PascalABC.NET 7 18.10.2007 17:56
перенос с паскаля на си Ядовитый Общие вопросы C/C++ 2 29.06.2007 13:17