Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Assembler

Автор: XAN
Дата сообщения: 12.07.2012 14:27
ПРивет всем!
у меня вопрос... у Калашникова есть пример программы которая выполняясь перезаписывает сама себя в памяти.

Сама листинг есть по ссылке
http://www.kalashnikoff.ru/Assembler/issues/encl/009/PROG09.asm.htm

МОй вопрос таков:

там есть код
Open_file proc
    cmp Handle,0FFFFh ; Процедура открытия файла для чтения,
    jne Quit_open
    mov ax,3D00h
    int 21h
    mov Handle,ax
    ret
Quit_open:
    stc
    ret
Handle dw 0FFFFh <--------
Open_file endp


Вот это непонятно откуда тут выясняется открыт ли файл ??? ведь переменную Handle мы придумали сами и присвоили ей значение Handle dw 0FFFFh
Такое сравнение всегда будет верно, если Handle не изменится, а в ходе программы на процедуру открытия файлы возврата больше не делается, то есть он открывается 1 раз и всё.
смысл тогда в это проверке?

Автор: bomzzz
Дата сообщения: 12.07.2012 14:37
че не понятного. ты записываешь в переменную FFFF, потом открываешь файл и записываешь в нее хендл. потом если она равна FFFF - значит файл еще не открывался, если не равна значит вней уже хендл
Автор: akaGM
Дата сообщения: 12.07.2012 15:23
XAN

Цитата:
ведь переменную Handle мы придумали сами

:)
а до сих пор для тебя кто придумывал?

ну непонятно тебе что такое инициализированные переменные, пиши так:

mov dx,offset File_name
mov Handle, 0FFFFh
call Open_file ;Открываем файл
jc Error_file ;Ошибка? 

кстати, всё равно Handle придётся где-то описАть :)

Автор: XAN
Дата сообщения: 12.07.2012 15:44
смысл этой проверки какой ?
в ходе работы программы попасть на функцию открытия файла можно только 1 раз.
Это значит что файл может быть открыт только в этой функции, а до этого он закрыт.

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



"ну непонятно тебе что такое инициализированные переменные, пиши так: "
Дело не в этом ...
ПРидумали переменную... взяли значение с потолка... Открыли файл и модифицировали переменную если открыли успешно.
Алгоритм

Открыли файл на чтение
ПРочли файл в область памяти в которую загрузились
Закрыли файл
Вывели сообщение об успехе...

Целесообразность этой переменной непонятна.

Файл открыли... файл закрыли... Зачем проверять открыт ли он? если в коде нет больше попыток его открыть.



То есть если взять и убрать эту переменную и её проверки работать то программа всё равно будет?

Автор: MERCURY127
Дата сообщения: 12.07.2012 16:03
Проверять надо затем, что при открытии файл может и не открыться. Тогда при попытке дальнейшей работы с ним будет ой...
Автор: akaGM
Дата сообщения: 12.07.2012 16:05

Цитата:
Файл открыли... файл закрыли... Зачем проверять открыт ли он?

проверяют не открыт/закрыт, а успех открытия...
есть ещё такие понятия как системный сбой, сбой файловой системы...
а проверка эта -- хороший тон, тебя ж там программированию учат, а не ещё чему-то


Цитата:
То есть если взять и убрать эту переменную и её проверки работать то программа всё равно будет?
может будет, может нет, вот для этого и проверки, а если убрать, то как закрывать?...
ты этот файл перед запуском программы вордом открой...
и потом зачем его несколько раз одной и той же программой открывать?
Автор: XAN
Дата сообщения: 12.07.2012 21:11
Благодарю всех кто пытается мне пояснить.

MERCURY127
может я чего неправильно поясняю, но ответили вы не на мой вопрос...

Смотрите ...

mov dx,offset File_name
mov ax,3D00h
int 21h
jc Error_file
Вот это проверка открыт ли файл... уход в случае проблемы на ошибку. Так что вот и весь код тогда зачем

Там такой код

mov dx,offset File_name
call Open_file
jc Error_file
....
Open_file proc
    cmp Handle,0FFFFh
    jne Quit_open
    mov ax,3D00h
    int 21h
    mov Handle,ax
    ret
Quit_open:
    stc
    ret
Handle dw 0FFFFh
Open_file endp

ПРоверка возврата значения и так проводится. Для чего тогда cmp Handle,0FFFFh ??? целесообразность??


akaGM
Успех открытия проверяется через флаг переноса и эта проверка там есть. В итоге зачем
cmp Handle,0FFFFh
остается непонятным...
и кстати заметил, что хендл открытого файла сразу почему то помещают в переменную mov Handle,ax
не проверив успеха открытия...
mov ax,3D00h
int 21h
mov Handle,ax

хотя по идее корректнее
mov ax,3D00h
int 21h

jc Error_file
mov Handle,ax
<---- сначала проверка, и только потом какие то операции со значением возвращенным в ax потому что если успеха открытия нет, то операция помещения в Handle значения из ax бессмысленна.


Цитата:

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

1. Я про это думал, вдруг файл уже открыт чем то... НО !!! если бы мы спрашивали ОС открыт ли файл, то это было бы верно
но там от балды идёт присвоение переменной хендла значения FFFFh
2. Допустим запустили раз эту программу и второй раз (что для DOSа нереально), но даже если запустили
под 98 то в каждой программе будет своё адресное пространство и своя переменная Handle и даже если файл уже открыт, другая копия программы об этом не узнает. Наверно вот почему в линухе популярны файлы блокировки ??


Автор: bomzzz
Дата сообщения: 12.07.2012 21:36
че у калашникова типа ошибок нету. так даже интререснее ассемблер учить - ошибки искать. например последняя программа XMS файлы не копирует, там ошибка
Автор: MERCURY127
Дата сообщения: 12.07.2012 21:38
Хмм да вот посмотрел ща листинг ... Я так понял, что это у него расширенная функция открытия файла, видимо, она используется не только в этом примере, потому и несет дополнительный функционал, не нужный в этом примере. Короче, она предотвращает двойное открытие файла
Автор: XAN
Дата сообщения: 17.07.2012 10:21
а можно ли эту программу отладить не AFDpro а чем то еще ?? причем в VMWare....
Автор: MERCURY127
Дата сообщения: 17.07.2012 11:37
Конечно turbodebugger, codeview, debug, и король отладчиков - softice но...
Зачем вам дос? Я не понимаю?! Что, других книжек нету что ли, для изучения нормального, современного ассемблера?

Добавлено:
Хоть под винду, хоть под никсы

Добавлено:
Зачем каждый раз заново откапывать этих динозавров?!
Автор: akaGM
Дата сообщения: 17.07.2012 12:40
да это вопрос не к клиентам, а к тем кто такие задания даёт...
Автор: XAN
Дата сообщения: 17.07.2012 13:22
Кстати, читая себя саму в память эта программа перетрёт значение Handle изначальным, так что толку от этой переменной никакого.
Чтобы этого избежать я полагаю надо метку
finish equ $
так чтобы исключить перезапись переменной Handle
Например, в блоке данных
................
message_ok db 'Все нормально!',0Ah,0Dh,'$'
finish equ $
Handle dw 0FFFFh
...................


Я переписал эту программу вот на такую...

Код:
cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
start:
mov dx,offset file_name
mov ax,3D00h
int 21h
jc error_file

mov bx,ax
mov ah,3Fh
mov cx,offset finish-100h
mov dx,offset start
int 21h

mov dx,offset readf
mov ah,9
int 21h

mov ah,3Eh
int 21h

mov dx,offset closef
mov ah,9
int 21h

mov dx,offset message_ok
mov ah,9
int 21h
jmp end_

error_file:
mov dx,offset error
mov ah,9
int 21h
end_:
ret

;ДАННЫЕ
file_name db 'l.com',0
error db 'Error open file',0Ah,0Dh,'$'
readf db 'File read',0Ah,0Dh,'$'
closef db 'File closed',0Ah,0Dh,'$'
message_ok db 'Все нормально!',0Ah,0Dh,'$'
finish equ $
cseg ends
end start
Автор: akaGM
Дата сообщения: 17.07.2012 13:37
что-то я совсем запамятовал...

разве .COM формат ret'ом возвращается, а не 20-ым интом?
Автор: MERCURY127
Дата сообщения: 17.07.2012 13:41
Интом конечно
Автор: bomzzz
Дата сообщения: 17.07.2012 13:44
return-ом тоже возвращается

Добавлено:

Цитата:
CSEG segment
assume cs:CSEG
org 100h
Begin:
mov ax,3h
INT 10h
mov dx,3c8h
mov al,0
out dx,al
mov dx,3c9h
mov al,0
out dx,al
mov al,0
out dx,al
mov al,63
out dx,al
mov dx,3c8h
mov al,7
out dx,al
mov dx,3c9h
mov al,63
out dx,al
mov al,63
out dx,al
mov al,63
out dx,al
ret
CSEG ends
end Begin

компилится и работает и тасмом и масмом
Автор: Abs62
Дата сообщения: 17.07.2012 17:41
akaGM

Цитата:
разве .COM формат ret'ом возвращается, а не 20-ым интом?

Это такой извращённый способ вызвать int 20h - перейти на начало PSP.
Автор: akaGM
Дата сообщения: 17.07.2012 18:04
Abs62
типа версии дос с обратной/"вперёдной" совместимостью бодались?
Автор: Abs62
Дата сообщения: 17.07.2012 18:18
akaGM
Даже не DOS - это наследие CP/M.
Автор: akaGM
Дата сообщения: 17.07.2012 19:24
вот-вот...

