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

 eXeL@B —› Основной форум —› turbo pascal и дизассемблирование
Посл.ответ Сообщение

Ранг: 7.0 (гость)
Активность: 0=0
Статус: Участник

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

проблема такая. Мне дали программу на паскале. Я ее дизассемблировал.Вижу там вызов getmem в такой форме:


seg000:01C7 push ds
seg000:01C8 push di
seg000:01C9 mov ax, 8 ;
seg000:01CC push ax
seg000:01CD call @GetMem$qm7Pointer4Word ; GetMem(Pointer &,Word)



где ds:di - как я понял это адрес указателя.Туда помещается адрес выделенной памяти.
То есть тут передается адрес указателя и туда записывается значение адреса выделенной памяти.Сама функция getmem ничего не возвращает.
Сделал похожую программу на паскале:


var p:pointer;
begin
GetMem(p,sizeof(integer)*4);
freemem(p,sizeof(integer)*4);
end.


и ее тоже дизассемблировал:


seg000:000F mov ax, 8 ; DATA XREF: Halt(Word)+1C\19r
seg000:0012 push ax
seg000:0013 call @GetMem$q4Word ; DATA XREF: Halt(Word):loc_195\19r
seg000:0013 ; GetMem(var p: Pointer{DX:AX}; size: Word)
seg000:0018 mov word_890, ax
seg000:001B mov word_892, dx

А тут получается, что передается только размер выделяемой памяти,а адрес выделяемой памяти возвращается через dx:ax и уже потом записывается в указатель.
Вообщем-то и названия функции дизассемблер определил как разные:
call @GetMem$qm7Pointer4Word ; GetMem(Pointer &,Word) и
call @GetMem$q4Word ; GetMem(var p: Pointer{DX:AX}; size: Word)
Вот не понимаю, как сделать так, чтобы было так же как в исходной программе.Думал разные версии компиляторов(про ту хз, а мой - 7.0).Программа file analyser сказала, что версия компилятора 6.0 или 7.0.На всякий случай скачал 6.0 - но там оказалось то же самое.




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

Создано: 14 ноября 2005 15:01
· Личное сообщение · #2

jungle пишет:
как сделать так, чтобы было так же как в исходной программе

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

jungle пишет:
Думал разные версии компиляторов

Может там какая-то оптимизация была включена/отключена...?



Ранг: 352.4 (мудрец), 4thx
Активность: 0.150
Статус: Участник
retired

Создано: 14 ноября 2005 15:23
· Личное сообщение · #3

скорее не оптимизация, а модель памяти разная



Ранг: 7.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 ноября 2005 16:01
· Личное сообщение · #4

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



Ранг: 192.3 (ветеран), 18thx
Активность: 0.120
Статус: Участник
stoned machine-gunner

Создано: 14 ноября 2005 16:55
· Личное сообщение · #5

jungle
Дык продолжал бы свои вопросы в первой теме
http://www.exelab.ru/f/action=vthread&topic=2979&forum=1&p age=-1
зачем новую создал?

-----
once you have tried it, you will never want anything else



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


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