Сейчас на форуме: user99, _MBK_, ManHunter, Magister Yoda, rtsgreg1989 (+9 невидимых)

 eXeL@B —› Основной форум —› Объясните как перевести на Паскаль
Посл.ответ Сообщение


Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 14 октября 2005 17:34
· Личное сообщение · #1

Здравствуйте!

Имею такой кусок:
00403656 |. BF 08000000 |MOV EDI,8
0040365B |. 83C8 FF |OR EAX,FFFFFFFF
0040365E |. 8A140A |MOV DL,BYTE PTR DS:[EDX+ECX] В DL заносится первый символ имени
00403661 |> D1E0 |/SHL EAX,1
00403663 |. D0E2 ||SHL DL,1
00403665 |. 8BC8 ||MOV ECX,EAX
00403667 |. 8ADA ||MOV BL,DL
00403669 |. C1E9 17 ||SHR ECX,17
0040366C |. 81E1 80000000 ||AND ECX,80
00403672 |. 81E3 80000000 ||AND EBX,80
00403678 |. 33CB ||XOR ECX,EBX
0040367A |. 74 05 ||JE SHORT RCube.00403681
0040367C |. 35 2083B8ED ||XOR EAX,EDB88320
00403681 |> 4F ||DEC EDI
00403682 |.^75 DD |\JNZ SHORT RCube.00403661

Например, пусть первый символ будет "А", пройдя весть этот код, в EAX будет: 91711080

Подскажите, как этот код перевести на Паскаль.

Меня смущают такие команды:
00403661 |> D1E0 |/SHL EAX,1
00403663 |. D0E2 ||SHL DL,1
~~~~~~~~~~~~~~~~~
00403669 |. C1E9 17 ||SHR ECX,17
0040366C |. 81E1 80000000 ||AND ECX,80
00403672 |. 81E3 80000000 ||AND EBX,80




Ранг: 303.7 (мудрец), 4thx
Активность: 0.190
Статус: Участник
tPORt Manager

Создано: 14 октября 2005 17:40
· Личное сообщение · #2

Хе, кажись в пускале есть такие функции для сдвигов и and...



Ранг: 51.9 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 октября 2005 17:44
· Личное сообщение · #3

shl, shr и and ???



Ранг: 51.9 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 14 октября 2005 17:56
· Личное сообщение · #4

asm: SHL EAX,1
tp: eax shl 1
Это что уже перестало работать ?



Ранг: 37.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 14 октября 2005 18:02
· Личное сообщение · #5

Можно и не переводить на Паскаль, а записать в блоке

asm
.......
end;

Но это для 32-битного компайлера.
Для 16-битного будет следующее:
EAX(ECX,EBX..) можно заменить переменной типа longint;
DL(CL,BL...) - переменной типа byte;
Битовые операции: EAX:=EAX shr 1; ECX:=ECX and 1; и т.д.




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 14 октября 2005 18:03
· Личное сообщение · #6

пиши на паскале так:
var
  chislo: integer;
  sdvig: byte;
begin
  chislo:=ord('A'); //к примеру
  sdvig:=17; //к примеру
  asm
    push eax //на всякий случай
    mov eax, chislo
    shl eax, sdvig
    and eax, 80
    shr eax, sdvig
    pop  eax //на всякий случай
  end;
end;


-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!





Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 14 октября 2005 18:10
· Личное сообщение · #7


asm
shl eax,1
shl ebx,1
end;
WriteLN(eax)

в EAX будет -2, когда в отладчике там FFFFFFFE(я знаю что это одно и тоже), но
потом SHR ECX,17, будет ноль. Должно 1FF.

Изобразите, пожалуйста, пример.




Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 14 октября 2005 18:12
· Личное сообщение · #8

GPcH

Косяк, пока писал, ты вроде как помог.

Спасибо. Пойду проверять.




Ранг: 81.7 (постоянный), 10thx
Активность: 0.030
Статус: Участник

Создано: 14 октября 2005 18:32
· Личное сообщение · #9

Никак, не получается. ПЛЗ. Можно полный пример, тоесть Program.....end.




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 14 октября 2005 18:49
· Личное сообщение · #10

да я пример для дельфей кинул... если чистый паскал - попробуй использовать 16 разрядные регистры... скажу чессно - никогда на досовском паскале не писал и не изучал... но думаю там по сравнению с дельфями моло различий в работе стандартными способами

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 37.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 14 октября 2005 20:20
· Личное сообщение · #11

