Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ASM 2 C, очень простой пример 
:(
    Опции темы
AkimVital
Дата 30.1.2007, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.11.2005

Репутация: нет
Всего: нет



Сознаюсь сразу - в ассемблере - ламер.
нужно перевести код 
Код

mov  eax, n
dec  eax

b:
bsf  ecx, eax
shr  eax, cl
jp b

mov  q, eax
mov  k, ecx

на СИ, как по мне - вроде бы не сложно, НО я не знаю ассемблера =)
Помогите плз
PM MAIL   Вверх
MAKCim
Дата 30.1.2007, 17:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 1
Всего: 207



Код

int n, i, j, q, k;
...
--n;
do {
    for (i = 0, j = n; !(j  & 1); j >>= 1, ++i);
    n >>= i;
    k = i;
    for (i = 0, j = 0; i < 8; ++i)
           if ((n >> i) & 1) ++j;
} while (!(j & 1));
q = n;
...

может можно проще

Это сообщение отредактировал(а) MAKCim - 30.1.2007, 17:45


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
W4FhLF
Дата 30.1.2007, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Код

    unsigned int n,k,q; // in variable
    int i; // count
    //...
    n--;
    do {
    for (i = 1, k = 0; i < 0xFFFFFFFF; i <<=1, k++)
        if ((n & (-n)) & i) 
        {
            n >>= k;
            break;
        }
    } while (!(n & 1));
    q = n;


Тока честно говоря я так и не понял смысла данного кодаsmile

Это сообщение отредактировал(а) W4FhLF - 30.1.2007, 19:15


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
AkimVital
Дата 30.1.2007, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 25.11.2005

Репутация: нет
Всего: нет



о... большое спасибо...
этим кодом была написана одна функция в си (заимствованная), взятая в __asm {}. По идее она должна приводить число n к виду n = 1 + 2kq, а что она делает на самом деле, ща посмотрю... =)
PM MAIL   Вверх
W4FhLF
Дата 30.1.2007, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Блин, работаетsmile)

Код

int main(int argc, char* argv[])
{
    unsigned int n,k,q; // in variable
    int i; // count
    n = 37;
    n--;
    do {
    for (i = 1, k = 0; i < 0xFFFFFFFF; i <<=1, k++)
        if ((n & (-n)) & i) 
        {
            n >>= k;    
            break;
        }
    } while (!(n & 1));
    q = n;
    printf("37 = 1 + 2*%d*%d", n, k, q);
    getch();
    return 0;
}


Result:
>37 = 1 + 2*9*2

Добавлено @ 19:48 
Хотя через разsmile


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
sgi1981
Дата 1.2.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Цитата(AkimVital @ 30.1.2007,  17:28)
Код

b:
bsf  ecx, eax
shr  eax, cl
jp b

Мне кажется, что код это плохой.
Обосную так.
Допустим, исходное значение n=4

mov  eax, n
dec  eax


;eax=3

далее идет цикл
b:
bsf  ecx, eax;
в ecx получается значение 0, так как значение 3 в двоичном представлении = 11 и нулевой бит равен 1 (нумерация идет от нуля)
shr  eax, cl;никаких изменений в eax не происходит
jp b;количество единичных битов четно (2 единичных бита)
;в результате получаем зацикливание


Это сообщение отредактировал(а) sgi1981 - 1.2.2007, 17:23


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Dude03
Дата 1.2.2007, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



4 нельзя привести к нужному виду при целых k и q.
PM MAIL   Вверх
V.A.KeRneL
Дата 3.2.2007, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Vadim A. Kazantsev
**


Профиль
Группа: Участник
Сообщений: 291
Регистрация: 3.12.2006
Где: Moscow, Russia

Репутация: нет
Всего: 14



Цитата(sgi1981 @  1.2.2007, 17:22 Найти цитируемый пост)

;в результате получаем зацикливание

Цитата(Dude03 @  1.2.2007, 19:34 Найти цитируемый пост)

4 нельзя привести к нужному виду при целых k и q.

Зацикливание, пА-любому, плохо. Если число не подходящее, надо возвращать ошибку, например, через какой-нибудь флаг, можно отвести под это дело регистр.



--------------------
«C'est un pense-creux d'ici. C'est le meilleur et le plus irascible homme du monde...» © Ф.М. Достоевский, «Бесы»
---/)/)---(\.../)---(\(\
--(':'=)---(=';'=)---(=':')
(")(")..)-(").--.(")-(..(")(")

PM MAIL IM ICQ AOL YIM MSN   Вверх
Dude03
Дата 4.2.2007, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 257
Регистрация: 28.4.2006

Репутация: нет
Всего: 6



Цитата(V.A.KeRneL @  3.2.2007,  22:43 Найти цитируемый пост)
Зацикливание, пА-любому, плохо. Если число не подходящее, надо возвращать ошибку, например, через какой-нибудь флаг, можно отвести под это дело регистр.

это лишь кусок кода. Кто знает как она получает данные и что с ними делает. Но код красивый.=)
PM MAIL   Вверх
Konstantinopol
Дата 10.2.2007, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 10.2.2007

Репутация: нет
Всего: нет



Помогите написать на Ассеблере под DOS
1.Отсорировать пять чисел по возрастанию.
2.Дан массив размерности n.Найти первый отрицательный элемент.
3.В строке заменить все символы '1' символом '0', а символы '0' символом '11'

icq487600521
PM MAIL   Вверх
JackYF
Дата 23.2.2007, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 1
Всего: 162



Konstantinopol, *вздыхая* в Центр Помощи обратись.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1049 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.