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

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, NasmVisual C, DelphiPHP, 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  
     XorEax, Eax
     XorEcx, Ecx
     DecEcx 
     MovEdi, szMyCoolString
    Repne  Scasb    

    А если сразу же нужно найти последний символ "/" в строке, то делают так:

     Std  
     MovAl, '/'
     XorEcx, Ecx
     DecEcx 
    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() в цикле, либо передать ей сразу все элементы массива. Например, так:

    movzxeax, byte [fibo + 6]
    pusheax
    movzxeax, byte [fibo + 5]
    pusheax
    movzxeax, byte [fibo + 4]
    pusheax
    movzxeax, byte [fibo + 3]
    pusheax
    movzxeax, byte [fibo + 2]
    pusheax
    movzxeax, byte [fibo + 1]
    pusheax
    movzxeax, byte [fibo]
    pusheax
    pushoffset format
    pushoffset buffer
    callwsprintf

    Соответственно, строку формата нужно изменить на "%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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
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.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.


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


В избранное