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

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


Служба Рассылок Subscribe.Ru

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

Выпуск N 116

Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"

Дата выхода: 2001-10-11


Вопрос №1178

Как бороться с этой ошибкой:
Assembling file: life.asm
**Fatal** life.asm(1) Line too long
Turbo Assembler Version 4.1

Ответ

Здравствуйте, tim!
В Асме существует два вида коментариев
точка с запятой-коментарий до конца строки
и
Comment <символ>
где <символ>-любой символ, коментарий идет до строки, где встретится такой же символ
В первой строке у тебя объявляется такой коментарий($)
и черте где он заканчивается
Может это убрать, и закоментарить стандартными (;)
ЗЫ Я когда-то сам на паскале эту вещь реализовал...Ностальжи:)
А по поводу призов за голосование-экспертам там что-то обещают(показы баннеров, WMR)-можно и выигравшему то же, но есстессно меньше:)


Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 171

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1177

Привет всем! У меня тут пара вопросов:
1. Команда Ret - возврат из процедуры,
а команды RetN и RetF? И вообще какие команды возврата ещЈ сушествуют?
2. В Turbo Pascal надо запустить несколько процедур в фоновом режиме. Я знаю, что надо прехватить прерывание 1Ch. Но как в обработчике прерывания запустить эти процедуры я незнаю.

Ответ

Здравствуйте, Andrey!

Команда ret - общий вид еоманды завершения процедуры. Компилятором она преобразуется к виду retn или retf в зависимости от типа процедуры - ближняя или дальняя. Если не оформлять процедуру при помощи кончтрукции proc/endp, то в моделях памяти TINY, SMALL и COMPACT используется по умолчанию retn, а для моделей MEDIUM, LARGE, HUGE, TPASCAL - retf.

Что Вы понимаете под "какие команды возврата еще сушествуют"? Вообще-то, существует только одна команда ret. Ну, плюс еще команда iret для завершения обработчика прерывания. Ну и модификация ret для завершения процедуры с одновременой очисткой стека. В основном для возврата из процедур, предназначенных для использования с паскаль-программами. Ее вид - ret n, где n - число слов, извлекаемых из стека.

А если Вас интересует, как можно извратиться с возвратом из процедуры, то тут поле для деятельности неограничено. Например, я люблю следующий трюк (для сопряжения с Паскалем, с Си не пройдет!):

PascalProc proc far
pop [EndProc_Ofs]
pop [EndProc_Seg]
....
db JMPFAR ; код команды jmp far. В начале определяется константа JMPFAR EQU 0eah

EndProc_Ofs dw ?
EndProc_Seg dw ?

PascalProc endp

Т.е. в начале процедуры я извлекаю из стека адрес возврата и дописываю его в команду jmp far в качестве непосредственного операнда. А в самой процедуре с параметрами я работаю, непосредственно извлекая их из стека, записывая их в регистры. Так быстрее, чем обращаться к ним через обычные методы адресации параметров через стек.

2. А какие проблемы с запуском процедур? Они вызываются так же, как и обычные процедуры. Только надо учесть, что при вызове обрабьтчика прерывания указатель регистра данных (ds) установлен неизвестно на что. Так что надо сохранить ds и установить его на сегмент данных программы. А то ничего паскалевого работать не будет! :)


Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 27

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1178

Как бороться с этой ошибкой:
Assembling file: life.asm
**Fatal** life.asm(1) Line too long
Turbo Assembler Version 4.1

Ответ

Здравствуйте, tim!

Вот уж и не знаю... MASM - оно, может быть, и хорошо, но TASM - лучше! В TASM'е у меня все скомпилировалось нормально, только предупреждения по поводу использования зарезервированных слов в качестве имен переменных.


Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 28

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1172

Уважаемые эксперты
Подскажите
IDE для кодирования на ассемблере
Чтобы команды одним шрифтом
операнды другим
а дерективы третим
И чтобы project manager был, а то NotePad достал уже
И еще чтобы параметры в командной строке после TASM можно было редактировать
Короче IDE под ассемблер

Ответ

Здравствуйте, ivekm!
Под win32 это безусловно ASMedit а если хотите под дос то это TASMedit
(а зато там все на руском! )


Отправил эксперт: Bart Simpson
Эксперт отправил ответов (всего): 8

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1180

Программа написана на ASM. При компиляции ее TASM'ом размер ее - 143b, а при компидяции MASM'ом - 125b. Какие необходимы параметры для TASM'а, чтобы она компилировалась в 125b?

Ответ

Здравствуйте, Константин!

А программу приложить???


Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html - Операционная система с нуля!)
Эксперт отправил ответов (всего): 168

Экспертная группа: Оптимизация программ

Вопрос №1180

Программа написана на ASM. При компиляции ее TASM'ом размер ее - 143b, а при компидяции MASM'ом - 125b. Какие необходимы параметры для TASM'а, чтобы она компилировалась в 125b?

Ответ

Здравствуйте, Константин!
Без программы точно невозможно сказать, а решение, лежащее на поверхности-поставить многопроходную компиляцию:
параметр /m9 - компилировать 9 раз,
хотя прог, где надо больше 3 проходов, не встречал...


Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 172

Экспертная группа: Оптимизация программ

Вопрос №1181

Ну и оперативность!!! ВОт программа:

Ответ

Здравствуйте, Константин!

Поставь для tasm ключик /m2
Это указание что компилировать нужно за два прохода.

Просто ты используешь .386
на 386 условные переходы могут быть двух видов
на +-128 байт (ну примерно :)
или на +-32к или +-2G

первый или двушечный вариант занимает два байта,
второй (в зависимости от типа сегмента) от 4 до 7.

тасм, при одном проходе не может знать на сколько байт будет переход и резервирует для команд перехода 4 байта, для того чтобы была возможность использовать близкие переходы вместо коротких при необходимости. необходимости не возникает. все переходы компилируются в короткие. два байта заполняются nop.

В твоей программе 9 условных переходов, следовательно 18 байт потерь.

125 + 18 = 143





Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html - Операционная система с нуля!)
Эксперт отправил ответов (всего): 169

Экспертная группа: Оптимизация программ

Вопрос №1172

Уважаемые эксперты
Подскажите
IDE для кодирования на ассемблере
Чтобы команды одним шрифтом
операнды другим
а дерективы третим
И чтобы project manager был, а то NotePad достал уже
И еще чтобы параметры в командной строке после TASM можно было редактировать
Короче IDE под ассемблер

Ответ

Здравствуйте, ivekm!
Очень хороший IDE - это TASMEDIT. Где его найти, я Вам сказать затрудняюсь, но поищите в www.filesearch.ru (ищите tasmed.zip/rar/arj). Известные глюки в версии 1.85 - не очень корректно запускает из-под себя tasm и tlink, но можно в нем писать, а компилить отдельно. Если надо, у меня есть к нему кряк и пара самописных bat-файлов для компиляции. Пиши.


Отправил эксперт: baldr (http://www.dospage.fromru.com - Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 1

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1157

Здравствуйте, Эксперты!!!!

1) Объястните почему при обращении к функции
GetKeyboardState при просмотре буффера
(256 байт), то ячейки которые отвечают за
"индикатор" (0х14 - CapsLock,
0x90 - NumLock & 0x91 - ScrollLock)
Содержат не то!!! т.е. при всех "выключенных"
диодах отображаеться(на выходе), что нажата NumLock
Хотя пример из которого это содрал работал нормально!!!!
2) Есть ли другой способ проверить "индикатор"
или установить его новые значения т.е. аналог функций
GetKeyboardState & SetKeyboardState
3) Почему-то этот фрагмент не работает под Windows9х? Хотя
я слышал, что можно обращаться к портам....

mov al,0edh
out 60h,al
L1: in al,64h
test al,0010b
jnz L1
mov al,101b ; где бит:0-Scrol lock, 1-num lock, 2-Caps
out 60h,al

Ответ

Здравствуйте, Дмитрий!
Я, честно говоря, не совсем понимаю, что это за буфер в 256 байт, но все делается
гораздо проще. В сегменте данных BIOS (сегмент 0040h) по смещению 0017h находится байт состояния клавиатуры 1.
бит 7 =1 INSert активен
бит 6 =1 Caps Lock активен
бит 5 =1 Num Lock активен
бит 4 =1 Scroll Lock активен
бит 3 =1 любая Alt нажата
бит 2 =1 любая Ctrl нажата
бит 1 =1 Left Shift нажата
бит 0 =1 Right Shift нажата
Изменяя его соответствующим образом, можно получить соответствующие сочетания клавиш...


Отправил эксперт: baldr (http://www.dospage.fromru.com - Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 2

Экспертная группа: Оптимизация программ

Вопрос №1132

Здравствуйте, Экспекты!

Меня тут препод по программингу нагрузил: придумать самому себе задание и его же реализовать. Я думал-думал, на ум что-то ничего не идет. Может подкинете идейку насчет того, какую прогу написать, чтобы не слишком простая была и не слишком сложная (тесты и м/м энциклопедии не предлагать). У самого уже воображения не хватает.
HELP бедному студенту!

Ответ

Здравствуйте, Shorty!
Предлагаю написать полиморфный резидентный вирус под Windows :))

(Сам просид - не слишком легкую) :))) Вроде и не слишком сложно...
Как тебе ? :)) Cлабо??? :))
Ну а если это слишком легко - то тогда добавь еще и антиэвристические приемы :))) И технологию UEP

-=-=-= CodeBuilder -=-=-=
codebuilder@chat.ru


Отправил эксперт: Евгений
Эксперт отправил ответов (всего): 21

Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32

Вопрос №1186

Здравствуйте эксперты

Подскажите где взять ASMEdit

Заранее благодарен

Ответ

Здравствуйте, ivekm!
www.download.com


Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 26

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1182

Хочу купить riva tnt pro 32mb
Какие у неё характеристики? и вообще как ведет себя в играх, при просмотре фильмов?

Ответ

Здравствуйте, Владимир!
Не бери этот отстой покупай GeForce хотя бы 2MX. рива хреновая карта. У нее сам движок хуже. И позже если ты хочешь играть в потрясные игры ты поймешь эту разницу. А GeForce хоть и дороже, но она оправдывает свою цену.(лучше конечно GTS,а не 2MX).Выбор за тобой.


Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 27

Экспертная группа: Модели, виды и типы компьютеров (hard)

Вопрос №1181

Ну и оперативность!!! ВОт программа:

Ответ

Здравствуйте, Константин! И?


Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 28

Экспертная группа: Оптимизация программ

Вопрос №1182

Хочу купить riva tnt pro 32mb
Какие у неё характеристики? и вообще как ведет себя в играх, при просмотре фильмов?

Ответ

Здравствуйте, Владимир!
Характеристики: 32мб АГП..с поддержкой директ3Д..OPenGL
но нет 3dfx интерфейса....который желателен для промотра фильмоф многих геймов, но есь 3D аксселератры которые эмулируют 3дфх(конечно ето не сравнится с аксселератором ввиде платы)..котрые сделают те 3дфх...


Отправил эксперт: змей
Эксперт отправил ответов (всего): 66

Экспертная группа: Модели, виды и типы компьютеров (hard)

Вопрос №1185

Здравствуйте эксперты

Подскажите где взять ASMEdit

Заранее благодарен

Ответ

Здравствуйте, ivekm!
www.avtlab.ru


Отправил эксперт: Broken Sword (http://www.revolution.co.uk - скрытая реклама...)
Эксперт отправил ответов (всего): 183

Экспертная группа: Работа с MASM/TASM

Вопрос №1184

Уважаемые профессионалы...

Подскажите, pls как асмом создать папку, в которой создать файл и записать в него каку-нибудь строку???

Только сильно не пинайте за ламерские вопросы, я читал как это делается, но не вЪехал.
Насколько я понял директория создаётся функцией 39h, при этом в DX - offset переменной, содержащей путь...

А файл создать - это вроде 3сh, но нужно указать атрибуты, а какие они бывают??? и неясно чего ложить в dx...

А чтобы открыть файл нужно какой-то код открытия и указатель - увы не знаю что это такое...

Пожалуйста поподробнее, если можно
Заранее благодарен.

Ответ

Здравствуйте уважаемый, см. приложение.
1. Создаем директорию (как вы правильно заметили - 39h функция 21h прерывания), в dx ложим адрес переменной (dir), содержащей путь, в котором последняя директория пока еще не существует (C:\TESTDIR - так вот этот TESTDIR пока еще не существует (до int 21h)). Причем, заметьте, что эта самая dir заканчивается НУЛЕМ!!! (это чтобы знать где конец пути).

2. Создаем файл в еще тепленькой директории. Для этого сущ. 3Ch функция прерывания 21h. В dx аналогично п.1 ложим адрес переменной file, которая содержит полный путь и имя файла, который мы собираемся замутить. (тоже заканчивается 0!!!!!) насчет атрибутов - они в CX:
если бит 0 регистра CX = 1, то создаваемый файл будет иметь атрибут "только для чтения".
если бит 1 регистра CX = 1, то создаваемый файл будет иметь атрибут "скрытый"
вообщем, 2 бит - системный файл, 3 - метка тома (игнорируется), 4 - директория (должен быть 0), 5 - архивный бит (1, если файл не сохранялся), 6-не используется, 7-для Novel NetWare

3. Можно даже не открывать, а сразу писать в него чето. ah=40h, в bx - идентификатор файла, в который собираемся писать (вот для чего команда mov bx,ax), cx-число байтов, к-рые собираемся писать, dx- адрес буфера с данными (здесь уже никаких 0 в конце не нада, все определяется cx)

Есть кой-какая хрень - это определение имени создаваемого файла за создаваемой директорией, получается 2 раза одно и тоже - это нехорошо. Я подумаю, че можно присочинить, пока так.


Приложение:


Отправил эксперт: Broken Sword (http://www.revolution.co.uk - скрытая реклама...)
Эксперт отправил ответов (всего): 184

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1183

Уважаемые профессионалы...

Подскажите, pls как асмом создать папку, в которой создать файл и записать в него каку-нибудь строку???

Только сильно не пинайте за ламерские вопросы, я читал как это делается, но не вЪехал.
Насколько я понял директория создаётся функцией 39h, при этом в DX - offset переменной, содержащей путь...

А файл создать - это вроде 3сh, но нужно указать атрибуты, а какие они бывают??? и неясно чего ложить в dx...

А чтобы открыть файл нужно какой-то код открытия и указатель - увы не знаю что это такое...

Пожалуйста поподробнее, если можно
Заранее благодарен.

Ответ

Здравствуйте, Semmy!

Ну, вот пример создания, записи и закрытия файла. Вроде с комментариями :)

Приложение:


Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 29

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1191

Существует ли в Ассемблере понятие массива? Если да, то как можно создать массив, удалить его, управлять им и т. д.? Какие команды/прерывания для этого предназначены (можно просто перечислить)? Относится ли команда LEA к массивам? Что она вообще такое?
Спасибо

Ответ

Здравствуйте, Warewolf!

Что Вы имеете в виду под понятием массива? Если Вы хотите описание типа lalala array [1..100] - то нет.

Но с массивом тем не менее можно работать. См. кусок кода

А по поводу lea, то это команда загрузки адреса в регистр. Может использоваться где угодно и в качестве операнда может быть использовано любое допустимое выражение. В простейшем случае используется выражение
lea reg, stroka
которое компилятор преобразует в
mov reg, OFFSET stroka

lea - это полноправная команда процессора и выполняется. Выражение OFFSET stroka вычисляется в момент компиляции и является константой.

Приложение:


Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 30

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1191

Существует ли в Ассемблере понятие массива? Если да, то как можно создать массив, удалить его, управлять им и т. д.? Какие команды/прерывания для этого предназначены (можно просто перечислить)? Относится ли команда LEA к массивам? Что она вообще такое?
Спасибо

Ответ

Здравствуйте, Warewolf!
Массив описывается так
MyArr db 100(?)
MyArr-имя
db - размер элементов
100 - размер массива
Обращение
mov ax, MyArr[bx]; в bх индекс, как индексирующие регистры можно использовать bx, si, di (в режиме 386-все)
Для работы с массивом можно применять строковые команды типа stos movs и тп
LEA Загрузка исполнительного адреса
Признаки не меняются.
Команда: LEA destination,source.
Логика : destination = Addr(source).
Команда LEA присваивает значение смещения (offset) операнда source (а не его значение !) операнду destination. Операнд source должен быть ссылкой на память, а в качестве операнда destination может выступать любой 16-битный регистр, кроме сегментных.
Примечания :
Эта команда имеет то преимущество по сравнению с использованием оператора OFFSET в команде MOV, что операнду source можно иметь индексы. Например, следущая строчка не содержит ошибок :
LEA BX,TABLE[SI]
в то время, как строка
MOV BX,OFFSET TABLE[SI]
ошибочна, так как оператор OFFSET вычисляется во время ассемблирования, а указанный адрес не будет известен до тех пор, пока программа не будет запущена на счет.


Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 173

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1183

Уважаемые профессионалы...

Подскажите, pls как асмом создать папку, в которой создать файл и записать в него каку-нибудь строку???

Только сильно не пинайте за ламерские вопросы, я читал как это делается, но не вЪехал.
Насколько я понял директория создаётся функцией 39h, при этом в DX - offset переменной, содержащей путь...

А файл создать - это вроде 3сh, но нужно указать атрибуты, а какие они бывают??? и неясно чего ложить в dx...

А чтобы открыть файл нужно какой-то код открытия и указатель - увы не знаю что это такое...

Пожалуйста поподробнее, если можно
Заранее благодарен.

Ответ

Здравствуйте, Semmy!
1.)

Создание подкаталога:
DS:DX должны указывать на строку, дающую накопитель и путь к
каталогу, в котором должен быть создан подкаталог. Строка должна
завершаться байтом ASCII 0. Для открытия подкаталога с именем
PRIMATES в корневом каталоге накопителя A: надо записать строку в
виде "A:\PRIMATES". Для открытия подкаталога в другом подкаталоге
с именем MAMMALS напишите "A:\MAMMALS\PRIMATES". Имя накопителя
A: может быть опущено если Вы работаете с накопителем, используе-
мым по умолчанию, и путь может начинаться с текущего каталога.
Поместите в AH 39H и выполните прерывание 21H; если указан пра-
вильный путь, то будет создан новый каталог. В противном случае
будет установлен флаг переноса, а AX будет содержать код ошибки 3
(путь неверен) или 5 (нет доступа). В примере создается подката-
лог PRIMATES:
;---в сегменте данных
PATH DB 'A:MAMMALS\PRIMATES',0

;---создаем подкаталог с именем PRIMATES
LEA DX,PATH ;DS:DX должны указывать на путь
MOV AH,39H ;номер функции
INT 21H ;создаем подкаталог
JC ERROR_ROUT ;обработка ошибок
2.)

Создание файла:
DOS Fn 3cH: создать файл через описатель
Вход

AH = 3cH
DS:DX = адрес строки ASCIIZ с именем файла
CX = атрибут файла
Выход
AX = код ошибки если CF установлен и описатель файла если ошибки нет
Описание:
DS:DX указывает на строку ASCIIZ в формате: "d:\путь\имяфайла",0. если диск и/или путь опущены, они принимаются по умолчанию.

файл создается в указанном (или умалчиваемом) оглавлении
файл открывается в режиме доступа чтение/запись
вы должны созранить описатель (handle) для последующих операций
если файл уже существует: при открытии файл усекается до нулевой длины
если атрибут файла - только чтение, открытие отвергается (атрибут можно изменить функцией 43H изменить атрибут)
CONFIG.SYS специфицирует число доступных описателей в системе
используйте функцию 5bH создать Новый файл, если вы не хотите перекрывать (усекать) существующий файл.

и так далее...
http://www.ya.ru/yandsearch?text=3ch+-+%F1%EE%E7%E4%E0%F2%FC+%F4%E0%E9%EB
http://www.codenet.ru/progr/dos/int_0026.php


Отправил эксперт: UFO
Эксперт отправил ответов (всего): 16

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Подписаться на рассылки

Рассылки Subscribe.Ru
Ассемблер? Это просто! Учимся программировать
Ассемблер? Это просто! Учимся программировать (FAQ)

Форма подачи вопроса

ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!

Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!


Ваше имя *:

Ваш e-mail *:

Подгруппы:

Вопрос *:

Прилагаемая программа (если необходимо):


Регистрация в качестве эксперта

Архив выпусков


Ведущий рассылки,

Калашников Олег: Assembler@Kalashnikoff.ru
ICQ No.:
68951340
URL сайта подписчиков: http://www.Kalashnikoff.ru

______________

По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

  1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
  2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
  3. Издание книги (спонсорство): Sponsor@Kalashnikoff.ru

Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное