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

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

  1. Damosed

    Damosed New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    6
    Ребята, нужна ваша помощ с Assembler.



    Завтро надо придоставить работу, неочен чево втыкаю, училка нечево необясняет.

    Если кто может плиз помогите.

    Задача Но.1:

    Создайте програму числу X, находящейся в памяти клетки 8425, логически сложыть с цифрой Y, находящейся в регистре (реестре) B, к результату прибавив цифру 45, вписать в память клетки 8426.

    1.Запишыте коды команд и коментарий.

    2.Подсчитайте продолжительность действия программы.

    3.Предоставьте все подсчеты процесса и окончательный результат системой H.

    X=24, Y=A1

    Надчало выглядет так:

    1. LXI H, 8425; HL<--8425
    2. MOV A,M ; A<--(HL)

    Задача Но.2:

    Тщательно и конкретно обьясните эти команды:

    XRA C, SUB M, LDA 8346, JC addr

    Спасибо за ответы.
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Насколько помню:
    XRA C - выполняет C xor C, тоесть очищает регистр C.
    SUB M - отнимает от аккумулятора значение из памяти(байт).
    LDA 8346 - загружает в аккумулятор это число.
    JC addr - условный переход если флажок fc установлен.

    Вобщем я плохо помню мнемоники для 8080, но он прототип z80, совместим на уровне инструкций, просто в последнем мнемоники другие.
    ld hl,8425
    ld a,(hl)
    add a,b
    inc hl
    add a,45
    mov (hl),a
    Это для z80, опкоды аналогичны для 8080, но формат записи там иной так что хз как записать, сгугли на таблицы опкодов.
     
  3. Arnor

    Arnor New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    10
    Йа вернулся) Не поблагодарил человека который мне библиотеку glaux скинул, решил исправится - Огромное СПАСИБО.

    Сейчас возникла другая проблема - нужно заменять код с++, на асм. Взял всё теже уроки NeHe на этих 2 языках. Попытался просто вставить:
    Код (Text):
    1. __asm
    2.     {
    3.     .IF height == 0
    4.         mov height, 1                                ;prevent div by zero
    5.     .ENDIF
    6.     invoke glViewport, 0, 0, width, height               ;reset viewport
    7.     invoke glMatrixMode, GL_PROJECTION          ;select projection matrix
    8.     invoke glLoadIdentity                       ;reset it
    9.     fild width
    10.     fild height
    11.     fdivp st(1), st(0)
    12.     fstp ratio
    13.     _gluPerspective 45.0f, ratio, 0.1f,100.0f
    14.     invoke glMatrixMode, GL_MODELVIEW                   ;select modelview matrix
    15.     invoke glLoadIdentity                               ;reset it
    16.     ret
    17.  
    18.     }
    В с++ код. На что он меня обматюкал по всех процедурах и "." перед IF и ENDIF.
    Вот кусок который был на с++ :
    Код (Text):
    1. if (height==0)                                     
    2.     {
    3.         height=1;                                      
    4.     }
    5.  
    6.     glViewport(0,0,width,height);                      
    7.  
    8.     glMatrixMode(GL_PROJECTION);                       
    9.     glLoadIdentity();                                  
    10.  
    11.    
    12.     gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);
    13.  
    14.     glMatrixMode(GL_MODELVIEW);                        
    15.     glLoadIdentity();
    Процедуры названы одинаково, так почему асм. вставка не видит их в с++ программе?
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    inline asm != MASM
    btw, сэмплы nehe адаптированы на множество языков и реализаций, разве там ассемблера нету?
     
  5. Arnor

    Arnor New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    10
    Я не вижу... ( И врятли есть...

    Значится эти 2 исходника совместить нельзя? (
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
     
  7. Arnor

    Arnor New Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    10
    Так я ж это и скачал и оттуда взял кусок кода на масме на который выдаёт ошибки.
     
  8. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    В чем вообще задача соостоит? Воткнуть asm-код в VC? Если так, то придется модифицировать исходник
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    Arnor
    написал с ходу:
    DWORD height = 0, width, ratio;
    float var01f = 0.1f; float var100f = 100.f; float var45f = 45.0f;
    __asm
    {
    push eax
    xor eax,eax
    cmp [height],eax
    jne hz
    mov [height],1
    hz:
    push [height]
    push [width]
    push eax
    push eax
    call glViewport
    push GL_PROJECTION
    call glMatrixMode
    call glLoadIdentity
    fild width
    fild height
    fdivp st(1), st(0)
    fstp ratio
    push [var100f]
    push [var01f]
    push [ratio]
    push [var45f]
    call gluPerspective
    push GL_MODELVIEW
    call glMatrixMode
    call glLoadIdentity
    }

    Я просто показал в чем смысл.
    В том что invoke тока в масме. Тут больше tasm синтаксис)
    Ну и юзать FPU побольше
     
  10. FullZer0

    FullZer0 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2008
    Сообщения:
    24
    Всем прива :
    Есть такой вопрос :
    дано две прямых line(x1,y1,x2,y2) , line(x3,y3,x4,y4) .... как в С++ можно узнать создает ли 1-я прямая проекцию на 2-й прямой ?!
    Если создает то само собой ета проекция будет тоже прямой - как узнать ее координаты ?!

    P.S.
    Заранее спс тем кто поможет !
     
  11. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    FullZer0
    (Ты не написал, буду считать, что ты имел ввиду ортогональную проекцию.)
    Ты не очепятался? Две прямые всегда создают проекции друг на друга.
    Если ты имел ввиду проекцию отрезка на прямую, то здесь чистая геометрия - находишь угол между ними по координатам, проекция будет длина отрезка на косинус этого угла. Если надо отрезок на другой отрезок - то там тоже можно быстро решить "на бумажке".
     
  12. FullZer0

    FullZer0 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2008
    Сообщения:
    24
    Да - опечатался ! В общем задание такое что нужно найти проекцыи массива отрезков на массив прямых ! Я в геометрии нулячий - если не тяжело наведи код поиска угла между отрезком и прямой ... Дальше думаю сам разберусь =)
     
  13. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    FullZer0
    Вот, теперь понятно.
    Угол можно найти из скалярного произведения векторов (ab = |a||b|cos(alpha)). Если отрезок задается координатами концов (x1,y1) и (x2,y2), то координаты вектора a=(x2-x1,y2-y1)==(ax,ay). Аналогично для прямой, проходящей через (x3,y3) и (x4,y4), b=(x4-x3,y4-y3)==(bx,by). Скал. произведение: ab = (ax*bx + ay*by). Модули: |a| = sqrt(ax^2 + ay^2), |b| = sqrt(bx^2 + by^2). Тогда угол cos(alpha) = ab/(|a||b|). Сам угол находить нет смысла, т.к. для вычисления проекции нужен косинус.
    Проекция определяется как длина проецируемого отрезка * cos(alpha).
    То же, на Си:
    Код (Text):
    1. double ax = x2-x1, ay = y2-y1, bx = x4-x3, by = y4-y3;
    2. double a_len = sqrt(ax*ax + ay*ay), b_len = sqrt(bx*bx + by*by);
    3. double cos_alpha = (ax*bx + ay*by) / (a_len*b_len);
    4. double projection = a_len * cos_alpha; /* проекция */
    п.с. возможно где-то напутал, не проверял.
    п.с. надо сделать проверку, что (a_len*b_len) != 0, т.к. это дело в знаманателе.
     
  14. FullZer0

    FullZer0 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2008
    Сообщения:
    24
    ... Ок ! Подскажи еще как из всего етого найти координаты вот етой проекции ? Ведь проекция сама по себе та же прямая !
    Просто у меня в задание нужно все ето дело сделать графически в С++ и проекции выделить отдельным цветом, а для етого координаты бы не помешали =)

    В общем для большего понятия само задание привожу :
    Дано массив отрезков и массив прямых на площине , нужно найти отрезки что создаются в результате проекции массива отрезков на каждую из прямых ! Результат изобразить графически !
     
  15. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    всем здравствуйте!!! я хотела бы к вам обратиться с вопросом по поводу ADO в C++.
    нашла следующий пример для соединения с БД:

    ADODB::_ConnectionPtr cn = NULL;
    ADODB::_RecordsetPtr rs = NULL;

    try
    {
    HRESULT hr = S_OK;
    hr = cn.CreateInstance(__uuidof(ADODB::Connection));

    if(!SUCCEEDED(hr))
    return;

    _bstr_t bsConnString(L"DSN=BookStore");
    _bstr_t bsUserID(L"dbo");
    _bstr_t bsUserPwd(L"");

    cn->Open(bsConnString, bsUserID, bsUserPwd,
    ADODB::adConnectUnspecified);

    _bstr_t bsCommand(L"select * from managers");
    rs = cn->Execute(bsCommand, &vtMissing, ADODB::adCmdText);
    . . .
    }

    там перед эти еще структура объявляется:

    struct ComInit
    {
    ComInit()
    {
    ::CoInitialize(NULL);
    }

    ~ComInit()
    {
    ::CoUninitialize();
    }
    } com_init;

    и написано, что "Эта функция получает содержимое таблицы managers не с помощью хранимой процедуры, а выполняя строку SQL с оператором SELECT... В результате выполнения этого оператора создается набор записей класса Recordset."

    так вот, подскажите пожалуйста как мне в bsConnString записать имя своей БД???
    и еще как в _bstr_t bsCommand(L"select * from managers"); вместо managers поставить имя своей таблицы, которое хранится в массиве name?
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    1)
    _bstr_t bsConnString(L"DSN=BookStore");
    BookStore - это псевдоним базы - имя.

    2)
    _bstr_t bsCommand(L"select * from ");
    bsCommand += L"my_table";
     
  17. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    спасибо! то есть получается мне вместо BookStore вставить полное имя своей бд? а по поводу таблицы: я так и не поняла, как мне туда сунуть содержимое массива? у меня нет просто имени, оно у меня именно из строки должно читаться
     
  18. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    По идее нужно зарегистрировать новое DNS имя, для твоей базы, и обращаться к ней по этому имени.

    wchar_t name[] = "Name";
    bsCommand += name;
     
  19. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    а как зарегистрировать новое DNS имя?
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Администрирование/Источники данных (ODBC)/Пользовательский DNS.
    Добавить/Драйвер для Microsoft Access/Готово.

    После этого вписываешь в "имя источника данных" новый DNS. Выбираешь физическое расположение базы не диске.