Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
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.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту 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 |
Отписаться
Убрать рекламу |
В избранное | ||