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

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


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

Лучшие эксперты в разделе

Лысков Игорь Витальевич
Статус: Мастер-Эксперт
Рейтинг: 0
∙ повысить рейтинг »
Evgen aka Chuma
Статус: 6-й класс
Рейтинг: 0
∙ повысить рейтинг »
cain52
Статус: 3-й класс
Рейтинг: 0
∙ повысить рейтинг »

Assembler

Номер выпуска:1791
Дата выхода:10.08.2021, 14:45
Администратор рассылки:Зенченко Константин Николаевич (Старший модератор)
Подписчиков / экспертов:5 / 25
Вопросов / ответов:3 / 6

Консультация # 80328: Ув эксперты! Помогите чайнику.Для вывода пользуюсь макросом (см ниже), вывожу lParam WM_SIZE. Когда вывожу так: IF uMsg==WM_SIZE MsgBox "0x%x",lParam выводится значение 2bd03b8, Когда вывожу младшее слово: IF uMsg==WM_SIZE MsgBox "0x%x",word ptr lParam выводит...
Консультация # 9053: Здравствуйте! Ответьте, пожалуйста, на 2 вопроса. !!!(1)Почему если в следующей программе поставить дерективу .386 до определения сегмента (как и сделано ниже), то выдается ошибка: instruction operands must be the same size. Если после XXX segment, то все норамально. Если вообще убрать, то естественно пойдут ошибки, т.к. 086 не поддерживает инст...
Консультация # 190167: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: Здравствуйте, есть большое желание изучить ассемблер.... когда то имел опыт программировать на бэйсике.но это было давно... Смотрю литературы много выложено... как сделать первый шаг? С Калашникова? Мне ,как пишут везде в инете - для чайника... попал на ваш ресурс,профессиональный.Может ест...

Консультация # 80328:

Ув эксперты!

Помогите чайнику.Для вывода пользуюсь макросом (см ниже),
вывожу lParam WM_SIZE.

Когда вывожу так:
IF uMsg==WM_SIZE
MsgBox "0x%x",lParam

выводится значение 2bd03b8,

Когда вывожу младшее слово:
IF uMsg==WM_SIZE
MsgBox "0x%x",word ptr lParam

выводится 3b8,

а,когда старшее слово:
MsgBox "0x%x",word ptr lParam+1

MessageBox весь бледный,в сером цвете и не видно ни надписей на кнопках ни самой выводимой инфы.Не могу разобраться,что здесь не так.

Спасибо.

Дата отправки: 30.03.2007, 03:07
Вопрос задал: Жлукто Александр/Jeff
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Зенченко Константин Николаевич (Старший модератор):

Здравствуйте, Жлукто Александр/Jeff!

Обратите внимание на очередность параметров передаваемых
в макрос поменяйте их местами.
Удачи!

Консультировал: Зенченко Константин Николаевич (Старший модератор)
Дата отправки: 30.03.2007, 11:22
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Xaud:

Здравствуйте, Жлукто Александр/Jeff!

Дело в том, что Windows очень чувствительна к адресам передаваемых данных. Поясню: двойные слова (DWORD) ДОЛЖНЫ быть выравнены по границе 4, т.е. находиться по адресу кратному 4; слова (WORD) - по границе 2, т.е. по адресу кратному 2. Иначе начинаются в лучшем случае глюки.
В вашем случае:
1. Для вывода старшего слова нужно было БЫ использовать такой код:
MsgBox \"0x%x\",word ptr lParam+2,
но...
2. Кроме того, функция wsprintf унаследована из С, но несмотря на это, ВСЕГДА фактически все параметры этой функции - ДВОЙНЫЕ СЛОВА!!!
Таким образом,
MsgBox \"0x%x\", word ptr lParam - делать нельзя!!!
Надо делать что-то вроде:
mov edx,lParam
and edx,0FFFFH ;оставляем только младшее слово
MsgBox \"0x%x\",edx ;вот так правильно

а для старшего слова:

mov edx,lParam
shr edx,16 ;оставляем только старшее слово
MsgBox \"0x%x\",edx ;вот так правильно

Консультировал: Xaud
Дата отправки: 30.03.2007, 21:03
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 9053:

Здравствуйте! Ответьте, пожалуйста, на 2 вопроса.
!!!(1)Почему если в следующей программе поставить дерективу .386 до определения сегмента (как и сделано ниже), то выдается ошибка: instruction operands must be the same size. Если после XXX segment, то все норамально. Если вообще убрать, то естественно пойдут ошибки, т.к. 086 не поддерживает инструкцию STOSD, и регистра EAX в 086 не существовало.
Ругается на строки помеченные знакоми вопроса. Работаю в MASM 6.1

.386 ;будем использовать регистр EAX и команда STOSD
assume CS:XXX
XXX segment
org 100h
main proc
mov ax,3h
int 10h
cld ;обработка строк в прямом направлении
mov eax,1f201f00h ;первый символ 00 с атрибутом 1fh затем пробел
;20h с атрибутом 1fh
mov bx,0f20h ;пробел с атрибутами 0fh
mov cx,0ffh ;число символов минус 1
mov di,offset ctable ;??????????? ;ES:DI начало таблицы

cloop:
stosd ;записать символ и пробел в таблицу ctable
inc al ;AL содержит следующий символ
test cx,0fh ;если CX не кратен 16
jnz continue_loop ;продолжить цикл
push cx ;иначе сохранить значение счетчика
mov cx,80-32 ;число оставшихся до конца строки символов
xchg ax,bx
rep stosw ;заполнить остаток строки пробелами с отрибутом 0fh
xchg bx,ax ;ввостановить значение EAX
pop cx ;ввостановить значение счетчика
continue_loop:
loop cloop
stosd ;записать последний (256-й) символ и пробел
;собственно вывод на экран
mov ax,0b800h ;сегментный адрес видео памяти
mov es,ax
xor di,di ;DI=0 адрес начала видео памяти в ES:DI
mov si,offset ctable ;??????????????????? ;адрес таблицы в DS:DI
mov cx,15*80+32 ;15 строк по 80 символов, последняя строка - 32
rep movsw ;скопировать таблицу ctable в видео память
int 20h
main endp

ctable:
XXX ends
end main

!!!(2)подскажите, пожалуйста, что делает команда cld, и если можно поподробнее

Дата отправки: 01.01.2004, 00:01
Вопрос задал: Alexander
Всего ответов: 3
Страница онлайн-консультации »


Консультирует ASMодей:

Доброе время суток, Alexander!
1.Если директива .386 стоит перед определением сегмента, то этот сегмент
автоматически считается 32-битным, поэтому указывай директиву внутри сегмента.
В TASM можно явно указать у сегмента свойство use16 или use32
(xxx segment use16), а вот в MASM не знаю есть ли такая возможность.
2. Команда CLD сбрасывает значение флага DF в ноль. Этот флаг используется
командами, работающими со строками (MOVS, CMPS, STOS) и определяет, что
делать с регистрами SI и DI - увеличивать на 1 (DF=0) или уменьшать на 1 (DF=1).

Консультировал: ASMодей
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Евгений Иванов:

Добрый день, Alexander!
Используй в директиве определения сегмента public и use16
И от директивы Model никто не освобождал!
Model NearStack use16,Normal StdCall - например, так.

* EMan: -=- Любовь существует! =-=

Консультировал: Евгений Иванов
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Ayl:

Здравствуйте, Alexander!
Объясняю. При установки типа процессора 386 транслятор предполагает использование 32-битной адресации. Поэтому все смещения вычисляются как 32-битные. Соответственно, в 16-битные регистры оно не лезет, о чем транслятор и сообщает (правда, masm это делает достаточно убого, говоря просто, что операнды должны быть одного размера. Tasm же выражается более четко, выводя сообщение о том, что указатель либо смещение 32-битные).
Исправить это достаточно просто, надо написать такое описание сегмента:

XXX segment USE16

указывая, что все смещения этого сегмента будут 16-битными.

Ответ на второй вопрос - команда cld сбрасывает флаг DF, указывая процессору, что при выполнении строковых команд типа stos и movs необходимо выполнять инкрементирование указателей si и/или di на размер операнда. Если же флаг установить (команда std), то при выполнении строковых команд будет выполняться декрементирование указателей.
Кстати, при за пуске программы этот флаг сброшен, т.ч. ты ее можешь вообще исключить из программы.

Консультировал: Ayl
Дата отправки: 01.01.2004, 00:01
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 190167:

Уважаемые эксперты! Пожалуйста, ответьте на вопрос:

Здравствуйте, есть большое желание изучить ассемблер.... когда то имел опыт программировать на бэйсике.но это было давно... Смотрю литературы много выложено... как сделать первый шаг? С Калашникова? Мне ,как пишут везде в инете - для чайника... попал на ваш ресурс,профессиональный.Может есть обучение в онлайне .как в классе? спасибо

Дата отправки: 26.11.2016, 00:23
Вопрос задал: Анатолий (Посетитель)
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Evgen aka Chuma (6-й класс):

Здравствуйте, Анатолий!
У каждого свой подход к узучению asma. Калашникова прочитать я Вам советую обязательно, очень просто все изложено и понятно - и самое главное с первой же главы начинается практика, а как известно программирование (в любом языке) без практики это ерунда. Я в свое время проштудировал всю книгу буквально недели за две. Поймете что такое прерывание, стек и т.д. А затем переходите на 4 байтный asm (32-х битный). Литературы много, какая больше понравиться - Вам решать. Я изучал да и продолжаю изучать по различным туториалам - не люблю привязываться к учебникам. Да и у разных программистов разный взгляд на одни и теже вещи. Набирайте в поисковике что то типа Ассемблер с нуля или как выучить ассемблер и читайте, выбирайте что Вам нравиться, педставление о asme вы иметь уже будете после Калашникова. Вот так начинал я да и продолжаю так же. И главное практика.....Чем больше будете писать, тем быстрее научитесь. Успехов! Ссылки не даю дабы не навязыват ь свое мировозрение. У каждого свой путь. Книгу скачайте в сети - благо дела выложена на многих ресурсах, диск-приложение к книге я прикрепил.

Консультировал: Evgen aka Chuma (6-й класс)
Дата отправки: 29.11.2016, 19:15
Прикреплённый файл: посмотреть » [945.0 кб]
Рейтинг ответа:

НЕ одобряю +1 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное