Объясните пожалуйста вот такой код.... Я начинаю изучать assembler и некоторым вещам не могу найти объяснения... Ни как не пойму, следующее... Вот листинг IDA: ...ранее в коде... mov ah, 4Eh seg000:0106 mov dx, 10Dh ; mask for search ie *.*0 seg000:0109 int 21h seg000:010B jb short locret_1011C seg000:010D loc_1010D: seg000:010D sub ch, ds:2Ah ; *.*0 seg000:0111 mov dx, 9Eh seg000:0114 call bp по метке (адресу) loc_1010D лежит маска для поиска файлов *.*0 Но это просто маска а не код... IDA отобразила это как "sub ch, ds:2Ah". А, вот текст этого куска: LEA DX, FileMask INT 21h JC ff_exit FileMask: DB '*.*', 0 MOV DX, 9Eh CALL BP MOV AH, 4Fh Вопрос такой: Ведь DB '*.*',0 при выполнении будет интерпретироваться как команда? Почему так можно писать - это раз? И почему это "работает"?
bill Ну если ты не позволишь eip попасть на этот участок кода, то процик ничего интерпретировать и пытаться не будет.
Смотри lea dx,FileMask асм итерпретировал как mov dx,10dh ведь адрес loc_1010d(aka FileMask) имеено 010d в текущем сегменте, далее игра по правилам DOS в ah 4eh в dx адрес строки. Всё далее работу за нас делает DOS(aka int 21h). А IDA, она и в Африке IDA - интерактивный, значит расчитывает на человеческий фактор, а раз тут она его упустила, то и прокололась с интерпретацией), вернее когда я последний раз её пытался юзать(а это было очень давно), она уже тогда такие места выделяла красными вопросами, а в справке написали хелповаятели, что мол трактуется это место неоднозначно, поэтому проверьте 10 раз...
T800>>Ну если ты не позволишь eip попасть на этот участок кода, то процик ничего интерпретировать и пытаться не будет. Согласен. Я только не пойму одно ведь непосредственно перед FileMask: DB '*.*', 0 стоит JC ff_exit - условный переход... То есть логика (моя) говорит что условие может как выполниться так и нет... To black_hole IDA не причем... я пытаюсь понять почему "такой" работает....
работает потому, что значение в регистре ch из которого вычитается нечто левое просто не используется и исключений от чтения по левым адресам в ДОС нет (в винде они очень даже возможны А писать так конечно же нельзя правильно если уж размещаешь данные посреди кода, то ставить jmp через них. Иногда ещё call (совмещение push адрес данных + jmp в одном флаконе) использется но это тоже безобразие тормозящее из-за нарушения предсказателя ret. это стандартная проверка на успешность выполнения int 21h, скорее всего jmp там просто забыли поставить, а поскольку сбоя не было, то и при отладке не заметили.
>> работает потому, что значение в регистре ch из которого вычитается нечто левое просто не используется Чёрт возьми, логично... Я так понимаю... все зависит от того как эти данные будут интерпретированы процессором... Просто, я - начинающий и не с первого раза понимаю такие "извращения"... Но интересно, черт возьми...
Я в какой-то 256b - демке видел как один и тот же участок памяти использовали как данные и как код, чтобы место сэкономить.