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

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


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

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

Выпуск N 053

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

Дата выхода: 2001-08-09


Вопрос №454

Народ! Кто нибудь! Помогите разобраться с тем как
в памяти хранятся данные... я имею в виду то что, они
хранятнся задом наперед!! Я не понимаю принцепа
Объясните пожалуйста

Ответ

Здравствуйте, Voodooo!
Если данные записаны
MAS DB 01h,02h,03h,04h
то в памяти так
mov al, mas; al=01
mov ax, word ptr mas; ax=0201h
а если так
W dw 0102h
то
mov al, byte ptr W; al=02
mov ax, word ptr W; ax=0102h
то есть при описании директивой dw данные размещаются по принципу перевернутости
"старший байт в младшем адресе"
но при пересылке
mov ax, W
данные автоматом переворачиваются!
Совет: Если возможно, пиши через DB и все будет прозрачно адресоваться :)


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

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

Вопрос №456

Уважаемые эксперты! Помогите пожалуйста с такой проблемой:
не могу приручить команду DIV. Делаю следующее:

mov ax,00EFh
mov bx,0007h
div bx
retn

под отладчиком все прекрасно делится (стандартный DEBUG, получ. 22 в HEXе), запускаю просто из доса - переполнение. В чем причина ?

Ответ

Здравствуйте, Дмитрий!
Решения два:
1. Очищай dx
2. Дели на bl
Ты делишь на слово, и делимое асм берет из пары DX:AX
DIV делит либо двойное слово на слово, либо слово на байт


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

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

Вопрос №451

Здравствуйте, эксперты!
У меня не вопрос, а скорее просьба.
Я недавно начал изучать Ассемблер, вещь хорошая, ну вот по ходу изучения написал программу, которая выводит на экран наш родной триколор.
Отсюда просьба, кому не лень, взгляните, как ее можно оптимизировать, и если можно с пояснениями, какой оператор что делает. Извините за беспокойство, знаний не хватает, а писать охота.
С уважением, Вадим.

Ответ

Уважаемый Вадим Сурин!
1. mov ax,0003h
int 10h
если запускать любую программу в Виндах в окне Доса, то эти две строки являются лишними, т.к. по умолчанию стоит текстовый режим 80х25 (насчет голого Доса не уверен...), но с точки зрения корректности эти две строки абсолютно уместны.

2. mov ax,0B800h
mov es,ax
лучше заменить на
push 0b800h
pop es
(так короче на один байт...)

3. mov di,0
всегда, где нада обнулить регистр, заменяй mov на xor XXX,XXX в данном случае xor di,di (так быстрее и "круче" ;) в крайнем случае - sub di,di

4. Вся процедура легко заменяется на rep stosw (di увеличивается, а CX уменьшается автоматически при этом)

5. test cx,cx замени на
and cx,cx
jz ...
так вродь быстрее...

6. int 20h замени на ret, так короче на один байт, но при этом в стеке ты не должен забывать свой "мусор".

7. Сам алгоритм написан "не по русски... ;)" если нада, вышлю самый оптимальный алгоритм твоей проги.


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 17

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

Вопрос №455

Уважаемые эксперты! Помогите пожалуйста с такой проблемой:
не могу приручить команду DIV. Делаю следующее:

mov ax,00EFh
mov bx,0007h
div bx
retn

под отладчиком все прекрасно делится (стандартный DEBUG, получ. 22 в HEXе), запускаю просто из доса - переполнение. В чем причина ?

Ответ

Здравствуйте, Дмитрий!
Div операнд
если операнд байт, то АХ/операнд, результат в AL, остаток в AH
если операнд слово, то DX,AX/операнд, результат в АХ, остаток в DX
если операнд дв.слово, то EDX,EAX/операнд, результат в EAX, остаток в ЕDX.
Что же мы имеем? div bx, т.е. DX,AX/BX, под отладчиком понятное дело, DX = 0 сразу же, поэтому все получается. Но если запускать прогу руками, то это еще не известно (насчет DX).
Вообщем, лепим в код проги xor dx,dx перед делением в любое место и все ОК.
P.S. Кстати, ошибка
Your program caused a divide overflow error.
If the problem persists, contact your program vendor.
действительно вылазит иногда довольно не в тему...

P.P.S. Уважаемый эксперт Nik!!! Обещаю больше не лезть в защищенный режим. ;) С уважением, Broken Sword


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 18

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

Вопрос №453

Народ! Кто нибудь! Помогите разобраться с тем как
в памяти хранятся данные... я имею в виду то что, они
хранятнся задом наперед!! Я не понимаю принцепа
Объясните пожалуйста

Ответ

Здравствуйте, Voodooo!
В компьютерах с процессорами Intel все данные хранятся так, что младший байт находится по младшему адресу, поэтому слова записываются задом наперед, то есть сначала (по младшему адресу) - последний (младший) байт, а потом (по старшему адресу) - первый (старший) байт. Если из программы всегда обращаться к слову как к слову, а к двойному слову как к двойному слову, это не оказывает никакого влияния. Но если вы хотите прочитать первый (старший) байт из слова в памяти, то придется увеличить адрес на 1. Двойные и учетверенные слова записываются так же - от младшего байта к старшему.
Ну и несколько слов от себя. ;)
Запомни одно: слева направо это совсем не обязательно от 0 к 31 может быть совсем наоборот... важно понять это ;)
p.s. и еще. конечно нет в процессоре никакого лева и права (верха, низа), и на самом деле данные могут распологаться хоть в столбик по диагонали.


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 19

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

Вопрос №455

Уважаемые эксперты! Помогите пожалуйста с такой проблемой:
не могу приручить команду DIV. Делаю следующее:

mov ax,00EFh
mov bx,0007h
div bx
retn

под отладчиком все прекрасно делится (стандартный DEBUG, получ. 22 в HEXе), запускаю просто из доса - переполнение. В чем причина ?

Ответ

Здравствуйте, Дмитрий!

Добавь "xor dx,dx":


mov ax,00EFh
mov bx,0007h
xor dx,dx
div bx
retn

Команда DIV делит DX:AX (32 бита) на операнд (у тебя BX). Так как
DX - не ноль, после деления получается число больше 0FFFFh, а потому
не помещается в AX. Потому и переполнение :(

А в DEBUGGERE у тебя видимо DX имеет маленькое значение (или 0) и
результат деления умещается в AX.


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

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

Вопрос №454

мЮПНД! йРН МХАСДЭ! оНЛНЦХРЕ ПЮГНАПЮРЭЯЪ Я РЕЛ ЙЮЙ
Б ОЮЛЪРХ УПЮМЪРЯЪ ДЮММШЕ... Ъ ХЛЕЧ Б БХДС РН ВРН, НМХ
УПЮМЪРМЯЪ ГЮДНЛ МЮОЕПЕД!! ъ МЕ ОНМХЛЮЧ ОПХМЖЕОЮ
нАЗЪЯМХРЕ ОНФЮКСИЯРЮ

Ответ

Hello, Voodooo!
бЯё ПНЯРН: ЕЯКХ ЕЯРЭ ВХЯКН 0ABBh, РН Б ОЮЛЪРХ НМН РЮЙ: BB 0A


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

Экспертная группа: нАЫХЕ БНОПНЯШ ОН ОПНЦПЮЛЛХПНБЮМХЧ МЮ юЯЯЕЛАКЕПЕ ОНД DOS

Вопрос №450

гДПЮБЯРБСИРЕ, ЩЙЯОЕПРШ!
с ЛЕМЪ МЕ БНОПНЯ, Ю ЯЙНПЕЕ ОПНЯЭАЮ.
ъ МЕДЮБМН МЮВЮК ХГСВЮРЭ юЯЯЕЛАКЕП, БЕЫЭ УНПНЬЮЪ, МС БНР ОН УНДС ХГСВЕМХЪ МЮОХЯЮК ОПНЦПЮЛЛС, ЙНРНПЮЪ БШБНДХР МЮ ЩЙПЮМ МЮЬ ПНДМНИ РПХЙНКНП.
нРЯЧДЮ ОПНЯЭАЮ, ЙНЛС МЕ КЕМЭ, БГЦКЪМХРЕ, ЙЮЙ ЕЕ ЛНФМН НОРХЛХГХПНБЮРЭ, Х ЕЯКХ ЛНФМН Я ОНЪЯМЕМХЪЛХ, ЙЮЙНИ НОЕПЮРНП ВРН ДЕКЮЕР. хГБХМХРЕ ГЮ АЕЯОНЙНИЯРБН, ГМЮМХИ МЕ УБЮРЮЕР, Ю ОХЯЮРЭ НУНРЮ.
я СБЮФЕМХЕЛ, бЮДХЛ.

Ответ

гДПЮБЯРБСИРЕ, бЮДХЛ яСПХМ!
яДЕКЮРЭ ЛНФМН ОПЪЛШЛ ДНЯРСОНЛ Б БХДЕН ОЮЛЪРЭ, ОПНЯРН ОХЬЕЛ РПХ ЙСЯЙЮ(ЖБЕРЮ ТКЮЦЮ)
мЮВЮКН БХДЕНОЮЛЪРХ: [B800h:0000h]
рСДЮ ОХЬХ АЮИРШ(НДХМ ЯХЛБНК - ДБЮ АЮИРЮ, ЮРПХАСРШ ЖБЕРЮ Х ЯЮЛ АЮИР), ЕЯКХ МСФЕМ ЩЙГЮЛОЕК ОХЬХ МЮ ЛШКН.


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

Экспертная группа: нАЫХЕ БНОПНЯШ ОН ОПНЦПЮЛЛХПНБЮМХЧ МЮ юЯЯЕЛАКЕПЕ ОНД DOS

Вопрос №457

Здравствуйте!
Когда-то я где-то нашел инфу, что в текстовом режиме, начиная с EGA, можно использовать 2 знакогенератора символов одновременно(т.е. 512 разных символов на экране).
Очень интересует информация по этому поводу или по поводу переопределения символов в знакогенераторе

Ответ

Здравствуйте, Sensey! Прочитай, пожалуйста, до конца.
IBM обеспечивает расширение памяти EGA, так что возможна поддержка
двух отдельных страниц для цветного графического режима высокого раз-
решения. EGA (и VGA) других изготовителей поставляется с полным комп-
лектом памяти. При низком разрешении (или монохромной графике) адаптер
позволяет хранить до 8 страниц текстовой или графической информации.
Возможно совмещение отображения на экране одной страницы с модификаци-
ей другой. Дополнительная память может использоваться и для хранения
таблицы шрифтов (в графическом режиме это невозможно), что позволяет
хранить до 1024 различных символов (на VGA до 2048), 512 из которых
могут быть отображены одновременно...
если интересует полный текст (192 стр.), замыль.


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 20

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

Вопрос №458

Уважаемые эксперты!
Написал прогу для AT89C51 - не работает!
Помогите разобраться.
Собственно это автомат для насоса, а работать должен так:
Емкость заполняется самотеком, а насос (при достижении верхнего уровня водой)еЈ откачивает.

Ответ

Уважаемый Александр!
Я не очень врубился (думаю, не один я такой) в саму прогу, которую вы изволили написать. Я опускаю непонятные мне команды ORL, CPL, ANL, но таких ни MASM ни TASM ни один другой знакомый мне ассемблер не распознает. Дальше сам алгоритм. С первого взгляда мне показалось, что какие бы вероятные события не происходили с флагами, программа ОБЯЗАТЕЛЬНО выполнится до конца - включится насос для откачки (даже если вода перестала поступать вообще...) вопрос токо в том, раньше это случиться (F0=1) или позже (F0 всегда = 0), так что утечки уж точно не произойдет (но может сгореть насос ;).
Вообщем, предлагаю свой вариант программы, правда не совсем допонимая, ДО ЧЕГО ТУТ ВООБЩЕ ВЛЕПИЛСЯ ДАТЧИК НИЖНЕГО УРОВНЯ???!!! Какую такую роль он вообще играет во всем этом привеселом устройстве?
Моя прога сидит в памяти и только и ждет срабатывания верхнего датчика, т.е. какого-либо сигнала от него (прерывания), тогда включается насос.
p.s. я также понятия не имею, что вообще происходит при включении верхнего датчика на самом деле? ведь никакого прерывания, наверно, не вызывается, а судя по вашей программе, данные как-то сами собой меняются "на лету"...

Приложение:


Отправил эксперт: Broken Sword
Эксперт отправил ответов (всего): 21

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

Вопрос №453

Народ! Кто нибудь! Помогите разобраться с тем как
в памяти хранятся данные... я имею в виду то что, они
хранятнся задом наперед!! Я не понимаю принцепа
Объясните пожалуйста

Ответ

Здравствуйте, Voodooo!
Да собственно чего тут непонятного? Просто так хранятся вот.
Например, есть у тебя такая байда:
a db 7h
b dw 1234h
c dd 12345678h
имеем дамп:
07 34 12 78 56 34 12

т.е. в слове старший байт по младшему адресу,
в двойном слове старшее слово по младшему адресу, а в словах старший байт по младшему адресу.


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

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

Вопрос №459

Уважаемые эксперты
При открытии какого-либо сообщения в Outlook Express
Включается тут же «удаленное соединение»
Нажимаешь на «отмена» и никакого эффекта, раз 10
Нажмешь и тоько тогда она исчезает. Это действует на нервы
Можно ли как-то бороться с этим.?

Ответ

Здравствуйте, Oleg!
Выбери "Автономная работа" в меню файл.
Удачи...


Отправил эксперт: Evgos (http://ospelnikov.narod.ru - Личная страничка)
Эксперт отправил ответов (всего): 25

Экспертная группа: Пользовательская работа с Windows

Вопрос №459

Уважаемые эксперты
При открытии какого-либо сообщения в Outlook Express
Включается тут же «удаленное соединение»
Нажимаешь на «отмена» и никакого эффекта, раз 10
Нажмешь и тоько тогда она исчезает. Это действует на нервы
Можно ли как-то бороться с этим.?

Ответ

Здравствуйте, Oleg!
Оутглюк пытается догрузить картинки etc., так как в письмах они не посылаются, а даются в виде абсолютных ссылок
Поступи следующим образом
Установи через меню "Файл"\"Автономная работа"
Для доставки почты этот флаг отменяется, потом опять ставится и просматриваются сообщения


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

Экспертная группа: Пользовательская работа с Windows

Вопрос №459

Уважаемые эксперты
При открытии какого-либо сообщения в Outlook Express
Включается тут же «удаленное соединение»
Нажимаешь на «отмена» и никакого эффекта, раз 10
Нажмешь и тоько тогда она исчезает. Это действует на нервы
Можно ли как-то бороться с этим.?

Ответ

Здравствуйте, Oleg!
Попытка соединения происходит, когда в письме содержится рекламная ссылка, картинка и т.д., в общем, все, что требует загрузки из сети Internet(одна попытка соединения на одну картинку).
Бороться с этим можно следующим способом: оставить окошко соединения в открытом состоянии (окошко с тремя кнопками: "подключиться", "настройка", "отмена") и спокойно продолжать работу с Outlook'ом.


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

Экспертная группа: Пользовательская работа с Windows

Вопрос №458

сБЮФЮЕЛШЕ ЩЙЯОЕПРШ!
мЮОХЯЮК ОПНЦС ДКЪ AT89C51 - МЕ ПЮАНРЮЕР!
оНЛНЦХРЕ ПЮГНАПЮРЭЯЪ.
яНАЯРБЕММН ЩРН ЮБРНЛЮР ДКЪ МЮЯНЯЮ, Ю ПЮАНРЮРЭ ДНКФЕМ РЮЙ:
еЛЙНЯРЭ ГЮОНКМЪЕРЯЪ ЯЮЛНРЕЙНЛ, Ю МЮЯНЯ (ОПХ ДНЯРХФЕМХХ БЕПУМЕЦН СПНБМЪ БНДНИ)Её НРЙЮВХБЮЕР.

Ответ

гДПЮБЯРБСИРЕ, юКЕЙЯЮМДП!
лНФМН БНР РЮЙ.

Приложение:


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

Экспертная группа: нОРХЛХГЮЖХЪ ОПНЦПЮЛЛ

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

Рассылки 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

В избранное