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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 513
от 30.03.2003, 19:50

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 2874
Отправлено ответов: 8518
Активность: 296.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Samodelkin
Статус: Начальный
Общий рейтинг: 128.57
[Подробней >>]
Joy
Статус: Опытный
Общий рейтинг: 129.66
[Подробней >>]
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 150.33
URL: Программирование
[Подробней >>]
 
Igoryk
Статус: Профессиональный
Общий рейтинг: 125.72
URL: IgorykSoft
[Подробней >>]
Ayl
Статус: Профессиональный
Общий рейтинг: 118.47
[Подробней >>]
Maverick
Статус: Профессиональный
Общий рейтинг: 136.72
URL: Задачи по ассемблеру
Телефон: 89039415024 (BeeLine GSM)
[Подробней >>]
 
DiGiT[old]
Статус: Профессиональный
Общий рейтинг: 111.11
[Подробней >>]
Andrew Vext
Статус: Опытный
Общий рейтинг: 107.21
[Подробней >>]
WNA
Статус: Начальный
Общий рейтинг: 107.74
[Подробней >>]
 
akul
Статус: Опытный
Общий рейтинг: 116.03
Телефон: +6019-6416245
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 2840. Немогу понять что такое макроопределения? Приведите пример... (ответов: 5)
Вопрос № 2841. Начал изучать ассемблер по книжке слитой с сайта Bob Johnsona. вроде что-то получается, вот только в... (ответов: 4)
Вопрос № 2842. Я опять к вам. В рассылке по делфи мне сказали что всё работает. Посмотрите приложение. Эта программ... (ответов: 1)
Вопрос № 2843. Привет, Эксперты! У меня такой вопрос - я написал программу, которая соединяется с удаленным компьют... (ответов: 2)
Вопрос № 2845. Hi all. Дайте код ребута. Очень хотелось бы иметь несколько вариантов, я имею ввиду чтоб програмулин... (ответов: 4)
Вопрос № 2846. Здравствуйте! Почему не правилльно работает моя примитивная программа? Вместо одного слова "P... (ответов: 8)
Вопрос № 2847. Здравствуйте эксперты. У меня такой вопрос. Как получить количество секторов и дорожек на диске, есл... (ответов: 2)

Вопросов: 7, ответов: 26


 Вопрос № 2840

Немогу понять что такое макроопределения?
Приведите пример



Вопрос отправлен: 25.03.2003, 18:21
Отправитель: Андрей (lalapa@yandex.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Samodelkin

Здравствуйте, Андрей!
макроопределения есть просто подстановка содержимого макроса в текст программы... они помогают сократить текст программы и сделать ее читабельнее, например если мне часто приходиться заносить в стек подряд три переменные, то я могу в начало проги внести:
MACRO qwe x,y,z
push x
push y
push z
ENDM
и если дальше по тексту встретится например такое:
qwe eax,offset buffer,edi
компилятор такую строку подменит на:
push eax
push offset buffer
push edi
итог - с каждой подменой трех push на вызов макроса программа становиться на две
строки короче, если не считать тело макроса, которое может храниться в отдельном файле, тогда в начало проги надо будет внести строку
include имя_файла_с_макроопределениями


Ответ отправлен: 27.03.2003, 10:39
Отправитель: Samodelkin


Отвечает Joy

Добрый день, Андрей!
В книге у Зубкова (взять можно с сайта Боба Джонсона) в главе 3.5 очень понятным языком написано про макроопределения!
А вот пример (от туда же):
hex2ascii macro
cmp al,10
sbb al,69h
das
endm
Теперь, где бы ты в программе не вставил строку hex2ascii, при компиляции она будет меняться на:
cmp al,10
sbb al,69h
das


Ответ отправлен: 26.03.2003, 10:34
Отправитель: Joy


Отвечает Bob Johnson

Доброе время суток, Андрей!
Вот цитата из книги Зубкова:
3.5. Макроопределения
Одно из самых мощных языковых средств ассемблера - макроопределения. Макроопределением (или макросом) называется участок программы, которому присвоено имя и который ассемблируется всякий раз, когда ассемблер встречает это имя в тексте программы. Макрос начинается директивой MACRO и заканчивается ENDM. Например: пусть описано макроопределение hex2ascii, переводящее шестнадцатеричное число, находящееся в регистре AL, в ASCII-код соответствующей шестнадцатеричной цифры:
hex2ascii macro
cmp al,10
sbb al,69h
das
endm
Теперь в программе можно использовать слово hex2ascii, как если бы это было имя команды, и ассемблер заменит каждое такое слово на три команды, содержащиеся в макроопределении. Разумеется, можно оформить этот же участок кода в виде процедуры и вызывать его командой CALL - если процедура вызывается больше одного раза, этот вариант программы займет меньше места, но вариант с макроопределением станет выполняться быстрее, так как в нем не будет лишних команд CALL и RET. Однако скорость выполнения - не главное преимущество макросов. В отличие от процедур макроопределения могут вызываться с параметрами, следовательно, в зависимости от ситуации, включаемый код будет немного различаться, например:
s_mov macro register1,register2
push register1
pop register2
endm
Теперь можно использовать S_MOV вместо команды MOV для того, чтобы скопировать значение из одного сегментного регистра в другой.
Следующее важное средство, использующееся в макроопределениях, - директивы условного ассемблирования. Например: напишем макрос, выполняющий умножение регистра AX на число, причем, если множитель - степень двойки, то умножение будет выполняться более быстрой командой сдвига влево.
fast_mul macro number
if number eq 2
shl ax,1 ; Умножение на 2
elseif number eq 4
shl ax,2 ; Умножение на 4
elseif number eq 8
shl ax,3 ; Умножение на 8
... ; Аналогично вплоть до:
elseif number eq 32768
shl ax,15 ; Умножение на 32768
else
mov dx,number ; Умножение на число, не являющееся
mul dx ; степенью двойки.
endif
endm
Можно, конечно, усложнить этот макрос, применяя особые свойства команды LEA и ее комбинации, сдвиги и сложения, однако в нынешнем виде он чрезмерно громоздкий. Проблема решается с помощью третьего средства, постоянно использующегося в макросах, - блоков повторений.


Ответ отправлен: 26.03.2003, 17:40
Отправитель: Bob Johnson


Отвечает Igoryk

Доброе время суток, Андрей!
Макроопределения - это такая возможность Ассемблера вставлять в программу (где указано) последовательность команд.
Пример (TASM):
MyMacros macro
mov ax, bx
mov bx, cx
endm
Теперь если ты в своей программе вместо этих команд напишешь mymacros, то Ассемблер(программа) вставит текст макроса там, где ты указал.

Ответ отправлен: 26.03.2003, 18:14
Отправитель: Igoryk


Отвечает Ayl

Добрый день, Андрей!
Макроопределения - это механизм подстановки, позволяющий заменять символьные имена в программе текстовыми строками или блоками программного кода.
Пример:
PUSHALL macro
push ax bx cx dx di si bp
push ds es
endm
В тексте программе в месте появления команды PUSHALL в выполняемый код будет вставлен фрагмент сохранения регистров как указано в макроопределении.

Ответ отправлен: 25.03.2003, 18:39
Отправитель: Ayl


 Вопрос № 2841

Начал изучать ассемблер по книжке слитой с сайта Bob Johnsona. вроде что-то получается, вот только в 4ой главе есть резкий переход от простых прог к более сложным. и вот никак не могу перешагнуть эту черту между прогами. Подскажите, что можно почитать еще?



Вопрос отправлен: 25.03.2003, 18:31
Отправитель: Max (chatovec@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Joy

Доброе время суток, Max!
А ты какую книгу скачал и что тебе стало не понятно в четвертой главе? А почитать из разряда "по-проще" можно почитать рассылке О. Калащникова (там же, у Боба можно взять)

Ответ отправлен: 26.03.2003, 10:34
Отправитель: Joy


Отвечает Samodelkin

Здравствуйте, Max!
Питера Абеля почитайте (название то ли просто "Ассемблер", то ли "Язык ассемблера", я на обложки не больно-то смотрю). Я с нее начинал - случайно попалась и увлеклаааа.... :)


Ответ отправлен: 27.03.2003, 10:41
Отправитель: Samodelkin


Отвечает Ayl

Доброе время суток, Max!
На самом деле это все очень индивидуально. Ты прислал бы прогу, что ли, в которой не можешь разобраться...
На самом деле у меня тоже был похожий случай. Изучал я Си по книжке Кернигана и Ритчи. И вроде все там понятно было написано, но как только я начинал 6-ю главу (указатели) - как отрубало - ничего не понятно. :-( 3 раза перечитывал с начала - не помогает. Только когда на лекциях их начали изучать - ствло лучше.
Так что скорее всего тебе не книжки другие искать надо, а людей, которые смогут тебе объяснить именно то, что ты не понимаешь.

Ответ отправлен: 27.03.2003, 10:27
Отправитель: Ayl


Отвечает Maverick

Доброе время суток, Max!
У него там неск-ко книг, какая?
Ну если не можешь разобраться, то спрашивай, поможем, для того и существует эта рассылка.


Ответ отправлен: 27.03.2003, 04:46
Отправитель: Maverick


 Вопрос № 2842

Я опять к вам. В рассылке по делфи мне сказали что всё работает. Посмотрите приложение. Эта программа должна выводить инфу о модеме. У меня она выводит нули.
Модем у меня на COM4. Форма состоит из трёх Label(l1,l2,l3), двух кнопок и таймера.


Приложение:


Вопрос отправлен: 25.03.2003, 23:16
Отправитель: URiS (urisff@inbox.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Приветствую Вас, URiS!
1. Раз уж используешь API функции, то пиши их правильно! Хоть делфи регистр символов пофигу, но все-же правильно будет CreateFile.
2. Вероятно это зависит от операционной системы, т.к. под хр все работает, но!
2.1. Ты открываешь com-порт либо на чтение, либо на запись или для того и другого, соответственно указывай второй параметр как GENERIC_READ или GENERIC_WRITE (или оба).
2.2. При работе с ком портом никакой речи о шаре быть не может, т.е. третий параметр должен быть 0.
2.3. Предпоследний параметр отвечает за флаги, а не последний! (FILE_FLAG_OVERLAPPED)
2.4. Последний параметр представляет собой handle на template файл и для ком порта должен быть равен 0.
2.5. Зачем тебе overlapping? Это абсолютно излишне.
3. В итоге получаем:
h := CreateFile ('COM2', GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
Вот так должно работать везде.


Ответ отправлен: 26.03.2003, 17:40
Отправитель: Bob Johnson


 Вопрос № 2843

Привет, Эксперты!
У меня такой вопрос - я написал программу, которая соединяется с удаленным компьютером и т.д., но это не важно. Я хочу спросить можно ли создать еще несколько трэдов в которых выполняется тоже самое? TIA



Вопрос отправлен: 26.03.2003, 15:26
Отправитель: Deny

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Доброе время суток, Deny!
Да, если сервер, с которым ты соединяешься поддерживает несколько одновременных соединений (т.е. он должен тоже иметь в общем случае несколько тредов).


Ответ отправлен: 26.03.2003, 23:36
Отправитель: Bob Johnson


Отвечает DiGiT[old]

Добрый день, Deny!
ну ты и написал трэд. Писал бы потоки или threads, чтобы понятно было. Вопрос №1) как соединяется с другим компом ??
Если TCP/IP и ты юзаешь сокеты, то можно, правда здесь большую роль играет как сервер обрабатывает accept, если в отдельном потоке, то все возможно.
ЗЫ ставь вопрос поконкретнее

Ответ отправлен: 27.03.2003, 04:56
Отправитель: DiGiT[old]


 Вопрос № 2845

Hi all.
Дайте код ребута.
Очень хотелось бы иметь
несколько вариантов, я имею ввиду чтоб
програмулину можно было скомпилить как под дос
так и под линух(tasm/nasm). Чтоб быстро, легко
и без последствий.
Заранее благодарен.



Вопрос отправлен: 26.03.2003, 17:02
Отправитель: Tibor

[Следующий вопрос >>] [Список вопросов]

Отвечает Igoryk

Здравствуйте, Tibor!
Ну вот такой есть:
jmp far 0000:0000h

Ответ отправлен: 26.03.2003, 20:49
Отправитель: Igoryk


Отвечает Samodelkin

Приветствую Вас, Tibor!
ну как вариант дальний jmp на начало биоса... е может не код reboot'а, а код boot'а? тогда с любой системной дискетки первый сектор срисуй, там первые два байта - jmp на этот самый код (это для ДОС, в линухе дискетами пользоваться не приходилось :)


Ответ отправлен: 27.03.2003, 10:54
Отправитель: Samodelkin


Отвечает Maverick

Добрый день, Tibor!
Давай мыло, скину небольшую коллекцию из какого то вирного журнала.
Maverick@nightmail.ru


Ответ отправлен: 27.03.2003, 04:46
Отправитель: Maverick


Отвечает DiGiT[old]

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

Ответ отправлен: 27.03.2003, 04:51
Отправитель: DiGiT[old]


 Вопрос № 2846

Здравствуйте!
Почему не правилльно работает моя примитивная программа?
Вместо одного слова "Privet" она выводит кучу левого текста.
СПАСИБО.


Приложение:


Вопрос отправлен: 26.03.2003, 17:33
Отправитель: Vlad

[Следующий вопрос >>] [Список вопросов]

Отвечает Joy

Добрый день, Vlad!
Если ты только начал изучать АССМ, то изучай его по рассылке О. Калашникова! Все намного проще и понятней.
PS. Твой код, переделанный и, естественно, рабочий в приложении.

Приложение:

Ответ отправлен: 27.03.2003, 11:23
Отправитель: Joy


Отвечает Andrew Vext

Доброе время суток, Vlad!
Вы не задали значение для сегментного регистра DS.
Строка ищется по адресу DS:DX - в DS у вас неизвестно что.

Ответ отправлен: 27.03.2003, 13:00
Отправитель: Andrew Vext


Отвечает Ayl

Доброе время суток, Vlad!
Ну так блин. Судя по коду ты компилируешь прогу в EXE-файл. Но при этом при старте программы CS=PSP+10h, DS=PSP. Смещения отсчитываются от 0, т.е. от базы PSP. В результате massege (блин, это на каком языке?) имеет смещение 8, с учетом используемого в 9-й функции указателя ds:dx - PSP:8, что не равно CS:8, как хотелось бы.
Для исправления этой ошибки надо либо формировать COM-файл, либо настроить DS.
Для формирования COM-файла добавь строку ORG 100h после .code
Для настройки DS в начале программы напиши:
mov ax, @Data
mov ds, ax


Ответ отправлен: 27.03.2003, 13:28
Отправитель: Ayl


Отвечает Igoryk

Здравствуйте, Vlad!
Дело в том, что ты используешь многосегментную модель, поэтому функции 09 нужно еще указать сегментный адрес строки, т.е. после begin вставить:
mov ax, DGROUP
mov ds, ax

Ответ отправлен: 26.03.2003, 20:49
Отправитель: Igoryk


Отвечает Samodelkin

Добрый день, Vlad!
полагаю подобных моему ответов и так прорва, но если все так будут думать может статься никто и не ответит... ты забыл вставить org 100h в начало кода... В com-программе данные, код, стек не грузяться в разные сегменты, а свалены в одном сегменте, куда уже загружен PSP, занимающий 256=100h байт... вот его-то и надо учесть директивой org 100h, что засьтавит компилятор эти 100h добавлять ко всем относительным адресам


Ответ отправлен: 27.03.2003, 10:59
Отправитель: Samodelkin


Отвечает Bob Johnson

Доброе время суток, Vlad!
Ты делаешь exe файл, в котором различные сегменты (кода и данных, как ты и описал), но при запуске проги никто тебе в ds не загружает правильное значение. Ты должен это делать сам:
mov ax, @data
mov ds, ax
да и model tiny соотв. ком файлу, а не exe, а в конце exe файла нужно ставить не рет, а mov ax, 4c00h int 21h. В общем в приложении то, что работает...


Приложение:

Ответ отправлен: 27.03.2003, 14:13
Отправитель: Bob Johnson


Отвечает WNA

Приветствую Вас, Vlad!
Ты забыл загрузить регистр DS в самом начале


Ответ отправлен: 27.03.2003, 15:03
Отправитель: WNA


Отвечает Maverick

Приветствую Вас, Vlad!
А где стэк???


Ответ отправлен: 27.03.2003, 04:46
Отправитель: Maverick


 Вопрос № 2847

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



Вопрос отправлен: 26.03.2003, 18:41
Отправитель: chiv (chiv2607@yandex.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Maverick

Здравствуйте, chiv!
INT 13 - Дисковое прерывание - GET CURRENT DRIVE PARAMETERS
- получить текущие параметры диска - (для XT,AT,XT286,CONV,PS)
AH = 08h
DL = номер диска
Возвращает: установленный CF при ошибке
AH = код состояния (смотри AH=01h)
BL = тип диска (смотри AH=17h) (только для гибких дисков AT/PS2)
DL = число последовательно ответивших дисков
DH = максимальный номер дорожки
CL = максимальный номер сектора (биты 0-5)
CH = максимальный номер цилиндра (старшие биты в битах 6,7 CL)
ES:DI -> таблица параметров диска


Ответ отправлен: 27.03.2003, 04:46
Отправитель: Maverick


Отвечает akul

Добрый день, chiv!
Ну раз не отформатирован, то и секторов нет. Они при форматировании создаются. А количество дорожек берется исходя из типа дисковода.

Ответ отправлен: 27.03.2003, 06:19
Отправитель: akul



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


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


Получить ответов:


 Выбор рассылки

Программисту
Assembler (37)
C / C++ (27)
Perl (6)
Delphi (15)
Pascal (19)
Basic / VBA (9)
Java / JavaScript (9)
PHP (5)
MySQL / MSSQL (6)
Пользователю
Windows 95/98/Me (30)
Windows NT/2000/XP (23)
"Железо" (28)
Поиск информации (15)
Администратору
Windows NT/2000/XP (10)
Linux / Unix (13)
Юристу
Гражданское право (8)
Семейное право (4)
Трудовое право (4)
КоАП (5)

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




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru


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

В избранное