Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 725
от 17.05.2004, 06:20
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 5288 Отправлено ответов: 14557 Активность: 275.2 %
|
РекламаДобро пожаловать в сообщество, где можно обсуждать всесторонние вопросы и темы об Ассемблере.Прошу экспертов регистрироваться там для помощи изучающим этот лучший язык. http://www.npj.ru/assembler |
Список экспертов, ответы которых опубликованы в данном выпуске |
Foamplast Статус: Профессиональный Общий рейтинг: 149.55 URL: мой личный сайт [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 105.73 URL: Мой сайтик... [Подробней >>] |
Dragoon Статус: Начальный Общий рейтинг: 108.19 [Подробней >>] |
Pawel Статус: Профессиональный Общий рейтинг: 156.17 [Подробней >>] |
vitya Статус: Профессиональный Общий рейтинг: 109.11 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 116.54 [Подробней >>] |
_vt Статус: Профессиональный Общий рейтинг: 118.48 [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 111.67 [Подробней >>] |
Евгений Иванов Статус: Профессиональный Общий рейтинг: 133.59 URL: Super Assembler Software Телефон: НСС +7 831 3107039 [Подробней >>] |
VOVAN Статус: Опытный Общий рейтинг: 105.33 [Подробней >>] |
Стас Статус: Начальный Общий рейтинг: 127.65 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 5260. Подскажите пожалуйста, где можно скачать литературу для изучения assembler-а? В частности по 32-битн... (ответов: 1)
Вопрос № 5261. Здраствуйте. 1)Мне на уроках информатики разказывали что : компилятор(транслятор) - комплекс програм... (ответов: 7)
Вопрос № 5262. Здравствуйте! Ответьте, пожалуйста, на 2 вопроса. !!!(1)Почему если в следующей программе поставить ... (ответов: 4)
Вопрос № 5263. Помогите!!!!!Срочно нужна прога "Системный динамик-музыка, Бумер"... (ответов: 1)
Вопрос № 5264. Здраствуйте. 1)не могу понять следующие строки: dp_hWnd equ dword ptr [ebp+08h] dp_uMsg equ dword p... (ответов: 3)
Вопрос № 5265. Здравствуйте! Я получил ответы и кое что не понятно(внизу ответ повторен). Я не понимаю как влияет д... (ответов: 4)
Вопрос № 5266. (Извеняюсь если вы подумаете что этот вопрос не по теме. Вопрос для системщиков) Уважаемые эксперты ... (ответов: 3)
Вопрос № 5267. Приветствую всех, кто только дошёл до моего вопроса. Хотя можно ли его назвать вопросом... В принцип... (ответов: 5)
Вопросов: 8, ответов: 28
Вопрос № 5260 |
Подскажите пожалуйста, где можно скачать литературу для изучения assembler-а?
В частности по 32-битному программированию в DOS.
Заранее благодарен.
Миша.
Вопрос отправлен: 11.05.2004, 16:34
Отправитель: Misha (_user@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Добрый день, Misha!
Зубков "Assembler для DOS, Windows и UNIX"
http://karakol.iatp.kg/alex/index.html
http://snock.boom.ru/prog/assembl.zip
http://www.gyry.net/prog/ASMLITRA.HTM
Подсказка: ключевые слова для поиска "книга 32 assembler скачать"
Ответ отправлен: 15.05.2004, 12:58
Отправитель: Foamplast
Вопрос № 5261 |
Здраствуйте.
1)Мне на уроках информатики разказывали что :
компилятор(транслятор) - комплекс программ переводящая команды с ЯВУ на
машинные коды.
-;а затем это
программа переводящая код с языка программирования на машинный код
называется транслятор кот. в свою очередь делится на:
-интерпретатор(пошаговый перевод и выполнение программы)
-компилятор(преобразует программу в модуль на машинном языке,
записывает в RAM и затем выполняет)
-ассемблер(перевод команд с ассемблера(автокода) на машинные коды)
но ведь masm это компилятор.В общем я вообще тут запутался - не могли
бы вы все разъяснить что да как?(У препода не спросил потому что толку
нет - ламерша полная - когда проходили в Pascal'e цикл for она мне
говорила что если я не присвою значение переменной(не счетчику) перед
циклом, то он будет длится бесконечно -- и это не единственный случай).
2)При переводе числа в строку с помощью функции wsprintf оно
переводится в 16-ричную систему, а как сделать чтобы переводилось в
10-ную?
3)Да и еще - одни эксперты говорят что в Windows прерывания есть,
другие что нет.Так все-таки они есть или нет(в каком либо из ring'ов)?
Приложение:
Вопрос отправлен: 11.05.2004, 17:52
Отправитель: Семен
[Следующий вопрос >>] [Список вопросов]
Отвечает Portnov
Приветствую Вас, Семен!
1. Транслятор - это программа, "переваривающая" код на ЯВУ и делающая возможным выполнение этого кода. В частности:
интерпретатор: берет команду ЯВУ, переводит в коды (необязательно в инструкции процессора, он может переводить в какие-нибудь псевдокоды и сам эти псевдокоды выполнять), выполняет; Затем следующая команда и т.д.
компилятор: берет весь исходник и переводит его в исполнимый вид - чаще всего в EXE-файл. После этого исполнимый файл можно запускать
ассемблер: берет исходник и переводит его в формат, готовый для компоновки - объектный файл (инструкции процессора переведены в маш. коды, но многие смещения не определены). После этого компоновщик (линкер) должен доопределить все смещения и скомпоновать один или несоклько объектных файлов в исполнимый файл. Некоторые ассемблеры (в частности, fasm) имеют встроенный компоновщик.
2. Не понял... wsprintf("%ld",i) - и все... Подробнее - RTFM
3. Прерывания строго говоря есть. Win9x, например, во многих случаях для доступа к дискам использует BIOS-овские int19h, int25/26h. В WinNT/2k/XP/2k3 все обработчики прерывания свои. Другое дело, что прикладному программисту прерывания недоступны. Дело в том, что, например, почти все функции Win32API сводятся к вызову int29h с соотв. параметрами. В ядре также используются и другие прерывания. Конечно, при попытке вызвать их из ring3 получите в лучшем случае exception.
С уважением, Portnov.
Ответ отправлен: 13.05.2004, 14:52
Отправитель: Portnov
Отвечает Dragoon
Добрый день, Семен!
1)
MASM - компилятор, так как в нем используется высокоуровневый синтаксис, типа .if,.repeat и тд.
3)
Прерывания в Windows есть. Однозначно. Просто из-под Ring 3,
в котором запускаются пользовательские проги, они защищены. Перейди под Ring 0 (в качестве варианта можно поменять адрес
одного из векторов прерываний на адрес своей процедуры, а потом вызвать это прерывание int'ом. В процедуре вы уже под Ring 0!).
Ответ отправлен: 13.05.2004, 22:01
Отправитель: Dragoon
Отвечает Pawel
Приветствую Вас, Семен!
1)Транслятор переводит ЯВУ или Assembler на машинные коды.
Они делятся на компиляторы и интерпретаторы. Не слышал я не прокакие ассемблеры. Ассемблер это язык низского уровня(опкоды).
2)wsprintf преобразует данные по указанному формату.
3)По факту WinAPI это и есть прерывания.
На RING-0 Нет не прерываний ни WinAPI.
Так-же есть специальные отладочные прерывания.
Ответ отправлен: 12.05.2004, 12:11
Отправитель: Pawel
Отвечает vitya
Добрый день, Семен!
1. подходи абстрактно - компилятор выдает исполняемую программу, а интерпретатор каждый раз интерпретирует исходный код и выполняет его в себе.
2. какую форматную строку дашь wsprintf - у то и получишь. Советую посмотреть справочник по С, там все это будет, но, исходя из кода - замени %lx на %l или лучше d.
3. Есть. И они используются для перехода в rin0, а int3 для отладки.
Ответ отправлен: 12.05.2004, 09:35
Отправитель: vitya
Отвечает Ayl
Здравствуйте, Семен!
Хм... Транслятор - это программа (комплекс программ), которая преобразует код, написанный на одном языке программирования в код, написанный на другом языке программирования (чаще всего - машинный). В принципе, ничто не мешает написать транслятор, скажем, с Фортрана на Си. И это будет именно транслятор.
Далее. Трансляторы бывают двух типов: интерпретаторы и компиляторы. И все. Никаких ассемблеров! Ассемблер - это просто первоначальное название транслятора с мнемонического языка на машинный.
Интерпретаторы - это трансляторы, которые выполняют исходный код "по шагам", не преобразуя его в исполняемый модуль. Интерпретируемые языки - BASIC, FORTH, PERL, скрипты на SHELL. Возможно предварительная трансляция исходного кода программы в некий промежуточный код для ускорения выполнения программы.
Компиляторы - это трансляторы, которые преобразуют исходный код программы в исполняемый модуль. Компилируемые языки - C, PASCAL, FORTRAN и т.п.
В принципе, тип транслятора с языка определяется не самим языком, а только реализацией. Ничто не мешает написать компилятор с бейсика (они есть) или интерпретатор с паскаля. Но сама структура языка часто указывает, какой тип транслятора будет более эффективным для него.
Ответ отправлен: 11.05.2004, 18:38
Отправитель: Ayl
Отвечает _vt
Приветствую Вас, Семен!
1) Транслятор - это программа или комплекс программ, преобразующих программу на любом языке программирования в машинный код. Существуют две основные реализации алгоритма перевода в машинный код - компиляция и интерпретация. Транслятор, реализованный по интерпретирующему принципу, построчно преобразовывает программу в машинный код, и сразу его выполняет. Примером такого интерпретатора является QBasic, имеющийся в составе MS-DOS. Существуют реализации интерпретаторов, преобразующие программу в некий промежуточный код (например, р-код), и создающий исполняемый модуль, по типу компиляторов. Но в этом случае, этот модуль содержит не машинные коды, а обращения к некоей runtime-библиотеке, которая собственно и выполняет программу. По такому типу реализованы Visual Basic, Perl, Java. В отличие от интерпретаторов, компиляторы сразу производят машинный код, и в дальнейшем собранная программа не нуждается ни в каких дополнительных промежуточных модулях. Так реализованы Borland Pascal, Visual C++ и пр. В случае ассемблера такое дело - исторически, трансляторы с ассемблера не относились ни к компиляторам, ни к интерпретаторам, но впоследствии коммерческие трансляторы (например MASM) были реализованы как компиляторы, т.к. в их состав были введены множество средств, облегчающих написание программ, имеющихся в ЯВУ: упрощенные директивы, макросы, ООП и пр.
2) Это зависит от спецификаторов формата, используемых в вызовах этой и подобных функций - в твоем случае используется
format db "%lx"
Если ты заменишь на
format db "%ld"
то результатом вывода будет десятичное число. Полный список спецификаторов и дополнительные параметры форматированного ввода/вывода ищи в справочнике.
3) На пользовательском уровне их нет, но они есть! :)
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 11.05.2004, 22:28
Отправитель: _vt
Отвечает Foamplast
Доброе время суток, Семен!
Интерпретатортрансляторкомпилятортранслятор: Это всё словоблудие. И смысла это обсуждать особого нет. Итак: транслятор - любая программа, переводящая что-либо во что-либо. Т.е. это и masm, и fasm, и VC++, и VisualBasic, и JVM и т.п. Интерпретатор - программа, выполняющая действия, указанные в сценарии. Сценарий может быть написан с использованием различных языков. Примеры интерпретаторов - PHP, Visual Basic (p-code). В принципе, может быть и интерпретатор языка ассмеблера, но я ещё о таких не слыхал. Компилятор - программа, подбирающая к тексту программы на каком-либо языке точно соответствующий набор символов на другом языке (в том числе и в машинных кодах). Ассемблер - программа, переводящая текст, написанный на автокоде в машинные коды. Примеры компиляторов: VC++, Delphi. Ассемблеров: fasm, nasm, gas.
Таким образом ассемблер является компилятором и транслятором.
Трансляторы Компиляторы Интерпретаторы Ассемблеры Fasm, Nasm Visual C, Delphi PHP, Perl Как сделать чтобы переводилось в 10-ную? - Необходимо указать в строке формата "%u".
Говорят что в Windows прерывания есть. - Есть! И Какие! Системные вызовы в Уиндовс только через них, похоже, и реализуются. Для лучшего уяснения этого факта предлагаю вооружиться отладчиком и проследить путь программы, вызывающей, например, CreateFile(). Особое внимание следует обратить на функцию-обёртку ZwCreateFile(). Вообще говоря, для системных вызовов в Pentium-системах предназначаются Call или Jmp на адрес шлюза вызова, но в операционных системах Линукс и Уиндовс для таких целей используются прерывания, так как это быстрее. Есть и ОС, строго придерживающиеся рекомендаций Интел - это, например, ФриБСД.
Ответ отправлен: 13.05.2004, 23:36
Отправитель: Foamplast
Вопрос № 5262 |
Здравствуйте! Ответьте, пожалуйста, на 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, и если можно поподробнее
Вопрос отправлен: 11.05.2004, 20:10
Отправитель: Alexander
[Следующий вопрос >>] [Список вопросов]
Отвечает 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).
Ответ отправлен: 12.05.2004, 08:14
Отправитель: ASMодей
Отвечает Евгений Иванов
Добрый день, Alexander!
Используй в директиве определения сегмента public и use16
И от директивы Model никто не освобождал!
Model NearStack use16,Normal StdCall - например, так.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 12.05.2004, 05:41
Отправитель: Евгений Иванов
Отвечает Ayl
Здравствуйте, Alexander!
Объясняю. При установки типа процессора 386 транслятор предполагает использование 32-битной адресации. Поэтому все смещения вычисляются как 32-битные. Соответственно, в 16-битные регистры оно не лезет, о чем транслятор и сообщает (правда, masm это делает достаточно убого, говоря просто, что операнды должны быть одного размера. Tasm же выражается более четко, выводя сообщение о том, что указатель либо смещение 32-битные).
Исправить это достаточно просто, надо написать такое описание сегмента:
XXX segment USE16
указывая, что все смещения этого сегмента будут 16-битными.
Ответ на второй вопрос - команда cld сбрасывает флаг DF, указывая процессору, что при выполнении строковых команд типа stos и movs необходимо выполнять инкрементирование указателей si и/или di на размер операнда. Если же флаг установить (команда std), то при выполнении строковых команд будет выполняться декрементирование указателей.
Кстати, при запуске программы этот флаг сброшен, т.ч. ты ее можешь вообще исключить из программы.
Ответ отправлен: 12.05.2004, 14:46
Отправитель: Ayl
Отвечает Foamplast
Здравствуйте, Alexander!
В данной модели смещения по умолчанию - 16-битные. Т.е. Если ставить директиву .386 после сегмета, то смещения считаются 16-битными и допускаются команды 386, а если ставить перед - то смещения считаются 32-битными и не могут быть загружены в 16-битный регистр. Желающим разобраться с этим вопросом подробнее советую попробовать съимитировать выполнение команды Mov Di, offset ctable путём засовывания, например, коробки из-под компакт-диска себе в рот.
Cld (от CLear Direction) - сбрасывает флаг направления. При установленном флаге направления адреса после выполнения строковых команд (lodsb, stosb) адреса уменьшаются, а при сброшенном - увеличиваются. Т.е. если, например надо найти длину строки, то обычно пишут:
Cld Xor Eax, Eax Xor Ecx, Ecx Dec Ecx Mov Edi, szMyCoolString Repne Scasb А если сразу же нужно найти последний символ "/" в строке, то делают так:
Std Mov Al, '/' Xor Ecx, Ecx Dec Ecx Repne Scasb Cld
Ответ отправлен: 13.05.2004, 23:37
Отправитель: Foamplast
Вопрос № 5263 |
Помогите!!!!!Срочно нужна прога "Системный динамик-музыка, Бумер"
Вопрос отправлен: 12.05.2004, 10:05
Отправитель: Дима (dnbz@ukr.net)
[Следующий вопрос >>] [Список вопросов]
Отвечает Foamplast
Здравствуйте, Дима!
Посмотрите исходники на wasm.ru
Ответ отправлен: 13.05.2004, 23:39
Отправитель: Foamplast
Вопрос № 5264 |
Здраствуйте.
1)не могу понять следующие строки:
dp_hWnd equ dword ptr [ebp+08h]
dp_uMsg equ dword ptr [ebp+0Ch]
dp_wParam equ dword ptr [ebp+10h]
dp_lParam equ dword ptr [ebp+14h]
Это что получается Windows шлет сообщения в Стек процедуре?
И что за пареметры wParam и lParam?
2)У меня почему то не хочет работать программа кот должна выводить числа Фибоначи, вроде все верно, а выводит число 4206592, хотя должно выводить последовательность.
Приложение:
Вопрос отправлен: 12.05.2004, 17:32
Отправитель: Семен
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Доброе время суток, Семен!
1. Система вызывает подпрограмму с передачей параметров через стек.
2. В программе переставь LOOP ниже.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 12.05.2004, 18:09
Отправитель: Евгений Иванов
Отвечает Ayl
Доброе время суток, Семен!
1. EQU - это директива для присвоения имени выражению. Т.е. в дальнейшем в каждой строчке, где быдет встречено это имя (символы до EQU) оно будет заменено на выражение, записанное после EQU. А эти 4 выражения обозначают параметры, переданные процедуре. Т.к. стек "растет" вниз, параметры в процедуру передаются по соглашению языка Си(справа налево), а при входе в процедуру выполняются команды:
push ebp
mov ebp, esp
то стек процедуры выглядит так:
parN
...
par2
par1
eip
ebp <-- esp = ebp (новое)
Теперь считаем:
адрес ячейки стека с ebp = ebp + 0
eip (точка возврата) = ebp + 4
par1 = ebp + 8
par2 = ebp + 8 + (размер par1, выровненный до 4 байт)
и т.д.
Т.к. все твои параметры не более 4 байт, то и получается, что их смещения относительно регистра ebp будут 8, 12 (0Ch), 16 (10h) и 20 (14h).
Т.о. твоя процедура описывается как-то так:
void _cdecl_ func (void * dp_hWnd, dp_uMsg, dp_wParam, dp_lParam);
Скорее всего, все параметры - указатели. Если я правильно понял твой вопрос, то отвечаю, что винда не шлет в стек сообщение, а просто передает указатель на него.
Насчет других параметров сказать ничего не могу, предполагаю, что первый - это хендл окна.
2. Ну насчет верно - я бы так не утверждал. Во-первых, почему ты начинаешь заполнять массив с третьей ячейки:
mov si, 2
...
next:
inc si <-- а вот тут сразу получаем 3!
...
mov [fibo + si], ah <-- т.е. fibo + 3, а не +2, как хотелось бы.
Далее. Ты уверен, что все вычисленные числа будут размером в 1 байт? Давай посмотрим:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377 - опаньки... Правда, ты досчитаешь только до 144 - первые 12 членов (2 учитываешь сразу + 5 раз по 2 члена последовательности). Так что замечание, может, и не в тему (по крайней мере не это причина), но тогда вопрос - а нафига массив заводить из 40 элементов?
Ну и, наконец, основные причины. Ты выводишь число (причем ровно одно - вызов процедуры печати стоит за циклом! - первая ошибка) по формату '%ld', хотя реально заполняешь побайтно. Т.е. смотри что получается при выполнении печати.
твой массив (побайтно): 1, 1, ?, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144
Маска вывода - длинное целое (т.е. 4 байта). Т.е. такое число в 16-ричной с.с.:
02??0101
Хм. Вообще-то твое число в 16-ричной с.с. равно 040300. Надо смотреть, возможно что-то с вызовом не то получается. Но принцип я тебе объяснил.
Ответ отправлен: 12.05.2004, 19:12
Отправитель: Ayl
Отвечает Foamplast
Добрый день, Семен!
Да, примерно так и есть. Только сообщения шлются в очередь, из очереди они выбираются функцией GetMessage(), а затем посылаются с помощью DispatchMessage() оконным процедурам. В системе "Уиндовс" распространён метод вызова процедур, известный как STDCALL. Он состоит в том, что при вызове функции параметры напихиваются в стек в обратном порядке (сначала последний, затем предпоследний и т.д.), затем происходит вызов с помощью команды Call. При этом вызываемая функция сама очищает стек от параметров, завершаясь командой Ret N, где N - число байт, которое надо выкинуть из стека нафиг. Обратный порядок передачи необходим для того, чтобы в функциях с переменным числом параметров (типа wsprintf()) сначала шёл параметр, определяющий число остальных параметров (для wsprintf() это будет строка форматирования). Способ вызова каждой функции необходимо смотреть в документации. Несмотря на то, что подавляющее большинство WindowsAPI-функций используют STDCALL, та же пресловутая wsprintf() использует CDECL, по которой параметры напихиваются в стек в обратном порядке, но очищать стек от них должна вызывающая функция (например, выполняя после вызова команду Add Esp, число_байт).
wParam и lParam - стандартные параметры сообщения Уиндовс. Приходящее (отсылаемое) сообщение состоит из 4-х частей: 1 - hWnd - хэндл окна, которому это сообщение предназначено, 2 - uMsg - идентификатор сообщения (например, WM_CREATE), 3 и 4 - wParam и lParam соответственно - параметры сообщения, их смысл зависит от сообщения (напрмер, для WM_SETTEXT lParam является указателем на буфер, содержащий текст, который следует установить как заголовок окна).
Вы передаёте wsprintf() указатель на массив, а строка формата содержит предписание преобразовать параметр в десятичное число, рассматривая параметр как двойное слово. Необходимо либо вызывать wsprintf() в цикле, либо передать ей сразу все элементы массива. Например, так:
movzx eax, byte [fibo + 6] push eax movzx eax, byte [fibo + 5] push eax movzx eax, byte [fibo + 4] push eax movzx eax, byte [fibo + 3] push eax movzx eax, byte [fibo + 2] push eax movzx eax, byte [fibo + 1] push eax movzx eax, byte [fibo] push eax push offset format push offset buffer call wsprintf Соответственно, строку формата нужно изменить на "%d, %d, %d, %d, %d, %d, %d"
Ответ отправлен: 13.05.2004, 23:39
Отправитель: Foamplast
Вопрос № 5265 |
Здравствуйте!
Я получил ответы и кое что не понятно(внизу ответ повторен).
Я не понимаю как влияет деректива .386, если ее поставить до или после. Если после определения сегмента XXX segment, то предпологается использование 32 битного адреса, если до - 16 битного. Почему так?
Почему если в следующей программе поставить дерективу .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
--------------------------------------------------------------------------------
Вопрос отправлен: 11.05.2004, 20:10
--------------------------------------------------------------------------------
Отвечает Ayl
Здравствуйте, Alexander!
Объясняю. При установки типа процессора 386 транслятор предполагает использование 32-битной адресации. Поэтому все смещения вычисляются как 32-битные. Соответственно, в 16-битные регистры оно не лезет, о чем транслятор и сообщает (правда, masm это делает достаточно убого, говоря просто, что операнды должны быть одного размера. Tasm же выражается более четко, выводя сообщение о том, что указатель либо смещение 32-битные).
Исправить это достаточно просто, надо написать такое описание сегмента:
XXX segment USE16
указывая, что все смещения этого сегмента будут 16-битными.
Вопрос отправлен: 12.05.2004, 22:17
Отправитель: Alexander
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Приветствую Вас, Alexander!
Я тебе ответил на этот вопрос.
И Ayl правильно ответил.
Используй определение сегментов и Model.
А ещё лучше посмотри исходники (у меня на сайте, например), и используй, как там. И не заморачивайся наж этим. Делай алгоритм программы, а не страдай этой ерундой с сегментами. И пиши программы под Win32. Дос is obsolete. ;))
Счастливо!
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 13.05.2004, 17:48
Отправитель: Евгений Иванов
Отвечает Ayl
Доброе время суток, Alexander!
Чуть подробнее.
Появление директивы .386 влияет только на код, расположенный ниже ее. Т.е. при таком варианте:
.386
XXX segment
сегмент будет создан как 32-битный.
А при таком:
XXX segment
.386
сегмент будет создан с атрибутами, установленными предыдущими директивами. По умолчанию используется .8086, т.е. 16-битные сегменты.
Ответ отправлен: 13.05.2004, 13:53
Отправитель: Ayl
Отвечает _vt
Приветствую Вас, Alexander!
Если директива .386 не указана до директивы segment, то данный сегмент описывается в режиме .8086, в котором нету 32-битного режима. Ты жк сам пишешь, что в нем нету регистра EAX? Вот и 32-битной адресации нету!
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 13.05.2004, 03:39
Отправитель: _vt
Отвечает Foamplast
Доброе время суток, Alexander!
Вы запутались!
Ayl всё очень хорошо объяснил. У Вас по умолчанию смещения 16-битные. Если вы ставите директиву .386 после определения сегмента, то сегмент уже определён как 16-битный, а значит директива .386 просто разрешает использовать соответствующие команды и регистры. Если же Вы ставите директиву перед определением сегмента, то он определяется как 32-битный и смещение не влезает в 16-битный регистр Di. Избавится от такого поведения можно, указывая разрядность сегмента явно в его определении, что Ayl и предлагает.
Ответ отправлен: 13.05.2004, 23:41
Отправитель: Foamplast
Вопрос № 5266 |
(Извеняюсь если вы подумаете что этот вопрос не по теме.
Вопрос для системщиков)
Уважаемые эксперты подскажите :
У меня время от времени (с периудом 2-3 раза вдень) машина
становится, (зависает),ничего не работает ,просто станет
и всё -недвижимо, хотя изображение на мониторке присутствует.
Подскажите отчего так. Я подозреваю это из-за совмесного
использования ресурсов различными устройствами компьютера.
Тогда вот совмесное использование:
Порт ввода/вывода 0x00000000-0x00000CF7 Шина PCI
Порт ввода/вывода 0x00000000-0x00000CF7 Контроллер прямого доступа к памяти
Порт ввода/вывода 0x000003C0-0x000003DF VIA CPU to AGP2.0/AGP3.0 Controller
Порт ввода/вывода 0x000003C0-0x000003DF RADEON 9100 SERIES
IRQ 21 VIA Rev 5 USB универсальный хост-контроллер
IRQ 21 VIA Rev 5 USB универсальный хост-контроллер
IRQ 21 VIA Rev 5 USB универсальный хост-контроллер
IRQ 21 VIA USB 2.0 Enhanced Host Controller
Адрес памяти 0xD0000000-0xDFFFFFFF VIA CPU to AGP2.0/AGP3.0 Controller
Адрес памяти 0xD0000000-0xDFFFFFFF RADEON 9100 SERIES
Адрес памяти 0xA0000-0xBFFFF Шина PCI
Адрес памяти 0xA0000-0xBFFFF VIA CPU to AGP2.0/AGP3.0 Controller
Адрес памяти 0xA0000-0xBFFFF RADEON 9100 SERIES
Порт ввода/вывода 0x000003B0-0x000003BB VIA CPU to AGP2.0/AGP3.0 Controller
Порт ввода/вывода 0x000003B0-0x000003BB RADEON 9100 SERIES
Порт ввода/вывода 0x0000C000-0x0000CFFF VIA CPU to AGP2.0/AGP3.0 Controller
Порт ввода/вывода 0x0000C000-0x0000CFFF RADEON 9100 SERIES
Подскажите как решить проблему
А система у меня такова:
мать:abit kd7
процессор:Athlon 1800Xp
память:hyundai/hynix ddr dimm 256mb sdram
видеокарта: ATI radeon-9100 128Mb
винт: Seagate Barracuda 40.0 ide скорость:7200
монитор: LG 17" 0.24 Flatron F700B
Вопрос отправлен: 12.05.2004, 23:34
Отправитель: MSMaster
[Следующий вопрос >>] [Список вопросов]
Отвечает Pawel
Доброе время суток, MSMaster!
Ну это не по теме.
А вообще тут дело не в железе, а всего скорее в WinXP или драйверах.
Ответ отправлен: 15.05.2004, 20:48
Отправитель: Pawel
Отвечает Евгений Иванов
Приветствую Вас, MSMaster!
Думаю, у тебя выполнилась команда HLT. ;)
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 13.05.2004, 17:48
Отправитель: Евгений Иванов
Отвечает _vt
Добрый день, MSMaster!
Не, ну таких параноиков редко встретишь... Сначала хотелось тебя просто послать, потом отправить в параллельную рассылку по WinXP, отвечу-ка я лучше здесь - всё равно я же и там буду отвечать :)
Во-первых, это вопрос совершенно не по теме.
Во-вторых, он никоим образом не касается "системщиков" - это вопрос тем, кто собирал твой компьютер.
Ну, и в-третьих, собственно по вопросу: то, что ты указал, как "совместное использование ресурсов" нисколько не является совместным использованием ресурсов. Неужели ты думаешь, что умнее фирмы Microsoft? Объясняю на пальцах - при ситуации, которую ты назвал "совместным использованием", а на самом деле она называется конфликтом устройств, в Диспетчере Задач, рядом с указанием типа оборудования появится такой желтенький кружок с восклицательным знаком внутри. :-) Т.к. у тебя их нету, то в этом плане у тебя проблем нету, ты их сам себе придумываешь.
Ну а теперь, если еще не пропало всякое желание со мной общаться :), можешь описать поподробнее ситуацию, при которой компьютер зависает, и изложить это в вопросе в рассылку по WinNT/2000/XP. Если тебе понравился мой ответ :) - напиши мне на мыло...
E-Man : Life begins at 1000Mhz!
Ответ отправлен: 13.05.2004, 03:40
Отправитель: _vt
Вопрос № 5267 |
Приветствую всех, кто только дошёл до моего вопроса. Хотя можно ли его назвать вопросом... В принципе-то, как и всегда вопрос практически лишён смысла, либо просто задан задом наперёд. Это-то меня и вводит в большие тупики. Пожалуйста, если хоть кто-нибудь поймёт вопрос, то помогите мне с ответом на него.
Связано ли использование процедур с местом их размещения в сегменте кодов?
Вопрос отправлен: 13.05.2004, 06:12
Отправитель: Tiana (ptaniya@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает VOVAN
Приветствую Вас, Tiana!
врядли, даже можно сказать нет!
Ответ отправлен: 13.05.2004, 18:07
Отправитель: VOVAN
Отвечает Ayl
Здравствуйте, Tiana!
Конечно, нет. Просто если ты используешь вызов до описания, то скорее всего придется компилировать в 2 прохода.
Ответ отправлен: 13.05.2004, 13:53
Отправитель: Ayl
Отвечает Pawel
Доброе время суток, Tiana!
НЕТ! Это же ПРОЦЕДУРЫ.
Ответ отправлен: 15.05.2004, 20:51
Отправитель: Pawel
Отвечает Foamplast
Здравствуйте, Tiana!
| |||
Совершенно не понятно, откуда такой вопрос взялся. Вам его задали что ли? Попросите спрашивающего уточнить, что он имел ввиду. В некотором смысле использование процедур, конечно, связано с их размещением, так как если процедуры не разместить в сегменте кода, то и использовать их будет нельзя. |
Ответ отправлен: 13.05.2004, 23:42
Отправитель: Foamplast
Отвечает Стас
Здравствуйте, Tiana!
Не понятно о чем идет речь.
В принципе процедура - она и есть процедура - делает то,
что должна, а где она будет расположена - какая разница?
Ответ отправлен: 15.05.2004, 04:23
Отправитель: Стас
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (24) C / C++ (14) Perl (3) Builder / Delphi (17) Pascal (19) Basic / VBA (2) Java / JavaScript (3) PHP (11) Криптография (7) WinAPI (7) Радиоэлектроника (5) |
Пользователю Windows 95/98/Me (36) Windows NT/2000/XP (50) "Железо" (27) Поиск информации (15) |
Администратору Windows NT/2000/XP (24) Linux / Unix (8) |
Юристу Гражданское право (10) Семейное право (7) Трудовое право (9) КоАП (6) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||