Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [ASM] Подсчет пятниц в году 
:(
    Опции темы
St. Andrew
Дата 19.5.2005, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Доброго всем здравия! Нужно в достаточно сжатые строки решить задачу на ассемблере, но из-за параллельного курсовика на СИ++ времени не остается вообще ни на что. Если кто накидает код или подскажет алгоритм - буду очень рад!!! smile

Задача состоит в следующем: программа должна печатать все годы нашего столетия, содержащие максимальное количество пятниц. Помогите, пожалуйста!
--------------------
Оглянитесь вокруг! В мире так много прекрасного!
PM MAIL WWW ICQ   Вверх
St. Andrew
Дата 21.5.2005, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Вот я даже код наваял на Си++ . Может кто-ть это в ассембер перевести?
Код

#include <stdio.h>

void main()
{
    //In a year of 365/366 days. 1 year = 52 weeks + 1 day. 1 leap-year = 52 weeks + 2 days.
    //At least in a year of 52 Fridays. 
    //But if year has begun on Friday to end it too on Friday, 
    //it turns out in it to year there were 53 Fridays.

    //В году 365/366 дней. 1 год = 52 недели + 1 день. 1 високосный год равен 52 недели + 2 дня.
    //Как минимум в году 52 пятницы.
    //Но если год начался в пятницу, закончиться он тоже в пятницу(високосный закончиться в субботу),
    //получается, что в таком году было 53 пятницы.

    //Для решения данной задачи достаточно просто определять, в какой день недели год начался
    //и в какой закончился с учетом високосных годов.    

    //и так. дни недели я обозначаю номерами от 1 до 7.

    unsigned char years[100]; // индексы буди идти от 00 до 99.

    //2000 год начался в понедельник и был высокосным.

    unsigned int s, e, k;

    e = 7;//начальные данные, 1999 год закончился в воскресенье
    k = 0;//количество
    int i;
    for (i=0; i<99; i++)
    {
        s = e+1;
        if (s > 7) s = s-7;
        
        e = s;
        if (i % 4 == 0) e++;//если год високосный (ведь 2000- высокосный, и каждый 4-ый тоже высокосный), то ещё один день прибавляем

        if ((s<=5) && (e>=5))
        {
            years[i] = 53; 
            k++;
            printf("%d, ", 2000+i);
            if (k%13 == 0) printf("\n");
        } else years[i] = 52;        
    };

    printf("\nIn total years with the greatest quantity of Fridays - %d", k);
    getchar();
}

--------------------
Оглянитесь вокруг! В мире так много прекрасного!
PM MAIL WWW ICQ   Вверх
segmentation_fault
Дата 22.5.2005, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Не уверен насчет других компиляторов но например gcc если укажешь опцию -S переводит c++ код в ассемблер. Думаю у всех компиляторов должна быть такая опция.
PM MAIL   Вверх
rsm
Дата 22.5.2005, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

;set fasminc=c:\fasm\include
;goto make

format PE GUI 4.0
include '%fasminc%\win32a.inc'

      or eax,-1               ; i = -1
      mov esi,7               ; e = 7
      xor ebx,ebx             ; s = 0
_loop:
      inc eax                 ; i++
      cmp eax,99              ; i == 99
      je _exit
      lea ebx,[esi+1]         ; s = e + 1
      cmp ebx,7               ; if (s > 7)
      jle @F                  ;
      sub ebx,7               ; s -= 7
@@:
      mov esi,ebx             ; e = s
      push eax
      mov ecx,4
      cdq
      div ecx                 ; i % 4
      pop eax
      test edx,edx            ; if (!(i % 4)) 
      jnz @F
      inc esi                 ; e++
@@:
      cmp ebx,5               ; if ((s <= 5) &
      jg _loop
      cmp esi,5               ; & (e >= 5))
      jl _loop
      pusha
      add eax,2000            ; 2000 + i
      invoke wsprintf,buff,fmt,eax
      add esp,0Ch
      invoke MessageBox,0,buff,0,0
      popa
      jmp _loop
_exit:      
      invoke ExitProcess,0
      
buff rb 20h
fmt db '%d',0

data import
   library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
   include '%fasminc%\apia\kernel32.inc'
   include '%fasminc%\apia\user32.inc'
end data

;:make
;c:\fasm\fasm %0
;pause


Не совсем понял зачем нужна переменная "unsigned char years[100]" если она все равно не используется и не стал ее вводить. Но если нужно добавлю.

Это сообщение отредактировал(а) rsm - 22.5.2005, 11:48
PM MAIL   Вверх
Payne
Дата 22.5.2005, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Детектив
*


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

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



Цитата(segmentation_fault @ 22.5.2005, 10:11)
Не уверен насчет других компиляторов но например gcc если укажешь опцию -S переводит c++ код в ассемблер. Думаю у всех компиляторов должна быть такая опция.

Могу предложить альтернативный вариант: скомпилировать сишную программу, а затем дизассемблировать ее в досовском Debug'e или в IDA.
PM MAIL WWW ICQ Skype   Вверх
Yanis
Дата 22.5.2005, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Payne @ 22.5.2005, 18:12)
Могу предложить альтернативный вариант: скомпилировать сишную программу, а затем дизассемблировать ее в досовском Debug'e или в IDA.

А это вариант =)


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
St. Andrew
Дата 24.5.2005, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Спасибо за решение и за хорошие советы. Вообще было бы интересно почитать про дизассемблирование ...есть какие-ть источники этой премудрости?
--------------------
Оглянитесь вокруг! В мире так много прекрасного!
PM MAIL WWW ICQ   Вверх
Yanis
Дата 24.5.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



WASM.RU
Цитата

Сайт WASM.RU призван предоставить как можно более полную и развернутую информацию по следующим темам:

    * Программирование на ассемблере под различные операционные системы (в настоящее время большая часть материалов касается программирования на этом великолепном языке под Windows)
    * Системное программирование
    * Сетевое программирование
    * Отладка и дизассемблирование программ
    * Защита от предыдущего пункта
    * Вопросы, касающиеся различных аспектов безопасности smile
    * СМ и связанные с этим (и не только) технологии

Ещё можно глянуть на cracklab.ru


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

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

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


 




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


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

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