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

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


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

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

Выпуск № 616
от 01.12.2006, 01:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 372, Экспертов: 25
В номере:Вопросов: 5, Ответов: 8


Вопрос № 64120: Ув. Boriss как вы и сказали добавил в код mov ax, 3 ; ah =0 - номер функции, al=3 - режим int 10h -------- Привожу пример (не забывайте я в бронепоезде) CSEG segment org 100h _beg: mov ax,0B800h mo...
Вопрос № 64166: Привет! У меня несколько вопросов. 1. Когда пишешь стандартным asm-овским синтаксисом, то имя сегмента указывается сразу (NameSegment segment). Как именуется сегмент если писать masm-овским синтаксисом (.code)? 2. Как происходит формирование...
Вопрос № 64184: что обозначает ASSUMECS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG?Где применяеться данная команда?...
Вопрос № 64201: Здравствуйте, уважаемые эксперты. У меня такой вопрос. Написал резидент, который по CTRL+s - выводит параметры диска,с которого запущена прога, по CTRL+x- выгружается из памяти. Писал используя проги из рассылки Калашникова. Запускал из Windows X...
Вопрос № 64212: Как удалить файл через функцию 41h прерывания №21h Если его атрибут только для чтения! ...

Вопрос № 64.120
Ув. Boriss

как вы и сказали добавил в код
mov ax, 3 ; ah =0 - номер функции, al=3 - режим
int 10h
--------
Привожу пример (не забывайте я в бронепоезде)

CSEG segment
org 100h
_beg:
mov ax,0B800h
mov ds,ax
mov di,0

mov ah,31
mov al,1
mov ds:[di],ax

mov ax, 3 ; ah =0 - номер функции, al=3 - режим
int 10h
mov ah,10h
int 16h

int 20h

CSEG ends
end _beg

В результате выполнения меняется размер окна ФАРА
но символа так и нету! Что делать? Как поправить код?
Пользуюсь Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International
Turbo Link Version 4.0 Copyright (c) 1991 Borland International

Отправлен: 25.11.2006, 09:49
Вопрос задал: Snik (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Олег Владимирович
Здравствуйте, Snik!
Не туда вставили :)
Режим должен меняться до вывода рожицы
CSEG segment
org 100h
_beg:
mov ax, 3 ; ah =0 - номер функции, al=3 - режим
int 10h
mov ax,0B800h
mov ds,ax
mov di,0

mov ah,31
mov al,1
mov ds:[di],ax

mov ah,10h
int 16h

int 20h

CSEG ends
end _beg


---------
Факультет ПМ-ПУ - лучший в СПбГУ!
Ответ отправил: Олег Владимирович (статус: 7-ой класс)
Ответ отправлен: 25.11.2006, 13:45


Вопрос № 64.166
Привет! У меня несколько вопросов.
1. Когда пишешь стандартным asm-овским синтаксисом, то имя сегмента указывается сразу (NameSegment segment). Как именуется сегмент если писать masm-овским синтаксисом (.code)?
2. Как происходит формирование адреса при создании 32 битной проги. Я знаю , что сегментная составляющая сдвигается на 4 при формировании линейного адреса, а потом добавляется смещение. Так ли для 32 битных прог?
3. На что похож вызов процедуры через invoke. Похож ли он на call? Ну и следовательно, что за "PROTO". Как я понимаю, таким образом создается прототипа процедуры. Можно ли через invoke вызывать процедуры из своей библиотеки *.lib. Я пиши через макрос прототип для каждой функции, который каждый передоваемый параметр ложит в стек и забирает от туда возвращаемые значения(сделано, что бы вдруг в стеке чего не оставить). Правильно ли я делаю или может есть более грамотные способы.

PS: И еще, ну это так, может руки кривые или компилил криво. Скомпили прогу и запустил через ollydbg. Так он мне половину кода не дизасемблировал. Причем тот код, который шел после mov eax, dword ptr es:[1ah].

Приложение:

Отправлен: 25.11.2006, 17:17
Вопрос задал: Oxaid (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 3)

Отвечает: IceWolf
Здравствуйте, Oxaid!
1)
Это так называемый упрощенный синтаксис, чтобы получить адрес сегмента существуют предопределённые имена:
data-сегмент данных, @code-понятно, @stack-тож понятно, etc.
Подробней смотрите в приложении.
2)
Насколько я понял, имеются ввиду Win32-программмы(32-битные регистры можно использовать и в 16-разрядных дос-программах и всё будет также) и модели памяти flat. Тогда нет, в защищенном режиме(Win32-приложения) адрес формируется иначе: механизм сложнее, почитать про это можно например на wasm.ru (цикл статей про защищённый режим) или, например, sasm.narod.ru
3)invoke Function, par1, par2, par3, ... <=>
...
push par3
push par2
push par1
call Function

>Как я понимаю, таким образом создается прототипа процедуры.
Правильно понимаете. А нужно это для того, чтобы проверить столько-ли передали параметров, сколько нужно.Т.е.
Function proto :DWORD, :DWORD, :DWORD означает, что нужно передать 3 параметра типа DWORD.

Можно. Если опишите прототип(см выше), и не только из .lib-файла, функция может быть в как самой программе, так и в DLL(нужен .lib-файл), так и в include-файле.

Как самому создавать invoke'абельные функции-смотри туторы Iczelion'a(wasm.ru), там же есть инструкция по создению invoke'абельной DLL'ки.

С сегментными регистрами под Win32 так обращатся нельзя(читай про защищённый режим), скорее всего из-за этогj оля и слгючила.
С уважением, IceW0|f.

Приложение:

---------
Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!

Ответ отправил: IceWolf (статус: 4-ый класс)
Ответ отправлен: 26.11.2006, 20:50


Вопрос № 64.184

что обозначает
ASSUMECS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG?Где применяеться данная команда?
Отправлен: 25.11.2006, 18:59
Вопрос задал: Metrok (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Вiктор
Здравствуйте, Metrok!
Это значит что сегментные регистры CS,DS,ES,SS будут содержать сегмент CSEG. Обычто такое делается в СОМ-файлах, где все сегменты указывают на один сегмет, в котором расположены и код, и данные, и стек.
(кстати, после ASSUME должен быть пробел: ASSUME CS:CSEG, ....)
Если этого не делать, то в таком случае если в коде будет длинный прыжок (на этот же сегмент), то ассемблер этого не поймёт и выдаст ошибку: jump or call to different CS, а если указать что CS будет содержать CSEG, то таких сообщений возникать не должно.
В ЕХЕ-файлах для каждой цели можно сделать отдельный сегмент, тогда может быть так:
ASSUME CS:Code_SEG, DS:Data_SEG, ES:Data_SEG2, SS:Stack_SEG
---------
ни дня без строчки (но не получается)
Ответ отправил: Вiктор (статус: 9-ый класс)
Ответ отправлен: 25.11.2006, 23:10
Оценка за ответ: 5
Комментарий оценки:
Отличный ответ.

Отвечает: Луковкин Николай Иванович
Здравствуйте, Metrok!
ASSUME - это директива, которая определяет назначение сегментов проги сегментным регистрам, т.е. помогает Ассемблеру преоброзовать метки в адреса, сообщая, каким регистром сегмента МЫ будем пользоваться при адресации этих меток.
Если Вы пишите COM-программу на Ассемблере, то в нем присутствует ВСЕГО ОДИН СЕГМЕНТ, назовем мы его CSEG.
Ваш пример:
ASSUME CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEG
говорит нам о том, что МЫ указываем Ассемблеру на то, что сегментные регистры CS, DS, ES, SS будут указывать на НАШ ЕДИНСТВЕННЫЙ сегмент - CSEG!
P.S. Думаю где применяется данная команда, ВАМ объяснять не надо: сообразите!
Желаю терпения и удачи в изучении замечательного языка, низкого уровня, но МОЩНОГО -Ассемблера!
Николай
---------
Главным критерием эффективности того или иного пути может служить лишь то, достиг или нет крекер конечного результата!!!
Ответ отправил: Луковкин Николай Иванович (статус: 3-ий класс)
Ответ отправлен: 29.11.2006, 10:20
Оценка за ответ: 5


Вопрос № 64.201
Здравствуйте, уважаемые эксперты. У меня такой вопрос.
Написал резидент, который по CTRL+s - выводит параметры диска,с которого запущена прога, по CTRL+x- выгружается из памяти. Писал используя проги из рассылки Калашникова. Запускал из Windows XP sp2(через FAR) работает(только не выгружается, а параметры диска показывает. Пришел сдавать начал запускать под ДОС - не работает.
Препод сказал, что Windows не пускает в ядро,а эмулирует доступ.Поэтому все работает нормально.А в ДОСе идет прямое обращение.сказал, что у меня что-то неправильно.я посмотрел все - не могу найти ошибку.

Приложение:

Отправлен: 25.11.2006, 21:19
Вопрос задал: JONNY (статус: Посетитель)
Всего ответов: 1
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: IceWolf
Здравствуйте, JONNY!
Поделюсь своим методом поиска таких ошибок:
1)Пишем вспомогательную программу(см приложение)
2)Запускаем резидент, ещё раз запускаем-отвечает, значит загрузился
3)Правим в резиденте:
MOV AX,CS
MOV DS,AX
IN AL,60H ;Получим скан-код клавиши
CMP CTRL_FLAG,1 ;ЗДЕСЬ
JNE CTRL ;Да -> CTRL
CMP AL,CTRLR_CODE ;Это отпускание CTRL
JE CTRLR ;Да -> CTRLr
CMP AL,AL ;И ЗДЕСЬ
JE VIVOD ;Да -> VIVOD
И ещё:
CTRL:
MOV CTRL_FLAG,1
JMP OLD_09H

Компилируем. Теперь после первого int9(независимо от AL) в CTRL_FLAG будет 1, а после второго-вывод параметров диска. Запускаем int9.com(программа из приложения) 1 раз, ещё 1 -и видим параметры диска.
4)Снова правим оригиналльный код:
IN AL,60H ;Получим скан-код клавиши
CMP CTRL_FLAG,1 ;Это нажатие CTRL
;ЗДЕСЬ ЧАСТЬ КОДА МОЖНО ВЫБРОСИТЬ
CMP AL,AL ;ТАК ЖЕ, КАК В ПРОШЛЫЙ РАЗ
JE REMOVE_JMP ;ТОЛЬКО ТЕПЕРЬ ВЫГРУЖАЕМСЯ
JMP OLD_09H

И ещё:
CTRL:
MOV CTRL_FLAG,1
JMP OLD_09H
Теперь после второго int9 программа должна выгрузится.
Запускаем int9.com 1 раз, второй раз-ответ-"ПРОГРАММА ВЫГРУЖЕНА ИЗ ПАМЯТИ".
Делем вывод-прерывание 9 не разу не вызывается при наборе на клавиатуре, т.е. код который мы меняли получает управление только при вызове int9 из какой-либо программы(как это делали мы). Скорее всего дело в эмуляторе дос ntvdm.exe-он не эмулирует вызов int9 при клавиатурном вводе(у меня(WinXPpro SP2)программа не из под far не из под cmd.exe/command.com не работала, как кстати и все резиденты, перехватывающие 9-ое прерывание).
С уважением, IceW0|f.

Приложение:

---------
Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!

Ответ отправил: IceWolf (статус: 4-ый класс)
Ответ отправлен: 26.11.2006, 22:27


Вопрос № 64.212
Как удалить файл через функцию 41h прерывания №21h
Если его атрибут только для чтения!

Приложение:

Отправлен: 25.11.2006, 23:11
Вопрос задал: Silinski I.L. (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Стас
Здравствуйте, Silinski I.L.!
Сначала снимаешь аттрибут:
mov ah,43h
mov dx,offset f
xor cx,cx
mov al,1
int 21h
затем удаляешь:
mov ah,41h
mov dx,offset f
int 21h
Ответ отправил: Стас (статус: Специалист)
Ответ отправлен: 26.11.2006, 02:36

Отвечает: IceWolf
Здравствуйте, Silinski I.L.!
Нужно снять этот аттрибут:
Функция 43h:
Вход:AH = 43H
DS:DX = адрес строки ASCIIZ с именем файла
AL=Код подфункции:0=извлечь текущий атрибут файла 1=установить атрибут файла
CX= новый атрибут файла (для подфункции 01H)
Выход: AX=код ошибки если CF установлен
CX=текущий атрибут файла (для подфункции 00H)
В атрибуте определены следующие биты:
╓7┬6┬5┬4┬3┬2┬1┬0╖
║ │a│d│v│s│h│r║
╙─┴─┴╥┴╥┴╥┴╥┴╥┴╥╜ бит маска
║ ║ ║ ║ ║ ╚═► 0: 1=только чтение (нельзя обновлять или удалять) (01H)
║ ║ ║ ║ ╚═══► 1: 1=спрятанный (02H)
║ ║ ║ ╚═════► 2: 1=системный (04H)
║ ║ ╚═══════► 3: 1=метка тома (08H)
║ ╚═════════► 4: 1=элемент подоглавления (10H)
╚═══════════► 5: архив. 1=копия файла НЕ создавалась (20H)
Работающая программа в приложении.
С уважением, IceW0|f.

Приложение:

---------
Идеальных защит не существует, ибо то, что создано человеческим разумом, им же будет и разрушено!

Ответ отправил: IceWolf (статус: 4-ый класс)
Ответ отправлен: 26.11.2006, 19:29

Отвечает: Брона Вячеслав
Здравствуйте, Silinski I.L.!
Сначала установите файлу атрибут "архивный" в единицу и очистите все остальные.
А потом уже удаляйте.
Ответ отправил: Брона Вячеслав (статус: 1-ый класс)
Ответ отправлен: 27.11.2006, 12:21


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

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

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

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

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


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


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное