Сейчас на форуме: _MBK_, ut2004, vsv1 (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Помогите плз с Калашниковым
Посл.ответ Сообщение

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

Создано: 08 января 2007 01:21
· Личное сообщение · #1

Я щас читаю Калашникова и я на девятом уроке:

1) В самом начале прога сравнивает handle и 0FFFFh, причём до этого никакого присваивания
Handle не было, вот вопрос: откуда там может что-то взяться?

2) Если файл с указанным именем не нашли (File_name db 'less009.com',0), то пищим и выходим:
mov ah,2
mov dl,7
int 21h

Я так понимаю, что 2-я ф-ция 21 прерывания издаёт звук, так? А что тогда в dl: частота,
длительность или что-то ещё?

3) Калашников пишет, что "Она загружала саму себя в память. Т.е. поверх себя (поверх своего кода)"
Имеется ввиду, что она пишется в оперативной памяти поверх себя?

4) В 8 выпуске была надпись "Buffer equ $", в 9 выпуске говорится, что при нахождении знака "$"
компилятор меняет его на адрес, по которому он расположет, это я понял, а что такое "equ"?

5) В 12 выпуске обговаривая программу из 9 урока, Калашников говорит, что
"Вот здесь проверяем на то, содержит ли Handle 0FFFFh. Т.е. окрыт ли файл на самом деле или нет",
как он может быть уже открыт, если эта прога не резидентная? хотя с другой стороны мы уже
запуском этого файла открываем, тем самым его и в таком случае в этой фразе вообще нет смысла?

6) в 12 выпуске приведена таблица, как изменяется в программе handle:

Действие Handle (после)
---------------------------------------------------
начало FFFF
open_file 1 (не важно что, главное что не FFFF)
чтение файла FFFF! Вот про это я и говорю! См. ниже
close_file FFFF

Получается, что между "чтение файла" и "close_file" handle успевает приобрести значение FFFF.
Вопрос: где это handle успевает так? ведь в программе всего два раза переменной handle присваивается
что-либо: первый раз в процедуре open_file, и второй раз в процедуре close_file, а между
"чтение файла" и "close_file" никакого присваивания нету, как так?


7) В 10 выпуске есть такие строки:

push cs ; Что здесь происходит? Я полагаю, что регистру ds просто присваивается
pop ds ; значение регистра cs, НО: почему тогда нельзя было написать "mov ds,cs"?

8) Далее, в том же 10 выпуске сразу после предыдущих строк идут эти;

...push dx.....
mov dx,offset My_string ; Значит, здесь что получается: ложим-то мы в стёк
pushf ; (вот здесь) флаги,
call dword ptr cs:[Int_21h_vect] ;
pop dx ; а вот на этой строчке мы в dx не тот dx, который
pop ds ; ложили раньше, а флаги.

Что здесь не так? Либо ф-ция забирает флаги из стёка? Хотя это тоже вряд ли...

9)Что такое "Сигнатуры"?
10)А что такое "CRC - контрольные суммы"? Я так понял, что программа сравнивает свой р-р с размером,
который у неё уже заложен, и если эту прогу либо распаковывают, либо вирус присоединяется, короче
р-р меняют, то она ведёт себя по другому, да?



Ранг: 310.8 (мудрец), 29thx
Активность: 0.430
Статус: Участник

Создано: 08 января 2007 02:52
· Личное сообщение · #2

2) AH=2 , наверное вывод символа. DL=7 - это управляющий символ beep
Настройка частоты была только в ДОС, в Виндах все стандартно.
4) equ - эквивалентность. Не мешало бы обзавестись учебником по ассемблеру и по прерываниям.
Блин, надо потрясти свои архивы и попросить выложить на сайте.

[poly] glot пишет:
почему тогда нельзя было написать "mov ds,cs"?

7) Потому что нет такой команды

[poly] glot пишет:
Что здесь не так? Либо ф-ция забирает флаги из стёка? Хотя это тоже вряд ли...

8) Именно так. call фактически эмулирует INT 21, но команда INT сохраняет флаги на стеке, а команда
RETI делает возврат с восстановлением флагов.

9) В поисковики. Можно и по форуму посмотреть.
10) Сумма есть сумма, причем здесь размер. Суммируются по определенному алгоритму все байты проги или критический кусок. Сравнивая с оригиналом, определяем - ....
================
Сходил бы в раздел Новичку Там конечно много другой инфы, но это(9,10) точно есть.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 08 января 2007 03:25
· Личное сообщение · #3

[poly] glot, начну с главного, дальше десятого урока эту рассылку читать нет смысла (уже неактуально).

[poly] glot пишет:
1) В самом начале прога сравнивает handle и 0FFFFh, причём до этого никакого присваивания
Handle не было, вот вопрос: откуда там может что-то взяться?

В исходнике мы видим:
Handle dw 0FFFFh
Здесь переменная handle объявляется как dw (data in word, то есть 2 байта), а за объявлением в этой же строке ей присваивается значение -1 (оно же 0FFFFh).

-----
Всем привет, я вернулся




Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 08 января 2007 03:43
· Личное сообщение · #4

3) Да, в тот же сегмент и по тем же смещениям. Только это в Win32 ну совсем неактуально.

4) EQU – это "=". Оператор присвоения значения константе. Такие вещи описаны в доке от компилятора.

9) Простым языком, сигнатура – это характерная последовательность байт.

5-й и 6-й должны отпасть в отладчике. Нужно много экспериментировать самому, чтобы прочувствовать ход выполнения различных процедур и логику программ. Даже если мы сейчас за тебя всё разберём, толку от этого будет 0.

-----
Всем привет, я вернулся




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

Создано: 08 января 2007 04:31
· Личное сообщение · #5

1) Точняк, понял, чего это я туплю
2) Вряд ли ah=2 вывод символа, если попробовать написать прогу:

CSEG segment
org 100h
begin:

mov ah,2
mov dl,7
int 21h
ret

CSEG ends
end begin

В итоге прога, как и предполагалось пищит и выходит, но если убрать ah,2 из неё, то
прога не пищит.А если попробовать поменять ah,2 на ah,3 к примеру, то прога ваще виснет.
Так что я думаю, что всё-таки "mov ah,2" - это ф-ция для 21 прерывания, а dl - параметр.
Вопрос: Что из себя представляет 2 ф-ция 21 прерывания и какие у неё параметры вход-выход
(Извините, конечно за такие вопросы, просто ещё как-то справочник по асму не приобрёл
3) Ясно, только почему в Win32 это не актуально?
4) Понял
7) Почему нету? Ты имеешь ввиду, что нельзя присваивать регистру ds что-либо оператором mov?
8) Понял
9) Ясно
10) Вроде тоже понял

Ладно, 5 и 6 посмотрю в отладчике. Т.о. мне осталось только понять вопрос 2



Ранг: 105.9 (ветеран), 1thx
Активность: 0.090
Статус: Участник

Создано: 08 января 2007 04:46
· Личное сообщение · #6

А вопрос 2 и не очень-то и сложный
Вызываем прерывание 21. Это понятно. Каждое прерывание имеет несколько функций. Номер нужной нам функции мы должны поместить в ah. Это понятно. Функция 2 прерывания 21 выводит на экран символ, хекс -код которого помещен в dl. Это понятно. А в dl мы помещаем 7, это хекс-код противного звукового сигнала. Вот тут мне и самому немного непонятно как звук является символом. Просто прими это как есть.



Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 08 января 2007 05:05
· Личное сообщение · #7

[poly] glot пишет:
3) Ясно, только почему в Win32 это не актуально?

Читай "Дневники чайника. Чтива 0".

[poly] glot пишет:
Т.о. мне осталось только понять вопрос 2

А вот тут как раз не стоит гадать. Для решения подобных вопросов всегда проще найти хороший справочник.
Лучшее описание прерываний ДОС создал Ralf Brown и называется оно "Ralf Brown's Interrupt List" (RBIL).
Менее полная дока (и соответственно простая в использовании) – "Flambeaux Software's TECH Help".
В гугле ты их без проблем найдёшь.
Вот что можно прочитать про функцию AH=2 в Int21:
---
INT 21 - DOS 1+ - WRITE CHARACTER TO STANDARD OUTPUT
AH = 02h
DL = character to write
Return: AL = last character output (despite the official docs which state
nothing is returned) (at least DOS 2.1-7.0)
Notes: ^C/^Break are checked, and INT 23 executed if pressed
standard output is always the screen under DOS 1.x, but may be
redirected under DOS 2+
the last character output will be the character in DL unless DL=09h
on entry, in which case AL=20h as tabs are expanded to blanks
if standard output is redirected to a file, no error checks (write-
protected, full media, etc.) are performed
SeeAlso: AH=06h,AH=09h
---

-----
Всем привет, я вернулся




Ранг: 495.3 (мудрец)
Активность: 0.30
Статус: Участник

Создано: 08 января 2007 05:11
· Личное сообщение · #8

[poly] glot, не забивай себе голову ДОС-программированием. Через месяц ты забудешь про Int21, и больше вообще не будешь вспоминать никогда.

-----
Всем привет, я вернулся




Ранг: 24.5 (новичок)
Активность: 0.060
Статус: Участник

Создано: 08 января 2007 05:17
· Личное сообщение · #9

Да... Лудше сразу с масм 32 начинать.... Хотябы.. Хотя нет...В калашнике надо гдето 5-6 глав прочитать лудше чтоб понять..А потом забить и на 32 битную переходить.....



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

Создано: 08 января 2007 06:24
· Личное сообщение · #10

Ладно, я понял, хотя всё равно интересно дочитать Калашникова, считаю, что во всём, чём хотел разобраться - разобрался, всем спасибо


 eXeL@B —› Вопросы новичков —› Помогите плз с Калашниковым
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати