Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. lexaOr

    lexaOr New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2009
    Сообщения:
    2
    Ребят, спасибо вам большое за такое активное обсуждение и помощь. Я прямо в смятении от такого количества информации. Постараюсь сейчас во всем разобраться. Mikl___, именно кириллица и требуется.
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    max7C4
    Не знаю что понимать под короче - только код или код + данные
    В #1899
    корректнее будет add dl,[ebx+eax] если table db для add edx,[ebx+eax*4] должно быть table dd
     
  3. Alasmus

    Alasmus New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2009
    Сообщения:
    2
    Приветствую! Без лишних словоизлияний прошу помощи и поясню задачу. Есть лаба с заданием

    " Написать на ассемблере подпрограмму вывода на экран значения регистра AX в десятичной системе счисления без использования прерываний DOS и BIOS (для текстового режима видеокарты, для процессора Intel 8086) ", т.е. кто-либо пишет программу, решает забить в AX 1234 и потом вызвать подпрограмму для перевода числа в десятичную систему и вывода его на экран(без прерываний, повторюсь))

    и также есть программа с багами:

    Код (Text):
    1. mov ax,0B800h      
    2. mov es,ax                        
    3. mov di,0               
    4.  
    5. mov es:[di],ax
    6.  
    7. std
    8.  
    9. mov cx,10              
    10. Repeat:
    11.     xor dx,dx          
    12.     div cx            
    13.                                        
    14.     xchg    ax,dx          
    15.     add al,'0'          
    16.     stosb                  
    17.     xchg    ax,dx          
    18.     or  ax,ax          
    19.     jne Repeat
    ошибки заключаются в том, что используя эту подпрограмму AX испортится, т.е. его надо "сохранить". насколько я понимаю это можно сделать через push и pop? второе это последние две строчки:
    Код (Text):
    1. or  ax,ax          
    2. jne Repeat
    здесь он должен сравнивать с нулем, а как мне объяснили он не сравнивает, а обнуляет, что не имеет смысла. вот здесь я не могу понять как сделать.

    и еще "stosb", там вообще это нужно? Ассемблером начал заниматься неделю назад,котелок не варит, заранее благодарю если кто ответит!
     
  4. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Alasmus
    1. правильно понимаешь
    2. нет, неправильно объяснили. Обнуляет xor, а or - в данном случае "сравнивает"
    3. stosb в данном случае выполняет вывод на экран результата. Но как раз "бажно" - потому что в текстовом режиме чередуются символы и атрибуты, то есть надо еще inc di делать
     
  5. Alasmus

    Alasmus New Member

    Публикаций:
    0
    Регистрация:
    29 окт 2009
    Сообщения:
    2
    Благодарю, все встало на свои места)
     
  6. maniak

    maniak New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    2
    Здравствуйте, товарищи. Помогите пожалуйста с задачей: "Нужно написать программу, позволяющую проводить удаление каталога со всеми файлами и каталогами внутри него. Обрабатываемый каталог указывается в командной строке, по завершению работы программа должна вывести количество удаленных файлов и каталогов".

    Я так понял, надо делать рекурсивную функцию и ей передавать каталог. Она смотрит все, что внутри. Если попался каталог, вызывает рекурсивно себя для этого каталога, а если файл - то стирает его, после чего стирает сам каталог.

    Помогите кто чем может, буду признателен за исходники :)
     
  7. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Блин, ну вы хоть бы язык указали)) FASM, MASM, C/C++, C#, VB, Java, Delphi?? Какая ОС? А то сидишь и думаешь толи просто сказать юзай апи, то ли сказать юзай invoke апи... В любом случае если ОС=Винда, то вам пригодятца RemoveDirectory, FindFirstFile/FindNextFile, описание этих функций можно найти на MSDN, либо просто где-то в гугле, набрав "функция RemoveDirectory"

    Программа (на любом языке кроме высокоуровненвых будет выглядеть так:

    Код (Text):
    1. int CountFileInDirectory (char* DirectoryName)
    2. {
    3.   int count = 0;
    4.   OFSTRUCT of;
    5.   FindFirstFile (****);
    6.   .......
    7.   if (FileType == Directory)
    8.   {
    9.    count += CountFileInDirectory (File) + 1; //1 - самa папку
    10.    RemoveDirectory(File); //Удаляем папку
    11.   }
    12.   else
    13.  {
    14.    OpenFle (FileName, &of,512); //Удаляем файл нафик
    15.    count++;
    16.  }
    17.   FindNextFile (***);
    18.   return count; //Возвращаем число удаленных эл-ов в папке
    19. }
    20.  
    21. int main ()
    22. {
    23.    printf("Remove: %d\n",CountFileInDirectory ("C:\Windows"));
    24.    RemoveDirectory ("C:\Windows");
    25. }
    Ну если МАСМ, то тоже самое тока инвоук добавь))) а перед переменными local. Надеюсь что подал верное направление, хотя могу ошибацца. Есть ещё вариант с system("rmdir"); но думаю ваши преподы не оценят юмора...
     
  8. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Praetor11
    Оне не догадываются что диалекты асм бывают разные, но, как правило, для учебных целей лабают на tasm, реже на masm 16-разрядные программы под DOS :)
     
  9. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Так, ща появилось малость свободного времени, и минут за 10 был накатан вот такой файл на си++:

    Код (Text):
    1. #include<stdio.h>
    2. #include<conio.h>
    3. #include<windows.h>
    4.  
    5. int RemoveFileFromDirectory (const char* Directory)
    6. {
    7.     int remove_count = 0; //Ñ÷åò÷èê óäàëåííûõ ôàéëîâ
    8.     OFSTRUCT of; //Ñòðóêòóðà äëÿ óäàëåíèÿ ôàéëîâ
    9.     WIN32_FIND_DATA FileData; //Èíôîðìàöèÿ î íàéäåííûõ âåùàõ
    10.     HANDLE File; //Äåñêðèïòîð ïîèñêà
    11.     char Search [500]; //Ñòðîêà äëÿ ïîèñêà
    12.     int len = 0; //Äëèíà ñòðîêè Search
    13.     //Ñîñòàâëÿåì ñòðîêó äëÿ ïîèñêà
    14.     lstrcpyA(Search, Directory); //Êîïèðóåì èìÿ äèðåêòîðèè â ñòðîêó ïîèñêà      
    15.     lstrcatA (Search, "\\*"); //Äîáàâëÿåì ìàñêó ïîèñêà, äëÿ íàøåãî ñëó÷àÿ - *
    16.        
    17.     File = FindFirstFileA(Search, &FileData); //Íà÷èíàåì ïîèñê
    18.    
    19.     if (File != INVALID_HANDLE_VALUE) //Åñëè â äèðåêòîðèè ÷òî-òî åñòü
    20.     {
    21.        len = lstrlenA(Search) - 1; //Ïîëó÷àåì äëèíó ñòðîêè Search
    22.        do //Ïðîõîäèì ïî âñåìó ÷òî òàì ëåæèò
    23.        {  //Åñëè ýòî íå ïàïêè ñî ñòðàííûìè íàçâàíèÿìè . è ..
    24.           if (FileData.cFileName[0] != '.')
    25.           {  
    26.               Search[len] = '\0'; //Îáðåçàåì ñòðîêó ïî äëèíå äî ñëåøà
    27.               lstrcatA (Search, FileData.cFileName); //Äîáàâëÿåì ê ïóòè èìÿ óäàëÿåìîãî ýëåìåíòà                                  
    28.               //Óõòû ýòî - äèðåêòîðèÿ
    29.               if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) > 0)
    30.               { //Âûçûâàåì ðåêóðñèâíî äëÿ ýòîé äèðåêòîðèè ôóí-þ óäàëåíèÿ
    31.                 remove_count += RemoveFileFromDirectory (Search);
    32.               }
    33.               else //Ýòî - ôàéë
    34.               {
    35.                 OpenFile(Search,&of,512); //Óäàëÿåì ôàéë
    36.                 remove_count ++;  //Óäàëèëè ôàéë - óðà
    37.               }                        
    38.           }
    39.        }
    40.        while (FindNextFileA(File, &FileData)); //Ïîêà ÷òî-ëèáî íàõîäèì
    41.        FindClose (File); //Çàâåðøàåì ïîèñê
    42.     }
    43.     RemoveDirectoryA(Directory); //Óäàëÿåì êàòàëîã â êîòîðîì âåäåì ïîèñê
    44.     remove_count++; //Ñ÷òå÷èê
    45.     return remove_count;  //Âîçâðàùàåì êîë-âî óäàëåííûõ ýëåìåíòîâ  
    46. }
    47.  
    48. int main()
    49. {
    50.   printf("remove: %d\n",RemoveFileFromDirectory("C:\\Folder"));
    51.  getch();
    52. }
    Коменты сами переводите... Правда тут куча багов: например нет проверки на безуспешное удаление файла или каталога...Но я думаю раз в ваш вуз берут таких идиотов, то и принимать будут спустя рукава.
     
  10. maniak

    maniak New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2009
    Сообщения:
    2
    Простите, забыл указать детали. Писать надо на ассемблере. Пишем в радасме под дос. А по поводу "в ваш вуз берут таких идиотов" - да берут некоторых, а мне этот ассемблер копибара сдался, сдать его и все. Я пишу на делфе и си++, работаю сисадминов в комп. фирме. Прошу помочь, а не выеживаться
     
  11. Klasonik

    Klasonik New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    5
    1) с помощью прямого доступа памяти вывести символ на экран
    2)с клавиатуры зад-ся строка и коорд-ты. Посредством прерывания DOS или BIOS вывести на экран

    в Tasm вот понятно, но надо в Masm32.Кто поможет а?Пожаалуйста...
     
  12. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    Всем большой привет=)..Задали решить задачку на С++ на тему "массивы"..Сначала создаю цикл, где ввожу эту матрицу...затем-где считаю 4 значения вектора Sj..Немного запуталась в подсчёте, и компилятор выдал 15 ошибок...

    Задача:

    ДАНА МАТРИЦА {Aij}3*4.Составить структурированную программу вычисления значений элементов вектора S по формуле:

    Sj=сумма(от i=1 до 3)Aij (j=1,2,3,4)
     
  13. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Обычно он так делает когда у вас одна ошибки в пропуске или установке лишней скобки { или ; )))

    Мб от 0 до 3 и от 0 до 4?)) Впервые вижу чтобы задавали нумеровать массивы на Си с 1.
    А вообще судя по этой строчке все эл-ты вектора S равны между собой и равны сумме всех эл-ов матрицы А. Возможно вы где-то ошиблись сами. Скорректируйте условие.
     
  14. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    #include<iostream.h>
    #include<stlib.h>
    #include<conio.h>
    #define n=3
    #define k=4
    void main()
    {clrscr();
    int I,j;
    int s;
    int a[n][k];
    randomize();
    for(j=0;j<k;j++)
    for(i=0;i<k;i++)
    a[j]=random(10);
    for(j=0;j<k;j++)
    s[j]=0
    for(i=0;i<k;i++)
    {s[j]+=a[j];}
    for(j=0;j<k;j++)
    for(i=0;i<k;i++)
    cout<<s[j]<<” “;
    cout<<”\n”;}
    }
    ............................
    .............................
    конкретно непонятно, как посчитать 4 Sj и вывести на экран...
     
  15. tex32

    tex32 New Member

    Публикаций:
    0
    Регистрация:
    24 окт 2009
    Сообщения:
    202
    Ты не знаешь как это сделать на бумаге, тогда тебе компьютер не поможет.
     
  16. Luna

    Luna New Member

    Публикаций:
    0
    Регистрация:
    7 ноя 2009
    Сообщения:
    288
    эх,ююжалко у меня функция со смайликами выключена...а тогда бы тогда поместила бы свой любимые смайлы : :lol: ...=)...;)...
    ....................буду ууучить, читать и восхвалять язык с++!..%%%
     
  17. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Абсолютно совместимый синтаксис у tasm и masm (если только tasm не находится в режиме ideal) приведи пример и покажи в каком месте компилятор выводит ошибку, но помни что писать за тебя здесь никто не будет, а вот за бабки помещай свою тему в WASM.COMMERCE
     
  18. Klasonik

    Klasonik New Member

    Публикаций:
    0
    Регистрация:
    6 ноя 2009
    Сообщения:
    5
    .486
    .model flat, stdcall
    option casemap :none

    includelib C:\masm32\lib\kernel32.lib
    includelib C:\masm32\lib\user32.lib

    .CODE
    Start:

    mov ah,0Ah ; function 0Ah - вывод символа на экран
    mov al,07h ; символ 7
    mov bh,0 ; Видеостраница 0
    mov cx,2 ; CX - коэффициент повтора
    int 10h ; процедура BIOS video service

    mov ax,4C00h ; Выход из программы
    int 21h ;


    End Start

    компилируется всё, экзешник создаётся НО при запуске выдаёт ошибку. вроде написано все верно как не кажется.в чем вот дело может быть?указываю для 32 все как положено)
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Klasonik
    Судя по ".486/.model flat, stdcall/option casemap :none/includelib C:\masm32\lib\kernel32.lib
    includelib C:\masm32\lib\user32.lib" вы создаете программу для ОС Windows, а вот по содержанию от Start до End Start -- это программа для DOS, поэтому посмотрите внимательно учебник, с которого вы эту программу переписываете, ключи, которыми компилируете и линкуете свою программу и будет вам счастье...
     
  20. rdtsc

    rdtsc Параллелепипедов Артем

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    180
    Адрес:
    Москва
    .486
    .model flat, stdcall
    option casemap :none

    includelib C:\masm32\lib\kernel32.lib
    includelib C:\masm32\lib\user32.lib

    .CODE
    Start:

    ==========
    Модель памяти плоская, это для винды..ты делаешь екзешник формата РЕ - виндовый, в котором исполняется 16 битный код ДОСА/биоса, прерывания напрямую не разрешены..Вобщем бред полнейший.

    Найли шапку для ДОС программы, в ней используется много-сегментаная а не плоская(1сегментная) модель памяти..МАСМ я не помню,посмори в нете