Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 864
от 01.10.2007, 06:35

Администратор:Калашников О.А.
В рассылке:Подписчиков: 382, Экспертов: 30
В номере:Вопросов: 1, Ответов: 1


Вопрос № 103318: Уважаемые эксперты. Заменил в простой программе "Hello,word" эти слова на "format c:" Ничего не произошло. В принципе, понятно почему: у меня Win32 XP SP2, там не чистый Дос, а эмуляция. Вопрос: реально ли сделать "format c:&...

Вопрос № 103.318
Уважаемые эксперты. Заменил в простой программе "Hello,word" эти слова на "format c:" Ничего не произошло. В принципе, понятно почему: у меня Win32 XP SP2, там не чистый Дос, а эмуляция. Вопрос: реально ли сделать "format c:" на ассемблере. Если да, то не может ли кто-нибудь выложить код такой программы, желательно с краткими комментариями. Интересует COM-программа, не EXE; но если нельзя этого сделать с помощью СОМ, то выложите, пожалуйста, EXE. Для меня без разницы: форматировать системный раздел или нет, просто хочется понять принцип работы, сассемблировать и проверить. Если есть ссылки или книги (не англоязычные), поделитесь, пожалуйста, со мной.
Отправлен: 25.09.2007, 12:05
Вопрос задал: Masada (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: Xaud
Небезызвестная программа “Hello, World!”, собственно, ничего кроме вывода текста не делает, т.е. она записывает это строчку (“Hello, World!”) в стандартный поток вывода, а из него на экран. Потому ничего существенного не изменится, если заменить эту строку на “format c:” (кроме отображенного текста на экране)…
Как, бы…
Можно пойти несколькими путями.
1. Нужно перенаправить поток вывода от новой программы с измененным текстом на вход другой (для нее это будет аналогично вводу с клавиатуры), которая в нашем случае запустит все, что ей передадут. Используем для этих целей командный интерпретатор:

Пуск->Выполнить
Пишем:
world.exe|cmd
, где world.exe – модифицированная программа с нужным текстом,
cmd – командный интерпретатор.

Или на все случаи жизни:
world.exe|%COMSPEC%
, где %COMSPEC% - переменная среды окружения, которая всегда должна содержать путь к командному интерпретатору (в том числе и в чистом DOS).

И получаем, что хотели…
Конечно, это не совсем тот метод, что требуется, но результат достигнут.
2. Для того, чтобы запустить иную программу из .COM программы, нужно совершить следующую последовательность действий:
1. Перед запуском новой программы необходимо сохранить все регистры (которые не должны модифицироваться), в том числе и SS:SP. Но это только для DOS 2.0 или меньшей версии. Хотя запуск на таком DOS’e маловероятен, но сказать об этом надо было.
2. Ограничить размер оперативной памяти для исходной программы.
3. Запустить новую программу.
4. Восстановить регистры.
5. Радоваться жизни.

.MODEL TINY
.DATA
tit DB 'Xaud (C) 2007.',13,10,'FORMATER is starting',13,10,'$'
unl DB 13,10,'FORMATER unloaded.',13,10,'$'
ErrText DB 'FORMATER: Error executing '
pr DB 'tasm.exe',0,13,10,'$'
param DB ' /?',13 ;Make always 1st byte = Space (20xH)
pb DW 00
OFFS DW OFFSET param
OSEG DW 0
DD -1
DD -1
sss DW 0
ssp DW 0
.CODE
ORG 100H
start:
mov ax,0900h
mov dx,OFFSET tit
int 21h
mov bx,100h+500+10h ;100xH - Always, + Program Size + Stack Size
mov sp,bx
mov ax,4a00h
mov cl,4
shr bx,cl
inc bx
clc
int 21h
push ds
pop es
push ds
mov dx,OFFSET pr
mov bx,OFFSET pb
mov OSEG,cs
mov ax,4b00h
mov cs:ssp,sp
mov cs:sss,ss
int 21h
cli
mov ss,cs:sss
mov sp,cs:ssp
sti
pop ds
jc Error
DoExit:
mov ax,0900h
mov dx,OFFSET unl
int 21h
mov ax,4c00h
int 21h
Error:
mov ax, 0900h
mov dx, OFFSET ErrText
int 21h
jmp DoExit
END start

Здравствуйте, Masada!
Небезызвестная программа “Hello, World!”, собственно, ничего кроме вывода текста не делает, т.е. она записывает это строчку (“Hello, World!”) в стандартный поток вывода, а из него на экран. Потому ничего существенного не изменится, если заменить эту строку на “format c:” (кроме отображенного текста на экране)…
Как, бы безобидная программка…но…
Можно пойти несколькими путями.
1. Нужно перенаправить поток вывода от программы с измененным текстом на вход другой (для которой это будет аналогично вводу с клавиатуры), и которая в нашем случае запустит все, что ей передадут. Используем для этих целей командный интерпретатор:

Пуск->Выполнить
Пишем:
world.com|cmd
, где world.com – модифицированная программа с нужным текстом,
cmd – командный интерпретатор.

Или на все случаи жизни:
world.com|%COMSPEC%
, где %COMSPEC% - переменная среды окружения, которая всегда должна содержать путь к командному интерпретатору (в том числе и в чистом DOS).

И получаем, что хотели…
Конечно, это не совсем тот метод, что требуется, но результат достигнут.
2. Для того, чтобы запустить иную программу из .COM программы, нужно совершить следующую последовательность действий:
2. 1. Перед запуском новой программы необходимо сохранить все регистры (которые не должны модифицироваться), в том числе и SS:SP. Но это только для DOS 2.0 или меньшей версии. Хотя запуск на таком DOS’e маловероятен, но сказать об этом надо.
2. 2. Ограничить размер оперативной памяти для исходной программы.
2. 3. Запустить новую программу.
2. 4. Восстановить регистры.
2. 5. Радоваться жизни.

TITLE FORMATER.ASM
.MODEL TINY ;тип модели для .COM файла
.DATA
tit DB 'Xaud (C) 2007.',13,10,'FORMATER is starting',13,10,'$'
unl DB 13,10,'FORMATER unloaded.',13,10,'$'
ErrText DB 'FORMATER: Error executing '
pr DB 'C:\WINDOWS\SYSTEM32\FORMAT.COM',0,13,10,'$' ;имя программы (c полным путем!).
param DB ' /?',13 ;параметры запуска программы. Заменить на ' C:' (изменено для безопасности). Первый символ всегда должен быть пробелом.
pb DW 00 ;Блок данных. Собственно, ничего менять здесь не надо
OFFS DW OFFSET param ;Указатель на программу (offset)
OSEG DW 0 ;то же (segment)
DD -1
DD -1
sss DW 0 ;Сохраняем SS:SP
ssp DW 0
.CODE
ORG 100H
start:
mov ax,0900h
mov dx,OFFSET tit
int 21h
mov bx,100h+500+10h ;100H - всегда (среда программы, задаваемая ОС), + примерный размер программы (округление в большую сторону) + желаемый размер стека. Все в байтах
mov sp,bx ;
mov ax,4a00h
mov cl,4
shr bx,cl ;Преобразуем байты в параграфы по формуле: (байт / 16) + 1 (параграф = 16 байтам)
inc bx
clc
int 21h ;Ограничиваем размер памяти размером в ВХ
push ds
pop es ;ES = DS
push ds ; сохраняем DS
mov dx,OFFSET pr
mov bx,OFFSET pb
mov OSEG,cs ;записываем значение сегмента в указатель на программу
mov ax,4b00h
mov cs:ssp,sp
mov cs:sss,ss ;сохраняем стековые регистры
int 21h
cli ;отменяем BIOS прерывания (иначе могут прервать выполнение программы в самый неподходящий момент, и стек будет установлен неправильно)
mov ss,cs:sss ;восстанавливаем стековые регистры
mov sp,cs:ssp
sti ;разрешаем прерывания
pop ds
jc Error ;CARRY FLAG - установлен если произошла ошибка при запуске. Если это случилось, выводим сообщение об ошибке (переходим на метку Error).
DoExit:
mov ax,0900h
mov dx,OFFSET unl
int 21h
mov ax,4c00h ; Выходим из программы
int 21h
Error:
mov ax, 0900h
mov dx, OFFSET ErrText
int 21h
jmp DoExit
END start

Компиляция обычная (для TASM):
tasm /zi formater
tlink /t formater
Ответ отправил: Xaud (статус: 2-ой класс)
Ответ отправлен: 28.09.2007, 21:40
Оценка за ответ: 5


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Авторское право: ООО "Мастер-Эксперт Про"
Техподдержка портала, тел.: +7 (926) 535-23-31
Хостинг: "Московский хостер"
Поддержка: "Московский дизайнер"
Авторские права | Реклама на портале
Версия системы: 4.60.05 от 27.09.2007
Яндекс Rambler's Top100
RusFAQ.ru | MosHoster.ru | MosDesigner.ru | RusIRC.ru
Kalashnikoff.ru | RadioLeader.ru | RusFUCK.ru

В избранное