Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [ASM] Подсчет пятниц в году


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

Задача состоит в следующем: программа должна печатать все годы нашего столетия, содержащие максимальное количество пятниц. Помогите, пожалуйста!

Автор: St. Andrew 21.5.2005, 00:21
Вот я даже код наваял на Си++ . Может кто-ть это в ассембер перевести?
Код

#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();
}

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

Автор: rsm 22.5.2005, 11:46
Код

;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]" если она все равно не используется и не стал ее вводить. Но если нужно добавлю.

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

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

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

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

Автор: St. Andrew 24.5.2005, 16:28
Спасибо за решение и за хорошие советы. Вообще было бы интересно почитать про дизассемблирование ...есть какие-ть источники этой премудрости?

Автор: Yanis 24.5.2005, 17:10
http://wasm.ru/index.php
Цитата

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)