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

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

  1. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    splinter
    попробуйте сделать так
    Код (Text):
    1. .686P
    2. .model flat
    3. include windows.inc
    4. includelib user32.lib
    5. extern _imp__MessageBoxA@16:dword
    6. .code
    7. start:  push 0
    8.     push offset szCaption
    9.     push [pstr1]
    10.     push 0
    11.     call _imp__MessageBoxA@16
    12.     mov ebx,pstr1
    13.              mov byte ptr [ebx],12; при вашем коде mov byte ptr [pstr1],12
    14. ;у меня [pstr1]=004000F8h после mov byte ptr [pstr1],12 содержимое [pstr1]=0040000Сh
    15. ;то есть меняется не содержимое строки str1, а указыватель на какой-то адрес
    16.     push 0
    17.     push offset szCaption
    18.     push [pstr1]
    19.     push 0
    20.     call _imp__MessageBoxA@16
    21.     retn
    22. .data
    23. str1    db 'hello world!',0
    24. szCaption db 'splinter',0
    25. pstr1 dd str1
    26. end start
     
  2. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    спасибо! Действительно конструкция

    mov ebx,pstr1
    mov byte ptr [ebx],12
    работает.
    Но причину я так и не понял, почему не работает
    mov byte ptr [pstr1],12

    ....?
     
  3. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    splinter
    Я написал в комментарии почему, mov byte ptr [pstr1],12 меняет не содержимое строки, а сам указатель, который начинает показывать на хз что (если бы воспользовался отладчиком, то сам бы увидел). С указателями нужны скорее не MOV, а ADD или SUB
     
  4. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    да, я всегда смотрю в ольке что да как. Но непонятно почему именно меняет сам уазатель когда берёт и переменной и не меняет адрес, когда берёт из регистра. как-то меня гложит постоянно, когда я не понимаю почему именно так а не иначе... Значит не разобрался в чём-то
     
  5. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    splinter
    Потому что название переменной заключенное в квадратные скобки означает обращение к этой переменной, для косвенной адресации нужно в квадратные скобки заключить название регистра
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    splinter
    что то про то что функция нужна и требуется передать указатель все забыли ...
    примерно так выглядит 16 разрядный вариант (фрагмент)

    stroka byte 'dfgkrnioe',0
    ....
    lea ax,stroka
    push ax
    call myf

    ...



    myf proc near
    push BP
    mov BP,SP
    mov SI,[BP+4]
    mov AL,12h
    mov [SI],AL
    pop BP

    myf ENDP
     
  7. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    mov ESI,pstr1
    mov AL,12h
    mov [ESI],AL

    вот и все
     
  8. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    вообщем Mikl___ вам это уже продемонстрировал изрядно закутав в "шелуху"


    более просто то что говорил мики звучит так
    в масме косвенная адресация обязательно использует регистр заключенный в квадратные скобки
    имя переменной вы можете заключить хоть в вагон скобок но это ничего не даст
    записи
    mov var,eax
    mov [var],eax
    mov [[var]],eax
    означают одно и тоже
     
  9. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Объясню по-другому. ptr и скобки это только способ объяснить компилятору, какую команду поставить. Нет в 86-м одной команды, которая извлекает адрес из ячейки и сразу его использует как адрес операнда - нужно две команды.
     
  10. splinter

    splinter New Member

    Публикаций:
    0
    Регистрация:
    5 фев 2009
    Сообщения:
    45
    Rockphorr, valterg, спасибо, я уже разобрался из примера Mikl___
     
  11. lexaOr

    lexaOr New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2009
    Сообщения:
    2
    Всем привет. В институте задали задачу: найти кол-во гласных букв в введенной строке... Можно в общих чертах... как? Прочитал несколько статей для новичков, вроде относительно во всем написанном разобрался. Но тут прям не знаю с чего начать. Если можно, натолкните на мысль.
    Средство разработки: FASM
     
  12. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    lexaOr
    Сравниваешь первый символ строки с символом "а" если да, то увеличиваешь счетчик гласных букв на 1, если нет то последовательно сравниваешь с "е", "ё", "и", "о", "у", "э", "ю", "я", переходишь к следующему символу, если конец строки -- сравнение окончено, иначе опять сравниваешь с "а" и т.д. Думаю, на мысль натолкнул :)
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    Mikl___
    ты забыл великую букву "Ы" - гласных всего 10 в русском языке
     
  14. FatMoon

    FatMoon New Member

    Публикаций:
    0
    Регистрация:
    28 ноя 2002
    Сообщения:
    954
    Адрес:
    Russia
    Лучше задать эталонную строку "аеёиоуыэюя", и для каждой буквы в строке искать совпадение с любой из строки с гласными. При совпадении увеличивать счетчик.

    Получить строку
    Обнулить счетчик
    Для всех букв в строке
    Если очередная буква есть в эталонной строке, то увеличить счетчик

    Вывести счетчик

    В таком алгоритме можно использовать LODSB и SCASB. Красиво, компактно, (e)si указывает на строку, (e)di на эталон, можно использовать префиксы повтора.
     
  15. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Кроме "ы" я забыл предупредить, либо вся строка перед подсчетом гласных при помощи операций OR или AND приводится к верхнему или нижнему регистру, либо придется сравнивать с "АЕЁИОУЫЭЮЯаеёиоуыэюя". ТС, кстати, не написал какие гласные ему требуются, кириллица или латиница, или немецкие с умльяутами.
     
  16. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    FatMoon
    Я бы использовал a1: LODSB/test al,al/jz konec_stroki/XLAT/add dl,al/jmp a1
     
  17. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mikl___
    для FASM XLATB. правда короче будет
    Код (Text):
    1. pattern db 'АЯОЁУЮЭЕЫИ'
    2. mov esi, string
    3. mov ebx, pattern
    4. @@:
    5. lodsb
    6. test al, al
    7. jz @f
    8. or al, 0x20
    9. mov ecx, 10
    10. mov edi, ebx
    11. rep scasb
    12. jnz @b
    13. inc edx
    14. jmp @b
    15. @@:
    но быстрее
    Код (Text):
    1. table db сами посмотрите таблицу ASCII и замените все гласные 1, остальные 0
    2. ...
    3. mov esi, string
    4. mov ebx, table
    5. xor eax, eax
    6. @@:
    7. lodsb
    8. test al, al
    9. jz @f
    10. xlatb
    11. add edx, eax
    12. jmp @b
    13. @@:
     
  18. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    max7C4
    наверное предложение должно было звучать так "с XLATB не только короче, но и быстрее"?
    Не устраивает XLATB попробуйте lea eax,[ebx+eax]
     
  19. Mikl___

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

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    max7C4
    А можно еще вот так
    Код (Text):
    1. .686P
    2. .mmx
    3. .model flat
    4. includelib user32.lib
    5. include windows.inc
    6. extern _imp__MessageBoxA@16:dword
    7. .code
    8. start:  mov ebx,offset table
    9.     xor eax,eax
    10.     cdq
    11.     mov ecx,200
    12.     mov esi,offset string
    13. a1: lodsb
    14.     add edx,[ebx+eax]
    15.     test al,al
    16.     loopnz a1
    17.     mov ax,dx
    18.     aam
    19.     xchg ah,al
    20.     or ax,3030h
    21.     mov count,ax
    22.     push 0
    23.     push offset string
    24.     push offset count
    25.     push 0
    26.     call _imp__MessageBoxA@16
    27.     retn
    28. .data
    29. string db 'Hello, world!',0
    30. count dw 0,0
    31. table db сами знаете какая таблица
     
  20. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    Mikl___
    таблица в 256 байт и 10 байт pattern. по моему разница видна не вооруженным глазом и определять размер команд некчему