Member
Статус: Не в сети Регистрация: 05.06.2005 Откуда: Н. Новгород Фото: 0
Билли Бонс Дык... интересный какой! В 16-ричном виде я тоже могу быстрее сделать и без асма. За код спасибо, внимательнее гляну чуть позже. Прога по ссылке старой версии, возьми от времени этак 60% с учётом заработавшего асма. Останется 30 сек. А ты ещё половину операций, причём наиболее медленных, скостил на 16-ричность, и даже больше половины. Так что вот так что. Лохматый код рулит. Я тоже примерно с того, что у тебя, начинал, но в десятичном виде и в куда более тупой реализации. И скорость была адски маленькая.
Кстати, отставание сибилдера от дельфи сохранилось и даже немного подросло, что толкает на нехорошие мысли...
Билли Бонс писал(а):
почему-то не правильно считает факториал числа меньшего 10
Добрый день.
Такая ситуация - неплохо пишу на BuilderC++, поэтому основы знаю. Сейчас, от нефиг делать, решил попробовать писать по Windows на ассемблере (только не спрашивайте, зачем мне это нужно =) Посему пару вопросов.
1. Чем отличаются окна от диалоговых окон? Серьезно, не понимаю. Вот когда в Builderе создаешь обычную форму - это чего - окно или диалог? Если окно - то как "оно" умудряется туда элементы (кнопочки, например) запихивать? Если диалог - см. вопрос два.
2. Конкретный пример: надо было нарисовать НУ ОЧЕНЬ простую программу. Нафига мне билдер? Взял ассемблер, нарисовал диалог, в нем стандартный Edit. Уперся в то, что винда НЕ ПОСЫЛАЕТ сообщение WM_CHAR моему окну, хотя содержимое Edit-а меняется. Как отловить момент изменения текста? Ну бог с ним, решил задачу через одно место: создал окно (не диалог), на нем втупую, вручную, через контекст нарисовал линии в виде edit-а, все изменения оного рисую вручную. Теперь проблема в том, что винда-то не знает, что я что-то рисовал, поэтому не всегда мне посылает сообщение WM_PAINT, когда надо перерисовать элементы (не, я и с этим справился, но хочу узнать как НАДО, а не как у меня реализовано).
3. Есть какой-нить простой способ создать "красивое окно"? Т.е. использовать JPEG для оформления? А то BMP такой размер имеют, что вся прелесть написания на ассемблере пропадает =(
Сцылочки на документацию, примеры приветствуются =)
Member
Статус: Не в сети Регистрация: 04.01.2004 Откуда: 31
Vasya1234567 www.wasm.ru Найдется всё (r) yandex Добавлено спустя 1 час, 7 минут, 12 секунд По поводу 3-го пункта. Если уж совсем компактно и прям как гуру на ассемблере то надо генерить картинку программно .
Member
Статус: Не в сети Регистрация: 30.07.2006 Откуда: Москва-Ярик
Vasya1234567 1. Диалоговые окна отличаются тем что у них другая оконная процедура, и в классических случаях они порождаются из шаблонов (которые в свою очередь грузятся из ресурсов). В окне как правило дополнительные элементы управления создаются динамически (CreateWindow(Ex)) - этот механизм кстати используется для отображения форм VCL (Delphi).
2. Для разрешения таких мелочей, надо не с ассемблером связываться, а для начала покурить MSDN. Это сообщение не отправляется родительскому окну, по отношению к EDITу - так что тебе сабклассить надо его функцию, или ловить его на уровне цикла обработки сообщений (после вызова GetMessage).
3. Простых способов нет - особо сложных тоже. Для начала реши эту задачку на Си, с использованием WinAPI - дальше будет проще. Хотя либу для распаковки JPEG - тебе определенно придется найти.
_________________ Плавайте поездами Аэрофлота! И синий BSOD нам заменяет небосвод...
Advanced member
Статус: Не в сети Регистрация: 30.08.2003 Откуда: Санкт-Петербург
M9IC потому что прямая запись в сегментные регистры из ячейки памяти в x86 невозможна.
PS: насколько я помню на самом деле это связано с кодировкой ассемблерной команды в машинные коды.
_________________ {:€ дед в законе :-) нородный окодемег почетный пользователь OpenSuSE 11.3 Ремонт и модернизация ноутбуков IBM (Lenovo) ThinkPad
Member
Статус: Не в сети Регистрация: 30.06.2005 Откуда: Питер
Root писал(а):
M9IC потому что прямая запись в сегментные регистры из ячейки памяти в x86 невозможна. PS: насколько я помню на самом деле это связано с кодировкой ассемблерной команды в машинные коды.
Не "на самом деле". Допускается загрузка значений из РОНов в сегментные регистры, равно как и загрузка значений из памяти.
Код:
MOV segReg, reg/mem16 Move the contents of a 16-bit register or memory operand to a segment register.
Команда assume выполняет привязку рег. ds & es к сегменту данных, тогда зачем ниже идут эти строки кода mov ax, @data mov ds, ax mov es, ax
ведь уже привязали сегмент к регистрам?
ИМХО, дело в ассемблере, т.е. в трансляторе. Может синтаксис неверен или еще что-нибудь там.
На самом деле, ASSUME ничего не присваивает, а всего лишь дает некоторые указания транслятору.
Вот цитатка из MSDN (раздел MASM'а):
After an ASSUME is put into effect, the assembler watches for changes to the values of the given registers. ERROR generates an error if the register is used. NOTHING removes register error checking. You can combine different kinds of assumptions in one statement.
Member
Статус: Не в сети Регистрация: 15.11.2003 Откуда: Moscow\Russia
mov si, [di]*8
что я делаю этой строчкой, точнее интересует, что делают скобки [ ], для чего применяются ? Добавлено спустя 39 минут, 23 секунды подскажите как получить доступ к нужному элементу массива
вот я объявил массив
matrix db 14 dup (8 dup (0))
Я хочу его трактовать как 2х мерный, тогда нужный элемент будет по адресу
i = нужная строка
j = нужный столбец
искомый_элемент = начало_массива +(кол-во_ элементов_ в_строке * i + j) * размер элементов
mov matrix[di*8][si],1
di у меня содержит номер строки, т.е. i
si - номер столбца, т.е. j
размер_элементов опускаем, т.к. они по одному байту
вроде правильно, но у меня не работает, пишет такое
**Error** v34_1.ASM(29) Illegal indexing mode
Member
Статус: Не в сети Регистрация: 30.06.2005 Откуда: Питер
M9IC писал(а):
mov si, [di]*8 что я делаю этой строчкой, точнее интересует, что делают скобки [ ], для чего применяются ?
Квадратные скобки - оператор "взятия" адреса. Если не ошибаюсь, в твоем примере с равным успехом можно написать так: mov si,[di * 8]
M9IC писал(а):
подскажите как получить доступ к нужному элементу массива вот я объявил массив
matrix db 14 dup (8 dup (0))
mov matrix[di*8][si],1
di у меня содержит номер строки, т.е. i si - номер столбца, т.е. j размер_элементов опускаем, т.к. они по одному байту
вроде правильно, но у меня не работает, пишет такое **Error** v34_1.ASM(29) Illegal indexing mode
Двумерные массивы не поддерживаются. Поэтому этот код ошибочен. Есть база массива, есть смещение внутри, есть размер элемента. Это всё! Вычислить смещение тебе нужно самому, а какой это массив с точки зрения логики твоей программы - дело твое. В случае двумерных массивов вычисления достаточно просты (общий и самый банальный алгоритм):
Код:
imul eax,ecx ; IN: eax=Y, ecx=array_width, OUT: edx:eax=array_width * Y add eax,ebx ; IN: ebx=X, OUT: eax=array_width * Y + X mov eax,[edi + eax] ; IN: eax=..., edi=array_mem_offset, OUT: eax=[array_width * Y + X]=[X][Y]
Если ширина массива - степень двойки можно пооптимизировать этот код. Еще раз: это самый общий, простой и наглядный вариант.
M9IC писал(а):
Блин какой ассемблер геморный язык
Ничего геморного, просто нужно читать документацию.
Member
Статус: Не в сети Регистрация: 30.06.2005 Откуда: Питер
M9IC писал(а):
Holmes писал(а):
Вычислить смещение тебе нужно самому
Так я это и пытаюсь сделать, по формуле
M9IC писал(а):
искомый_элемент = начало_массива +(кол-во_ элементов_ в_строке * i + j) * размер элементов
искомый_элемент=matrix + di * 8 + si, размер элементов можно не учитывать, т.к. они по 1 байту.
Извини, ты через строчку читаешь? Я русским языком написал "Двумерные массивы не поддерживаются. Поэтому этот код ошибочен". И привел алгоритм, как можно работать с произвольными двумерными массивами. Он недостаточно ясен?
Формула верна, но твои дальнешие выводы "искомый_элемент=matrix + di * 8 + si" в корне не верны! Это не закодить одной командой! Вот это понятно?
Код:
lea bx,[di * 8 + si] mov ax,[cx + bx]
где, в регистре CX лежит смещение массива matrix, а в DI и SI смещения в массиве.
Member
Статус: Не в сети Регистрация: 24.12.2004 Откуда: Ставрополье
Есть такой код:
mov si,017A9 ;"??"
call 000008DD2 ---?
xor edx,edx
or al,al je 000009C61 ---?
Меня интересует последнее условие - я так понял, что если or al, al (равно 0), то переход на 9С61, правильно ?
_________________ Ставрополье Оверклокерс http://forums.overclockers.ru/viewtopic.php?t=125746 -= World Of Tanks =- (для связи Ватс Ап +7-903-418-03-43)
Member
Статус: Не в сети Регистрация: 30.06.2005 Откуда: Питер
FatumNNM писал(а):
Есть такой код:
mov si,017A9 ;"??" call 000008DD2 ---? xor edx,edx or al,al je 000009C61 ---?
Меня интересует последнее условие - я так понял, что если or al, al (равно 0), то переход на 9С61, правильно ?
Уверен что вопрос по теме?
Команда OR установит флажки ZF, SF, PF в соответствии с результатом операции, JE выполняет переход по ZF=1, соответственно, если AL=0, то переход будет выполнен, в противном случае - нет.
Кто-ж тебе такое наврал? Все вполне работае. Т.е. подобный отрезок кода вполне работоспособен:
Код:
masrez db 4*7 dup(0) много всего mov BX,6 mov DI,3 mov masrez[DI][BX],AL
Добавлено спустя 15 минут, 57 секунд
M9IC писал(а):
Команда assume выполняет привязку рег. ds & es к сегменту данных, тогда зачем ниже идут эти строки кода mov ax, @data mov ds, ax mov es, ax
ведь уже привязали сегмент к регистрам?
Комманда assume ничего не привязала. Это лишь указание ассемблеру, к какому сегменту относится данный сегментный регистр. Т.е. комманда assume ds:@data дает возможность обращаться к данным из регистра DS явно его не указывая. Привязку к DS делать, строго говоря, не обязаьельно. Т.к. если сегментный регистр не указан явно, то считается, что нужен DS. Добавлено спустя 2 минуты, 22 секунды
Holmes писал(а):
Допускается загрузка значений из РОНов в сегментные регистры, равно как и загрузка значений из памяти.
Однако напрямую загрузка значения в сегментный регистр невозможна!
_________________ I L.A.W. you, baby!
For a GNU dawn! For freedom!
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения