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

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

  1. gvay

    gvay New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    15
    спасибо!

    получается что xor di,di здесь играет роль счетчика??

    еще один вопрос какую функцию несет cmc в

    @@:lodsb

    sub al,1

    cmc

    adc bx,di

    loop @b
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    gvay
    точнее его инициализации (типа di=0)
    инвертирует флаг CF (типа cf = not cf)

    п.с. gvay, почитал бы лекций или книг. С таким знанием теории ты не сдашь ничего.
     
  3. gvay

    gvay New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    15
    @@:lodsb

    sub al,1

    cmc

    adc bx,di

    loop @b

    как я понял этот цикл работает по такому принципу : начинает читать массив сравнивает числа в нем с нулем и если те не равны нулю вычитает единицу из
    девяти sub al,1, потом записывает результат в bx(adc bx,di) правильно я понимаю? а зачем тогда инвертировать флаг CF?
     
  4. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    gvay
    Код (Text):
    1. xor  di,di ; di=0
    2. mov  bx,di ; bx=di=0
    3. @@:lodsb ; читаем байт в al
    4.    sub al,1 ; отнимаем 1 из al (если al был 0, то после вычитания 1 установится CF)
    5.    cmc ; инвертируем CF
    6.    adc bx,di ; прибавляем CF к bx
    7. loop @b ; декремент cx и возврат к @@, если он не 0
    в bx будет число ненулевых элементов.
     
  5. gvay

    gvay New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    15
    я бы почитал но в в 9 утра сдавать а щас 3 ночи не думаю что чтонибудь успею понять,а сдать надо вот и прошу помощи .
     
  6. gvay

    gvay New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Все закоментил :)) с вашей помощью и тем что смог понять из статей и книг, правильно ли все ?? или есть ошибки??

    org 100h //Директива компилятора. Выполнение всегда начинается с первого байта файла. Указываем Ассемблеру при ассемблировании использовать смещение 100h от начала сегмента,в который загружена наша
    программа.

    mov ax,3 //устанавливается 3-й видео-режим

    int 10h //вызов графического адаптера BIOS.

    push 0B800h //установка видеорежима 0 CGA 25*40 only text 16 B&W 2000 0B800h

    pop es //типа es=0B800h

    mov cx,9 // количество ячеекв массиве

    mov si,arr //перемещает значения массива в регистр si

    xor di,di //di=0

    mov bx,di //bx=di=0

    @@:lodsb //читаем байт в al

    sub al,1 //отнимаем 1 из al (если al был 0, то после вычитания 1 установится CF)

    cmc //инвертируем CF

    adc bx,di //прибавляем CF к bx

    loop @b //декремент cx и возврат к @@, если он не 0

    add bx,0F30h //0 - цвет фона, F - цвет текста, 30h - смещение цифр в таблице ASCII-кодов

    mov [es:di],bx //обращение к памяти. В данном случае к видеопамяти.

    int 16h //вызов прерывания 16h. В реальном режиме это сервис для работы с клавиатурой. В данном случае нужен для ожидания нажатия клавиши перед выходом.//

    arr db 0,8,9,5,0,1,0,2,0 //массив
     
  7. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    это просто мы ложим в стек 0B800h, а потом берем es из стека.
    не значение, а адрес
    остальное все правильно.
     
  8. gvay

    gvay New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    15
    ВСЕМ БОЛЬШОЕ СПАСИБО ЗА ПОМОШЬ !!:))
     
  9. JangaMa

    JangaMa New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    30
    Адрес:
    Казань
    всем здравствуйте! У меня такая проблема:
    нужно из БД ACCESS прочитать таблицу с именем name и записать ее в файл name.txt. Сделала такой каркас:

    HRESULT hr;
    CoInitialize(NULL);
    ADODB::_ConnectionPtr connection;
    hr = connection.CreateInstance(__uuidof(ADODB::Connecti on));
    ADODB::_RecordsetPtr recordset;
    hr = recordset.CreateInstance(__uuidof(ADODB::Recordset ));
    if(!SUCCEEDED(hr))
    return 1;
    _bstr_t bsConnString (L"Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=C:\\Таблицы.mdb");
    _bstr_t bsUserID(L"");
    _bstr_t bsUserPwd(L"");
    connection->Open(bsConnString, bsUserID, bsUserPwd, ADODB::adConnectUnspecified);
    _bstr_t bsCommand(L"select * from ");
    bsCommand += name;
    recordset->Open(bsCommand,connection.GetInterfacePtr(),ADODB ::adOpenForwardOnly, ADODB::adLockReadOnly,ADODB::adCmdText);

    while (!recordset->adoEOF)
    {

    //тут должно быть чтение таблицы

    recordset->MoveNext();
    }
    recordset->Close();
    connection->Close();

    а вот как прочитать таблицу?
    если известны поля, то прочитать можно так:

    pole1 = recordset->Fields->GetItem(_variant_t("Поле1"))->Value;

    но у меня поля неизвестны, и неизвестно их количество

    кажется о-то нашла:

    while (!recordset->adoEOF)
    {
    //pole1 = recordset->Fields->GetItem(_variant_t("Поле1"))->Value;
    int nNumFields = recordset->Fields->Count;
    for(int i=0;i<nNumFields;i++)
    {
    _bstr_t strName = recordset->Fields->Item[(_variant_t)i]->Name;
    _bstr_t strValue = recordset->Fields->Item[(_variant_t)i]->Value;
    }

    recordset->MoveNext();
    }
    только программа почему-то зацикливается
     
  10. gvay

    gvay New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    15
    Почему в emu 8086 выдает ошибку ?

    (7) wrong parameters: MOV si,arr
    (7) operands do not match: 16 bit register and 8 bit address

    org 100h
    mov ax,3
    int 10h
    push 0B800h
    pop es
    mov cx,9
    mov si,arr
    xor di,di
    mov bx,di
    @@:lodsb
    sub al,1
    cmc
    adc bx,di
    loop @b
    add bx,0F30h
    mov [es:di],bx
    int 16h
    arr db 0,1,9,5,0,1,0,2,0
    ret
     
  11. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    gvay
    Видимо синтаксис немного отличается от FASM. Замени mov si,arr на lea si,arr.
     
  12. airyashov

    airyashov New Member

    Публикаций:
    0
    Регистрация:
    4 сен 2008
    Сообщения:
    12
    mov si,arr
    заменить на второе скорее всего
    mov si,word ptr arr
    mov si,offset arr
     
  13. gvay

    gvay New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    15
    ВСЕМ СПАСИБО СДАЛ ЭКЗАМЕН :))
     
  14. sp1k

    sp1k New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2007
    Сообщения:
    24
    Размер регистра - 16 бит, а операнда - 8 бит. Поэтому и ошибка. Попробуй 7-ю строку записать так:
    mov si,word ptr [arr]

    p.s. опередили...
     
  15. WoLfhOUnD

    WoLfhOUnD New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2008
    Сообщения:
    5
    Кароч чет наваял для одного символа "а", и то коряво пашет(
    Подскажите как сделать для всех букв так.
    Код (Text):
    1. model small
    2. .stack 80h
    3. .data
    4. sym db 'a'
    5. str db 'Enter string :',10,13,'$'
    6. string db 0ch,11 DUP (?)
    7. S1 db 10,13,'$'
    8. s db '$'
    9. .code
    10. start :
    11. mov ax,@data
    12. mov ds,ax
    13. mov ah,9
    14. mov dx,offset str
    15. int 21h
    16. mov dx,offset string
    17. mov ah,0ah
    18. int 21h
    19.  
    20. mov di,2
    21. A1:
    22. mov al,sym
    23. cmp string[di],al
    24. JZ A2
    25.  
    26. A4:
    27. inc di
    28. cmp di,13
    29. JZ A3
    30. JMP A1
    31. A2:
    32. mov string[di],0
    33. JMP A4
    34. A3:
    35. mov dx,offset s1
    36. mov ah,9
    37. int 21h
    38. mov dx,offset string
    39. mov ah,9
    40. int 21h
    41. mov ah,2ch
    42. int 21h
    43. mov bl,dh
    44. TIME:
    45. int 21h
    46. sub dh,bl
    47. cmp dh,3
    48. JNZ TIME
    49. mov ax,4c00h
    50. int 21h
    51. end start
     
  16. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    WoLfhOUnD
    С цифрами понятно, а буквы какие должны анализироваться: большие, маленькие, кириллица (русские), латиница?
     
  17. Liam

    Liam New Member

    Публикаций:
    0
    Регистрация:
    3 ноя 2008
    Сообщения:
    7
    Помоги те плиз с последней лабой, не успеваю ((.
    "Программа просит ввести строку. Строка - это слова, разделенные пробелом. Посчитать кол-во слов в строке, начинающихся с гласной буквы, результат вывести на экран."
    Алфавит, как я понимаю, латинский.

    Наставьте на путь истиный :)
     
  18. WoLfhOUnD

    WoLfhOUnD New Member

    Публикаций:
    0
    Регистрация:
    10 дек 2008
    Сообщения:
    5
    Mikl___
    латиницу,маленькие
     
  19. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.784
    WoLfhOUnD
    Коды цифр и коды букв в кодовой таблице ASCII идут подряд группами, поэтому сравниваем код максимального символа в группе, для цифр "9" если больше в группу не входит, затем с кодом минимального символа в группе, для цифр "0" если меньше в группу то же не входит, с буквами аналогично, с латинскими проще, сравниваешь код "A" и "Z" или "a" и "z". С кириллицей чуть сложнее "А" и "Я" или "a" и "п" а затем "р" и "я". В кодовой таблице маленькие русские буквы расположены двумя группами, подробнее смотри здесь. Программа не сложная, под свой вариант переделай сам
    Код (Text):
    1. .model tiny
    2. .286
    3. .code
    4. org 100h
    5. start:  mov ah,09
    6.     mov dx,offset string
    7.     int 21h
    8.     cld
    9.     mov di,offset string1
    10.     mov si,offset string
    11.     mov cx,15; длина строки без символа "$"
    12. a0: lodsb
    13.     cmp al,'9'
    14.     ja a1
    15.     cmp al,'0'
    16.     jae a2
    17. a1: stosb
    18. a2: loop a0
    19.     mov di,offset string2
    20.     mov si,offset string
    21.     mov cx,15
    22. a3: lodsb
    23.     cmp al,'z'
    24.     ja a4
    25.     cmp al,'a'
    26.     jae a5
    27. a4: stosb
    28. a5: loop a3
    29.     mov ah,2; переходим на следующую строку на экране
    30.     mov dl,10
    31.     int 21h
    32.         mov ah,09
    33.     mov dx,offset string1; выводим строку без цифр
    34.     int 21h
    35.     mov ah,2
    36.     mov dl,10
    37.     int 21h
    38.         mov ah,09
    39.     mov dx,offset string2; выводим строку без маленьких латинских букв
    40.     int 21h
    41.     mov ah,2
    42.     mov dl,10
    43.     int 21h
    44.         mov ah,0; ждем нажатия на любую клавишу
    45.         int 16h
    46.         ret; выходим из программы
    47. string db 'abcd12 3efg!!()$'; строка в которой есть буквы, пробел, скобки и "!"
    48. string1 db 16 dup ('$'); под строку без цифр
    49. string2 db 16 dup ('$'); под строку без букв
    50. end start
     
  20. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    WoLfhOUnD
    Используй битовые множества.
    Код (Text):
    1. org 100h
    2. push $B800
    3. pop  es
    4. xor  di,di
    5. @@:xor   ax,ax
    6.    int   16h
    7.    mov   dx,ax
    8.    movzx eax,al
    9.    bt    [numbers],eax
    10.    jnc skip
    11.    mov   ah,2
    12.    stosw
    13.    skip:
    14.    dec   dh
    15. jne @b
    16. ret
    17. numbers dd 0,111111111110000000000000000b,0,0,0,0,0,0