Мне нужна помощь

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Ромашка
Сообщения: 13
Зарегистрирован: 22 апр 2007, 21:03

У меня следующее задание. необходимо написать макрос. такого вида. у нас допустим есть слово
ABCDEF(допустим)
необходимо, чтобы при вызове NAME C, 'CDAB'
получалось следующая штука
db '__c___'
db '___d__'
db 'a_____'
db '_b____'
то есть сортировались буквы по начальной позиции с пробелами._-пробел
:( :confused:
Теперь мои вопросы.
Мне надо как-бы сравнивать буквы, да?
Могу я сделать это следующим образом?:
Если 1 буква неотсортиров слова NE 1 букве отсортиров,
то переходим на след букву отсорт слова и продолжаем сравнение
при этом к счетчику +1(это будет номер позиции)
else
то заполняем позицию с номером счетчика данной буквой и переходим на следующую букву неотсортир слова...
-----
возомжно ли осуществить такой цикл?
Технически на уровне моих мозгов я себе это представляю, а вот как это записать....
Цикл такой не сложен, а вот как полученную букву записать в массив??? :confused:
Спасибо.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Честно говоря, я не очень понял задание. Например, этот момент:
получалось следующая штука
db '__c___'
db '___d__'
db 'a_____'
db '_b____'


Можно поточнее?
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

по-моему тут все просто, берем букву "с" и идем по слову. если буквы равны, то пишем - если нет, то пробел. потом берем "d", "a", "b" - и таким же макаром
причем здесь сортировка, не понял.
It's a long way to the top if you wanna rock'n'roll
Ромашка
Сообщения: 13
Зарегистрирован: 22 апр 2007, 21:03

[quote="Ромашка"]У меня следующее задание. необходимо написать макрос. такого вида. у нас допустим есть слово
ABCDEF(допустим)
необходимо, чтобы при вызове NAME C, 'СDAB'
получалось следующая штука
db '__c___'
db '___d__'
db 'a_____'
db '_b____'
то есть сортировались буквы по начальной позиции с пробелами._-пробел
Уточняю(правда это очень сложно):
у нас есть шаблон. В данной задаче это ABCDEF.
a-анимает 1 позицию, B-2,с-3...F-6 в слове
так вот, при вводе слова типа CDAB каждая буква в этом слове заняла свою позицию согласно шаблону, те.С-3, итд
на экране это будет выглядеть примерно так
db '__c___'
db '___d__'
db 'a_____'
db '_b____'

, где _-это пробел.
в тексте main proc должен быть макровызов, который и запускает наш макрос.
вот такого вида NAME C, 'СDAB'
я не знаю, как это объяснить по-толковому...(((((
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Ромашка, тогда не совсем понял, что такое C при вызове макроса:
NAME C, 'СDAB'

Единственное, что смог предположить, что C - это и есть шаблон (в примере - 'ABCDEF').
Если так, то вот что у меня получилось (написал на примере своих исходников, когда ну очень давно тренировался писать макросы :) )
Кстати, NAME - нехорошее имя для макроса. Походу, есть такое зарезервированное слово в ассемблере. Так что заменил его на Call_NAME

Код: Выделить всё

Call_NAME Macro PATTERN, EXAMPLE

 ; перебираем посимвольно параметр EXAMPLE
  IRPC CHAR_OF_EXAMPLE, <EXAMPLE>

 ; перебираем посимвольно параметр PATTERN
    IRPC CHAR_OF_PATTERN, <PATTERN>

     ; сравниваем текущий символ EXAMPLE и PATTERN
     ; если равны, создаем байт памяти с этим символом, иначе
     ; создаем байт памяти с пробелом
      IfIDNI <CHAR_OF_EXAMPLE>, <CHAR_OF_PATTERN>
        db '&CHAR_OF_PATTERN&'
      Else
        db ' '
      EndIf

    EndM     ;   IRPC CHAR_OF_PATTERN, <PATTERN>
  EndM     ;  of IRPC CHAR_OF_EXAMPLE, <EXAMPLE>

EndM

 ; далее - пример вызова

  .model tiny
  .code

  ORG 100h

start:

   Call_NAME ABCDEF, CDAB

end start
ПРИМЕЧАНИЕ. Возможно, я не совсем "правильным" макросом перебирают строку параметра. Как ты видишь, при вызове макроса ABCDEF, CDAB записаны БЕЗ кавычек. Это не ошибка, это так и нужно. Если сделать вызов с кавычками:
Call_NAME 'ABCDEF', 'CDAB'
то кавычки также будут восприняты как еще один символ строк передаваемых параметров.
Вообще, это можно отследить в макросе. Хотя я не увререн, правильный ли это путь. Т.е. я имею в виду, возможно есть какая-то команда макроязыка, которая будет перебирать символы, интерпретируя параметр макроса именно как строку, а не как "набор символов". Во всяком случае, вот пример с "отбрасыванием" символом двойной и одинарной кавычки (кстати, не только первой и последней, но и на любой позиции, если они встретятся внутри строки).

Код: Выделить всё

Call_NAME Macro PATTERN, EXAMPLE

  IRPC CHAR_OF_EXAMPLE, <EXAMPLE>

    IRPC CHAR_OF_PATTERN, <PATTERN>

      IFDifI <CHAR_OF_EXAMPLE>, <'>
        IFDifI <CHAR_OF_EXAMPLE>, <">
          IFDifI <CHAR_OF_PATTERN>, <'>
            IFDifI <CHAR_OF_PATTERN>, <">

              IfIDNI <CHAR_OF_EXAMPLE>, <CHAR_OF_PATTERN>
                db '&CHAR_OF_PATTERN&'
              Else
                db ' '
              EndIf

            EndIf
          EndIf
        EndIf
      EndIf

    EndM     ;  of "IRPC"
  EndM     ;  of "IRPC"

EndM

  .model tiny
  .code

  ORG 100h

start:

   Call_NAME 'ABCDEF', 'CDAB'

end start
ПРИМЕЧАНИЕ. Пробовал этот текст компилировать TASM-ом. Компилируется без ошибок.
Ромашка
Сообщения: 13
Зарегистрирован: 22 апр 2007, 21:03

спасибо тебе большое!!! все вроде понятно и просто получилось))))ну почему у меня кателок не варит???
тебе и вправду большое спасибо!!!! ты по-настоящему мне помог! не бросил девушку в беде))))
у тебя появился настоящий товарищ в виде меня. вот. спасибо))))
если тебе надо будет что-то крестиком вышить, обращайся!!!))))
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Ромашка писал(а):спасибо тебе большое!!! все вроде понятно и просто получилось))))ну почему у меня кателок не варит???
Да ладно. Прямо засмущала :) Просто счстливое совпадение, что я в свое время малость баловался макросами и у меня сохранились исходные тексты. Сейчас уже ничего этого не помню. Но в своем собственном исходном тексте настоящий програмист должен разбираться всегода :lol:
Да и, как написал уже, все-таки, там есть, на мой взгляд, некоторая "некрасивость" с этими кавычками. Возможно, существуют какие-то другие команы макроязыка, которые более применимы к именно строковому аргументу макроса. Но уже ничего не помню... :(
Но все равно, конечно, приятно за слова благодарности ;)
Ответить