AVE
А точнее можно наисать какой пасовский компилятор юзаешь?
Если BP 7.0 или TP 7.0, то делать asm-вставки с 32-битными регистрами не получится(EAX, EBX...).
В зависимости от логики проги нужно заменить 32-битные регистры на 16-битные(если это не приведет к потерям) либо заменять регистры на переменные и полностью все переводить на Pascal.
И еще: не пойму для чего EDI; обычно в нем адрес строки, но здесь на это не похоже.



Ранг: 37.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 14 октября 2005 20:24
· Личное сообщение · #12

GPcH
никогда на досовском паскале не писал и не изучал... но думаю там по сравнению с дельфями моло различий в работе стандартными способами

А с чего же тогда начинал???
P.S.
Отличия в данном случае заключаются в типах данных.




Ранг: 605.2 (!), 341thx
Активность: 0.470.25
Статус: Модератор
Research & Development

Создано: 15 октября 2005 02:18
· Личное сообщение · #13

Stranger пишет:
А с чего же тогда начинал

c VB

-----
EnJoy!





Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 15 октября 2005 09:20
· Личное сообщение · #14

Stranger пишет:
А с чего же тогда начинал???

QBasic -> VB for DOS -> VB 6.0 -> Asm ->HTML -> PHP & Delphi

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 37.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 октября 2005 11:20
· Личное сообщение · #15

А мой путь:
QBasic-> Pascal-> ASM->Delphi(немного)->C++
Ну и немного изучал HTML.
Но в основном все под ДОС. Комп был хилый и инета не было. Поэтому теперь проблемы с
API-функциями.



Ранг: 54.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 15 октября 2005 11:30
· Личное сообщение · #16

В паскле нет 32-х битных регистров но можно записать всё опкодами.



Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 15 октября 2005 13:51
· Личное сообщение · #17

xShadow пишет:
В паскле нет 32-х битных регистров но можно записать всё опкодами

Простите, это как?

var
EDI,EAX,ECXWORD;
DL,BL:byte;
begin
...
EAX:=EAX or $FFFFFFFF;
DL:=Str[1]; // наша строка
for EDI:=8 DOWNTO 0 Do begin
EAX:=EAX shl 1;
DL:= Dl shl 1;
ECX:=(EAX SHR $17) and $80;
BL:=DL and $80;
if (ECX xor EBX)=0 then
eax:=eax xor $EDB88320
end;
Могут быть в синтаксисе ошибки, проверь сам

-----
Подписи - ЗЛО! Нужно убирать!





Ранг: 78.0 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 15 октября 2005 15:31
· Личное сообщение · #18

xShadow пишет:
В паскле нет 32-х битных регистров но можно записать всё опкодами.


nice пишет:
Простите, это как?


Вы для начала определитесь, о каком "Паскале" вы говорите ;)
Если на то пошло, то в стандартном Паскале (если под этим понимать стандарт) вообще нет асм-вставок, и shl/shr - тоже нет.

-----
crypto.freak




Ранг: 54.9 (постоянный)
Активность: 0.020
Статус: Участник

Создано: 15 октября 2005 15:45 · Поправил: xShadow
· Личное сообщение · #19

Ну возьмём к примеру TP7
Там есть inline в котором можно использовать опкоды.
или вот самый простой пример
 asm
    db $66, $33, $C0 {xor eax, eax}
 end;

Откомпилирует и выполнит как миленький.



Ранг: 37.5 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 15 октября 2005 16:19
· Личное сообщение · #20

nice пишет:
var
EDI,EAX,ECX:WORD;

Есть одна маленькая проблемка: EDI,EAX,ECX - 4x-байтные регистры, в то время как в WORD больше 2х не запихнешь!



Ранг: 384.1 (мудрец)
Активность: 0.250
Статус: Участник
www.int3.net

Создано: 15 октября 2005 17:18 · Поправил: nice
· Личное сообщение · #21

Stranger
А я написал D W O R D!

я пропустил насчет паскаля, думал про дельфи идет речь, так что сорри

-----
Подписи - ЗЛО! Нужно убирать!



 eXeL@B —› Основной форум —› Объясните как перевести на Паскаль
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати