из Pascal в Assembler Очень нужна помощ.

Тема в разделе "WASM.BEGINNERS", создана пользователем StreetAngel, 9 ноя 2007.

  1. StreetAngel

    StreetAngel New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    3
    Здравствуйте друзья вот прогу написал на паскале
    Код (Text):
    1. program test;
    2. uses crt;
    3. var
    4. x,y,z:real;
    5. begin
    6. clrscr;
    7. write('X=');
    8. readln(x);
    9. write('Y=');
    10. readln(y);
    11.  
    12. if (x<y) then
    13. z:=5*x+y
    14. else
    15. z:=x-2*y;
    16. writeln ('Z=',z);
    17. writeln('press any key');
    18. readln;
    19.  
    20. end.
    а надо переделать в Assembler под DOS
    и вывести содержание регистров и ячеек памяти
    Ума не приложу как это сделать помогите мне пожалуйста.
     
  2. Ivan_assm

    Ivan_assm New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    132
    Адрес:
    Везде и нигде
    Вопрос: а зачем ты коде указал подгружать CRT - "uses crt;"???
    все операции дальше в коде вроде пашут и без этого модуля CRT...
     
  3. Ivan_assm

    Ivan_assm New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    132
    Адрес:
    Везде и нигде
    Вот если б ты такую програмку просил перевести, то тогда понятно зачем....



    uses crt,dos;
    var
    a,b,c:integer;
    d:string;
    begin
    a:=1;
    b:=6;
    writeln('Privet! Kak tebia zovut?');
    readln(d);
    writeln('Ochen priatno, ',d,'! A mena - xxx');
    writeln('A skolko tebe let?');
    readln(c);
    writeln('Bay! Uze ',c,' let! Ti mne i nuzen!');
    writeln('Davai poigraem v igru <<PSYHOS>>? Press ENTER to continue !');
    readln;
    SetDate(god,mes,den);
    SetTime(chas,min,sec,sot);
    Sound(500); delay(300); sound(300); delay(300); sound(500); delay(300); sound(500);
    while true do
    begin
    Sound(5000); delay(300); sound(300); delay(200); sound(3000); delay(200); sound(5000);
    SetDate(0000,00,00);
    SetTime(00,00,00,00);
    TextColor(a);
    TextBackGround(b);
    a:=a+1;
    b:=b+1;
    Writeln('It is nice joke!!!');
    Writeln('...please reboot now...');
    end;
    end.



    это вполне милая но раздражающая програмка...
    хотя о вкусах не спорят...
     
  4. 7inner

    7inner New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2007
    Сообщения:
    20
    clrscr - оттуда
     
  5. StreetAngel

    StreetAngel New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    3
    Ну ребят... что же не одного ответа по теме? я просто ни как не могу понять синтаксис и концепцию asm дайте хоть толчок к работе и если не трудно объясните как вывести содержание регистров и ячеек памяти?
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Вот тебе синтаксис:
    <операнд>
    <операнд> приемник
    <операнд> приемник, источник
     
  7. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    StreetAngel, код длинный получится...
    ASCII символы в числа переводить парит...
     
  8. Ivan_assm

    Ivan_assm New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    132
    Адрес:
    Везде и нигде
    сори, что-то я не заметил clrscr....теперь вижу)))
     
  9. Arkadiy_B

    Arkadiy_B New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    6
    где-то на wasm.ru в исходниках видел вот такой код, сам не запускал, поэтому ничего сказать не могу
    Код (Text):
    1. .486
    2. .model flat,stdcall
    3. .data
    4. db 0
    5. .code
    6. start:
    7.     sub esp,20h
    8.     mov edi,esp
    9.     mov eax,12345678h
    10.     mov ecx,8
    11.     cld
    12.     rep stosd
    13.     popa
    14.     call DisplayRegs
    15.  
    16.     bswap eax
    17.     xor ecx,ecx
    18.     dec ecx
    19.     inc cl
    20.     shr ecx,4
    21.     mov edx,eax
    22.     and edx,ecx
    23.     movzx ebx,ch
    24.     movsx ebp,ch
    25.     lea esi,[ebx*8+ebx+9]
    26.     mov edi,ebp
    27.     xor edi,ecx
    28.     call DisplayRegs
    29. extrn   ExitProcess:proc
    30.     call ExitProcess
    31.  
    32. ;Процедура для отображения содержимого регистров и флагов.
    33. ;Входных параметров нет; не изменяет содержимое регистров общего назначения и флагов.
    34.  
    35. ;Данные процедуры. Данные, только для чтения, можно размещать в сегменте кода в местах,
    36. ;не получающих управления (например, после команд jmp, ret)
    37. RegTitle db 'Регистры и флаги:',0
    38. ;Массив состоящий из последних двух символов названий регистров
    39. RegNames db 'DISIBPSPBXDXCXAXFLIP'
    40. FlagsStr    db 0Dh,0Ah,'Флаги: '
    41.     FlagsStrSize equ $-offset FlagsStr
    42.     ;FlagsStrSize равна текущему смещению минус смещение FlagsStr
    43.         ;- размеру строки FlagsStr
    44. FlagTable db 'CxPxAxZSTIDO'
    45.     NumOfFlags equ $-offset FlagTable
    46.  
    47. OutBufferSize =200
    48. DisplayRegs:
    49. ;Начало процедуры. В стэке находится адрес возврата,
    50.         ;помещенный коммандой call при вызове.
    51. ;используем его для отображения регистра EIP
    52.     pushf       ;сохраним флаги
    53.     pusha       ; и регистры общего назначения.
    54.     add dword ptr [esp+3*4],8   ;команда pusha поместила в стэк значение esp
    55.         ;до выполнения. Добавим 8 (команды call и pushf поместили в стэк 8 байт)
    56.         ;чтобы отобразить значение esp до вызова процедуры.
    57.     mov ebp,esp     ;сохраним значение esp в ebp для более удобного
    58.         ;(и короткого) обращения к сохраненным в стэке значениям регистров.
    59.         ;Обычно также поступают компиляторы языков высокого уровня и
    60.         ;макросы, объявляющие процедуры.
    61.     sub esp,OutBufferSize   ;выделим OutBufferSize байт стэка для формирования строки
    62.         ;Часто так выделяют память под небольшие локальные переменные.
    63.     mov edi,esp
    64. ;содержимое памяти:
    65. ;edi=esp
    66. ;   область паяти в OutBufferSize байт для формирования стрки
    67. ;ebp=esp+OutBufferSize=edi+OutBufferSize
    68. ;   регистры общего назначения, помещенные командой pusha (8 регистров - 20h байт)
    69. ;ebp+20h
    70. ;   регистр флагов (pushf)
    71. ;ebp+24h
    72. ;   адрес возврата из процедуры (регистр eip)
    73.     cld
    74.     mov ecx,10
    75. AppendNextReg:
    76.     push ecx
    77.     mov al,'E'
    78. ;добавим к строке первый символ названия регистра
    79.     stosb
    80.     mov ax,word ptr [RegNames+ecx*2-2]
    81. ;второй и третий возмем из таблицы с именами
    82.     stosw
    83.     mov al,'='
    84.     stosb
    85.  
    86. ;получим значения регистра из стэка, переведем его в строку как шестнадцатиричное число
    87.     mov edx,dword ptr [ebp+ecx*4-4]
    88.     mov ecx,8
    89.     add edi,ecx
    90.     mov al,' '
    91.     stosb
    92. ConvertNext4BitsToSym:
    93.         mov eax,edx
    94.         and al,0Fh
    95.         add al,'0'
    96.         cmp al,'9'
    97.         jle NotSymbolNumber
    98.         add al,'A'-'0'-10
    99. NotSymbolNumber:
    100.         mov byte ptr [edi+ecx-1-9],al
    101.         shr edx,4
    102.     loop ConvertNext4BitsToSym
    103.  
    104.     pop ecx
    105.     cmp cl,6
    106.     jnz NotAppendNewString
    107.     mov ax,0A0Dh
    108.     stosw           ;добавим символы перевода строки,
    109.         ;если отображено 5 регистров
    110. NotAppendNewString:
    111.     loop AppendNextReg
    112.  
    113.     mov esi,offset FlagsStr
    114.     mov ecx,offset FlagsStrSize
    115.     rep movsb           ;добавим к строке со значениями регистров текст.
    116.  
    117. ;выведем значения флагов (из стэка). Установленый флаг
    118.         ;отображается заглавной буковй, сброшенный - прописной
    119.     mov ecx,NumOfFlags
    120.     mov edx,dword ptr [ebp+20h]         ;EFlags in stack
    121. DisplayNextFlag:
    122.     lodsb
    123.     cmp al,'x'          ;символом "x" в массиве с названиями флагов
    124.         ;обозначены неотображаемые, не выводим.
    125.     jz NotDisplayThisFlag
    126.     mov ah,' '
    127.     test dl,1           ;проверка состояния
    128.     jnz FlagIs1
    129.     or al,20h           ;переведем название флага из заглавного
    130.         ;в прописной (установим бит #5)
    131. FlagIs1:
    132.     stosw
    133. NotDisplayThisFlag:
    134.     shr edx,1           ;сдвинем вправо для отображения следующего флага
    135.     loop DisplayNextFlag
    136.  
    137.     mov al,0            ;добавим ноль для обозначения конца строки
    138.     stosb
    139.  
    140.     mov eax,esp
    141. extrn MessageBoxA:proc
    142.     ;call MessageBoxA,NULL,eax,offset RegTitle,40h  ;MB_ICONINFORMATION
    143.     add esp,OutBufferSize       ;освободим выделенную память
    144.     popa            ;восстановим регистры. Команда не восстанавливает
    145.         ;сохраненное значение esp из стэка
    146.     popf                ;восстановим флаги
    147.     ret             ;возврат из процедуры
    148. ;Конец процедуры DisplayRegs
    149. end start
     
  10. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    У меня в инсте подобная лаба была, нимного переделол, получилось то что требуецо :)
     
  11. StreetAngel

    StreetAngel New Member

    Публикаций:
    0
    Регистрация:
    9 ноя 2007
    Сообщения:
    3
    Спасибо всем кто откликнулся буду разбираться!!!
    а всё же как вывести содержание регистров и ячеек памяти?
     
  12. SII

    SII Воин против дзена

    Публикаций:
    0
    Регистрация:
    31 окт 2007
    Сообщения:
    1.483
    Адрес:
    Подмосковье
    Преобразовать из внутреннего (двоичного) вида в символьный (десятичный, шестнадцатеричный, тот же двоичный -- в зависимости от того, что именно нужно), а потом вывести как текстовые строки. Если в ДОСе -- то с помощью любого из подходящих прерываний.
     
  13. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    Ivan_assm, да уж, классный исходник дал на Паскале:) у себя попробую=))
     
  14. Ivan_assm

    Ivan_assm New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2007
    Сообщения:
    132
    Адрес:
    Везде и нигде
    извиняюсь что не по теме...но тронуло)))...
    )))
    я раньше пока за assembler не взялся на паскале куражился...с массивами тоже прикольно получалось...ток не забудь открыть второе окошко паскаля и в нем написать uses crt;
    begin
    Nosound;
    End.
    а о если у тебя PC speaker работает -с ума сойдешь....)))


    и еще, я слегка ошибся теле кода надо писать

    SetDate(0000,00,00);
    SetTime(00,00,00,00);

    а не

    SetDate(god,mes,den);
    SetTime(chas,min,sec,sot);
     
  15. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    Ivan_assm, не бойся, я когда запускал, то "СэтДэйт"ы и "СэтТаймы" убрал, оно вроде дату меняет и время... у меня дата и так приблизительная, не настроенная, а так еще и испортится...
    звука не было - винда не разрешает в порты ввода/вывода писать... а жаль;)
     
  16. Necromancer13

    Necromancer13 Виталий

    Публикаций:
    0
    Регистрация:
    26 окт 2007
    Сообщения:
    202
    Адрес:
    Украина, Берегово
    кстати, я тож до этого на Паскале писал;)
    и тожк всякие приколы типа этого...:)