Вывод переменной (массива) построчно.

Тема в разделе "WASM.BEGINNERS", создана пользователем hack_virii, 9 сен 2009.

  1. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Доброго времени суток!
    Помогите нубу!)

    Нужно отобразить меню. Не могу понять(найти) как скорректировать указатель так, чтобы не писать вручную вывод всех пунктов. Проще говоря, мне не удается упростить код так, чтобы положить в цикл вывод строки.

    Имеется процедура, где все это выполнено вручную:
    Код (Text):
    1. ShowMenu PROC
    2. mov edx,OFFSET opAnd
    3. call WriteString
    4. call CrLf
    5. mov edx,OFFSET opOr
    6. call WriteString
    7. call CrLf
    8. mov edx,OFFSET opNot
    9. call WriteString
    10. call CrLf
    11. mov edx,OFFSET opXor
    12. call WriteString
    13. call CrLf
    14. mov edx,OFFSET opExit
    15. call WriteString
    16. call CrLf
    17. ret
    18. ShowMenu ENDP
    Хочу получить:
    Код (Text):
    1. .data
    2. oper     BYTE    "1234"
    3.            BYTE    "qweeq"
    4.            BYTE    "efwf"
    5.            BYTE     "2232f"
    6.            BYTE     "wdwdw"
    7.  
    8. .code
    9. mov ecx,5                    ; а лучше как-нить SIZEOF  
    10. mov edx,OFFSET oper
    11. L1:
    12. call WriteString
    13. add edx,(LENGTHOF oper)
    14. Loop L1
    Надеюсь не запутал..)
     
  2. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Определить метки конца строки и списка строк, обычно это нули.
    Код (Text):
    1. $Message:
    2.     CHAR "1234",0
    3.     CHAR "qweeq",0
    4.     CHAR "efwf",0
    5.     CHAR 0
    6.  
    7.     lea edi,$Message
    8. @@:
    9.     mov edx,edi
    10.     Call WriteString
    11.     Call CrLf
    12.     xor eax,eax
    13.     cld
    14.     mov ecx,MAX_PATH    ; или локальный предел длинны.
    15.     repne scasb
    16.     cmp byte ptr [edi],al
    17.     jnz @b
     
  3. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Clerk, не шутя!..
    Работает. Правда я не совсем понял как..)
    Что увеличивает указатель массива? cld с repne scasb?
    Зачем сравнивать [edi] с al?
    И почему jnz @b, когда там @@: ?Oo

    Сорри за нупство!)

    Спасибо за помощь!
     
  4. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    И главный вопрос: как обратиться к конкретному элементу(строке) этого массива, чтобы вывести его на экран?
     
  5. Dryu

    Dryu New Member

    Публикаций:
    0
    Регистрация:
    1 сен 2009
    Сообщения:
    9
    В примере выше - никак, т.к. фактически там не массив, а сцепленные строки. Если тебе нужен конкретно массив, есть по меньшей мере 2 способа:
    1) Сделать массив указателей на строки:
    a1 BYTE "1234"
    a2 BYTE "qweeq"
    a3 BYTE "efwf"
    a4 BYTE "2232f"
    a5 BYTE "wdwdw"
    addrs dd a1,a2,a3,a4,a5

    ;Теперь, если eax - номер элемента
    mov eax,i
    mov edx,[addrs+eax]
    call WriteString

    2) Выровнять строки по некоторой границе нулями. Допустим, 8 байт:
    a1 BYTE "1234"
    db 4 dup (0)
    a2 BYTE "qweeq"
    db 3 dup (0)
    a3 BYTE "efwf"
    db 4 dup (0)
    a4 BYTE "2232f"
    db 3 dup (0)
    a5 BYTE "wdwdw"
    db 3 dup (0)

    .code
    mov eax,i
    lea edx,[a1+eax*8]
    call WriteString

    Теперь примечания:
    1) Массивы индексируются, начиная с нулевого элемента.
    2) Второй способ работает только для небольших элементов - 1,2,4,8 байт.
    3) Не помню, как правильно делать выравнивание, так что не бери мой листинг за основу. =]
    Это синтаксис fasm. @@ - анонимная метка, @b - ближайшая сверху анонимка. Удобно.
     
  6. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Dryu, спасибо за объяснение!
    Но все равно не выходит. Я по-разному крутил.
    Мне не обязательно массив, просто когда я делал через массив, то вообще не вышло. А в одну строчку выводит..)
    Код (Text):
    1. op1 BYTE    "1. x AND y",0Dh,0Ah,0
    2.     BYTE    "2. x OR y",0Dh,0Ah,0
    3.     BYTE    "3. NOT x",0Dh,0Ah,0
    4.     BYTE    "4. x XOR y",0Dh,0Ah,0
    5.     BYTE    "5. EXIT",0
    Смотрите что требуется:
    1) Вывести меню, т.е. содержимое op1
    2) Попросить выбрать пункт, т.е. ввести цифру 1-5
    3) На основе полученной цифры, вывести название пункта меню.
    Вот тут-то и основная загвоздка.
    Как обратиться к переменной и посчитать след. элемент?

    ЗЫ. Выравнивание вроде так делается:
    Код (Text):
    1. .data
    2. myByte     BYTE     ?
    3.                ALIGN 2
    4. myWord    WORD    ?
    Но это не помогает..=(
     
  7. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    hack_virii
    Так чтоже вы поймёте, если элементарных инструкций не знаете, вопрос не имеет смысла, ибо автор не понимает ничего.
     
  8. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Clerk, это ты ничего не понимаешь самовлюбленный @#!$#$%^!
    Ты раздел видел, олень?! Beginners! Я тут что, говорю что я самый умный что ли?
    Если не хочешь\не можешь ответить, потому что думаешь, что гуру, и тебе недосуг, тогда иди в жопу и не отвечай!

    Всем остальным спасибо!
     
  9. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    hack_virii
    Не кричи. Если я встречаю незнакомую инструкцию я смотрю в доках что она делает и как;
     
  10. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    указателя массива нету

    Clerk упростил себе жизнь - он сканирует блок данных содержащей твой массив, для разделения элементов он расставил нули в конце
    чтоб найти адрес n того элемента надо пропустить n-1 элемент каждый из которых имет нуль в конце для этого вся его кухня с rep scasb и сmp [esi],AL
     
  11. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    чтоб уложить что либо в цикл нужно чтоб все элементы были одинаковы в отношении к фактору цикла
    а у тебя они все разные по длине и совершенно не ясно где граница между элементами
    только в тексте кавычки стоят в бинарнике ты сам уже не поймешь что к чему
     
  12. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    пардон с edi а не с esi
     
  13. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    Dryu
    на чсет фасма не знаю - клерк им не пользуется по его словам
    всякие @@ @B это стандартная кухня автометок можно про неё почитать в хелпе к масму 6.11
     
  14. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
     
  15. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Clerk, я нуб. Ты бы еще код обфусцировал! Или зашифровал! :lol:
    Я видел эти инструкции, встречал их в книге и после твоего примера попытался разобраться.
    Но у меня не вышло, ибо данный пример слишком сложен для меня пока что.
    И если я чего-то не понял, не надо говорить, что я не понимаю вообще ничего. Да, я разбираюсь в АСМе хуже тебя,
    я никогда не учился в учебных заведениях, где есть хоть какое-то программирование. Все осваиваю по книгам, сам.
    Учитывая то, что и математику я в школе плохо учил. :) И я не ленивый студентик, который просит помочь с задачкой. Я закончил уже инст, и мое образование к кодингу не имеет никакого отношения. А по твои словам, так я вообще даун (так они прозвучали!(прочитались)). Так что не надо, пожалуйста, преждевременных и поспешных выводов. Тем более в разделе Beginners. ;)


    Я сделал как советует дядюшка Ирвин (Кип Р.).
    Странно, что я сразу так не сделал, но это уже лирика).

    Код (Text):
    1. .data
    2. opers       BYTE    '1'     ; Искомое значение
    3.             DWORD   meAnd   ; Адрес процедуры
    4. operSize = ($ - opers)          ; Размер элемента таблицы в байтах
    5.             BYTE    '2'
    6.             DWORD   meOr
    7.             BYTE    '3'
    8.             DWORD   meNot
    9.             BYTE    '4'
    10.             DWORD   meXor
    11.             BYTE    '5'
    12.             DWORD   opExit
    13. operQuant = ($ - opers) / operSize
    14.  
    15. msgAnd      BYTE    'x AND y',0
    16. msgOr       BYTE    'x OR y',0
    17. msgNot      BYTE    'NOT x',0
    18. msgXor      BYTE    'x XOR y',0
    19. msgExit     BYTE    'Exit',0
    20.  
    21.  
    22. .code
    23. main PROC
    24. mov ebx,OFFSET opers        ; Загрузим адрес таблицы в EBX
    25. mov ecx,operQuant       ; Установим счетчик цикла, равный количеству операций
    26. L1
    27. call NEAR PTR [ebx + 1]     ; Если да, то вызовем процедуру
    28. call WriteString            ; Отобразим сообщение
    29. add ebx,operSize        ; Вычислим адрес след. элемента таблицы
    30. Loop L1
    31. exit
    32. main ENDP
    Rockphorr, спасибо, что разжевал! Пока все равно не понял, но надеюсь, что дорасту и до Clerk'ского примера..=\ :)



    ЗЫ. мой пример логического калькулятора (криво-ой!)), для чего соббсно и требовалась вся эта котовасия:
    http://hack-virii.pochta.ru/LogiCalc.rar


    Всем спасибо за науку!
     
  16. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    не удержусь продублировать в четвёртый раз о "@@" ^^)

    итак, в двух строчках о главном словами комера:
    jmp @F - к следующей @@, (forward)
    jmp @B - к предыдущей @@, (backward)
     
  17. hack_virii

    hack_virii New Member

    Публикаций:
    0
    Регистрация:
    7 июн 2009
    Сообщения:
    71
    Comer_, aaaaaa, ept!))

    Спасибо, понял.

    В дальнейщем буду пользоваться, где получиться. Просто пока что, мне проще пользоваться названными метками, чтобы не запутаться..)
     
  18. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    хороший тон ^^)
     
  19. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    чего до него расти ?

    в отчадчик и вникай там росту минут 10
     
  20. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.625
    Адрес:
    Russia
    еще раз пардон - в отладчик