Цитата:
перейти на начало PSP.

а здесь не CD 20 сидит? :)
Автор: Abs62
Дата сообщения: 17.07.2012 19:27
akaGM

Цитата:
а сдесь не CD 20 сидит?

Ну да, int 20h, он самый. Я ж и говорю - извращённый способ дёрнуть его.
Автор: MERCURY127
Дата сообщения: 17.07.2012 21:49
Мсье XAN знает толк в извращениях ...
Автор: XAN
Дата сообщения: 17.07.2012 22:20
MERCURY127
Да пишет тот Калашников, что надо вот с этого начинать, понять, вникнуть... вот я и сижу вникаю.
В принципе надо достигнуть уровня считывания кода по конструкциям... просто узнавать блоки и где что делается... так что я пока новичок и мне еще много делать.

RET возвращает, если стек выровнен.... возврат будет к DOS тогда.
Калашников пишет, что можно... и это работает.
Почему бы и нет ?
Автор: MERCURY127
Дата сообщения: 18.07.2012 12:28
Хмм, надо будет это все под отладчиком прогнать, и посмотреть, что там дос на стек кладет...
Автор: akaGM
Дата сообщения: 18.07.2012 12:37
[off]

Цитата:
дос на стек кладет
:)
Автор: Abs62
Дата сообщения: 18.07.2012 16:44
XAN

Цитата:
Калашников пишет, что можно... и это работает.
Почему бы и нет ?

Да нет, можно, конечно. Это же ассемблер, тут по всякому можно. И стоя, и лёжа, и боком, и на лыжах, и в гамаке... И
[more=вот так]
Код: cseg segment
assume cs:cseg,ds:cseg,es:cseg,ss:cseg
org 100h
start:
mov cx,0Ah
sub sp,cx
mov di,sp
lea si,dat
rep movsb
mov dx,offset file_name
mov ax,3D00h
int 21h
jnc p0
mov dx,offset error
mov ah,9
int 21h
add sp,0Ah
p0:
ret

p1 proc
mov bx,ax
mov ah,3Fh
mov cx,offset finish-100h
mov dx,offset start
int 21h
ret
p1 endp

p2 proc
mov dx,offset readf
mov ah,9
int 21h
ret
p2 endp

p3 proc
mov ah,3Eh
int 21h
ret
p3 endp

p4 proc
mov dx,offset closef
mov ah,9
int 21h
ret
p4 endp

p5 proc
mov dx,offset message_ok
mov ah,9
int 21h
ret
p5 endp

;ДАННЫЕ
file_name db 'll.com',0
error db 'Error open file',0Ah,0Dh,'$'
readf db 'File read',0Ah,0Dh,'$'
closef db 'File closed',0Ah,0Dh,'$'
message_ok db 'Все нормально!',0Ah,0Dh,'$'
dat dw offset p1,offset p2,offset p3,offset p4,offset p5
finish equ $
cseg ends
end start
Автор: akaGM
Дата сообщения: 18.07.2012 17:15

Цитата:
И вот так можно, к примеру.

камасутра на ассемблере...
от ить не поленился :)
Автор: delover
Дата сообщения: 19.07.2012 18:18

Цитата:
камасутра на ассемблере...

Имхо сразу 2. Если камасутра, то где же деньги. Камасутра на ассемблере - милое дело, где же деньги 2 раза. Третий имхо - камасутру на ассемблере заказали бы - сделал бесплатно, тока как с женой урегулировать не знаю.


Цитата:
Это такой извращённый способ

Я то думал Вы интрудер ковыряли.
Автор: delover
Дата сообщения: 20.07.2012 06:42
Про интрудер - давненько было. Защита от интрудера строилась следующим образом. Таблица прерываний по адресу памяти 0..0x0400 читалась и перезаписывалась стековыми инструкциями PUSH и POP. При этом на определённом участке кода программа не могла использовать стек по назначению. После этого интрудер терял нюх. Это в копилку камасутры со стеком.
Автор: Yvaliko
Дата сообщения: 20.07.2012 16:44
Помню читал когда то про древний вирус. Ни чем особо не выделялся, кроме того что был неизлечим.
Парсит исполняемый файл. Все CD 21 заменяет на FF. Потом перехватывает int 6 - недействительный КОП.
Программа выполняется, натыкается на FF, прочессор вызывает прерывание. Прерывание уже перехвачено и внутри просто выполняется int 21h.
Если убить вирус, то программа перестает работать. Заменить все FF назад на CD 21 уже нельзя, т.к. не все FF именно вирус вписал, это могут быть и данные и части других команд. Вернуть работоспособность можно лишь ручками анализируя код.
Вот такая камасутра была в далеком 20 веке.

Страницы: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384

Предыдущая тема: .NET GUI компоненты


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.