Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 13 из 33<  1 ... 10  11  12  13  14  15  16 ... 33  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

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 нам заменяет небосвод...


 

Member
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
Народ, извините, что влезаю со своим вопросом, но не тему же отдельную создавать.

Почему надо делать так
mov ax, @data
mov ds, ax

А не так
mov ds, @data


 

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.
(c) AMD64 Architecture Programmer’s Manual Volume 3


 

Member
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
Holmes писал(а):
Не "на самом деле". Допускается загрузка значений из РОНов в сегментные регистры, равно как и загрузка значений из памяти.

То есть, получается так: mov ds, @data - можно делать? Но так не работает!


И еще пара вопросов:
1.
source db "Test string", '$'

Зачем в конце знак бакса?

2.
.....
assume ds:@data, es:@data
main:
mov ax, @data
mov ds, ax
mov es, ax
.....

Команда assume выполняет привязку рег. ds & es к сегменту данных, тогда зачем ниже идут эти строки кода
mov ax, @data
mov ds, ax
mov es, ax

ведь уже привязали сегмент к регистрам?


 

Advanced member
Статус: Не в сети
Регистрация: 12.01.2004
M9IC
M9IC писал(а):
source db "Test string", '$'

Зачем в конце знак бакса?

Знак окончания строки.

_________________
Sapienti sat


 

Member
Статус: Не в сети
Регистрация: 01.04.2005
Откуда: Москва-Лубянка
M9IC Необходимо не только указать ассемблеру, какие регистры соответствуют каким сегментам, но и занести в эти регистры адреса сегментов.

_________________
AnossovPavel в проекте F@H (TSC!Russia)
退屈な祖父 ¤ παππούς ¤ («клан дедов»)


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
M9IC писал(а):
Holmes писал(а):
Не "на самом деле". Допускается загрузка значений из РОНов в сегментные регистры, равно как и загрузка значений из памяти.

То есть, получается так: mov ds, @data - можно делать? Но так не работает!


И еще пара вопросов:

2.
.....
assume ds:@data, es:@data
main:
mov ax, @data
mov ds, ax
mov es, ax
.....

Команда 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
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
Holmes писал(а):
Вычислить смещение тебе нужно самому

Так я это и пытаюсь сделать, по формуле
M9IC писал(а):
искомый_элемент = начало_массива +(кол-во_ элементов_ в_строке * i + j) * размер элементов


искомый_элемент=matrix + di * 8 + si, размер элементов можно не учитывать, т.к. они по 1 байту.
Добавлено спустя 5 минут, 18 секунд
Holmes писал(а):
Ничего геморного, просто нужно читать документацию.

Да я уж учебник весь прочитал от корки до корки, прочитать код могу, а самому написать - проблемы


 

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
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
lea bx,[di * 8 + si]
**Error** v34_1.ASM(37) Illegal indexing mode


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
M9IC писал(а):
lea bx,[di * 8 + si]
**Error** v34_1.ASM(37) Illegal indexing mode

Что за транслятор юзаешь? И кусок кода дай! Так можно флеймить до второго пришествия!


 

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, то переход будет выполнен, в противном случае - нет.


 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Holmes писал(а):
Двумерные массивы не поддерживаются

Кто-ж тебе такое наврал? Все вполне работае.
Т.е. подобный отрезок кода вполне работоспособен:
Код:
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! :-)


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 13 из 33<  1 ... 10  11  12  13  14  15  16 ... 33  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan