Shubham_Dubey Ответов: 2

Логика реализации" неродного " типа данных


Предположим, что аппаратное обеспечение компьютера содержит инструкцию :-
MOVE (source, dest, length) // Hardware instructions are presented using UPPERCASE letters

это копирует символьную строку длина байты из адреса, указанного источник по адресу, указанному дест.

Длина должна быть задана целым числом.

Пример этой инструкции-MOVE (один,б,3), который копирует три байта, начинающиеся в местоположении а, в три байта, начинающиеся в местоположении В.

ЗАПИСКА : Чтобы сослаться на местоположение, которое находится на 4 байта дальше a, нотация один[4] будет использоваться для ссылки на это место.

Кроме того, для ссылки на адрес, заданный путем добавления двоичных целочисленных констант байта в икс по адресу один, используется обозначение a[x].

Операция перемещения требует от программиста указания длины копируемой строки. Таким образом, его операнд является строкой фиксированной длины символа (длина строки должна быть известна).

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

Проблема :
Теперь предположим, что мы хотим реализовать символьные строки различной длины на этой конкретной машине. То есть мы хотим дать возможность программистам использовать инструкцию
MOVEVAR (source,dest)

чтобы переместить символьную строку из источника местоположения в местоположение dest без необходимости указывать какую-либо длину.

Решение :

К осуществлять этот тип данных, мы должны сначала решить, как он должен быть представлен в памяти машины, а затем указать, как это представление должно быть обработано. Очевидно, что необходимо знать, сколько байтов должно быть перемещено для выполнения этой инструкции. Поскольку операция MOVEVAR не указывает это число, следовательно, это число должно содержаться в представлении самой символьной строки. Символьная строка переменной длины длины l может быть представлена непрерывным набором л+1 байт (л< 256). Первый байт содержит двоичное представление, а остальные байты содержат представления символов в строке.

Программа для реализации операции MOVEVAR может быть записана следующим образом :-
MOVE (source,dest,1);
for (i=1; i<dest; i++)
{
    MOVE(source[i], dest[i], 1);
}


Источник проблемы: см. стр. 20
(Скриншот страницы)



мой вопрос :-


Может ли кто-нибудь объяснить логику этой реализации инструкции MOVEVAR, т. е. алгоритм реализации (как это работает ?)

Что я уже пробовал:

Я попытался найти объяснение, но не смог.

2 Ответов

Рейтинг:
13

Richard MacCutchan

Предполагая, что первый байт исходных данных содержит длину строки, мы могли бы иметь что-то вроде:

--------------------------
|  4 |  A |  B |  C |  D |
--------------------------

Таким образом, петля перемещения будет:
// move the length byte from the source to the destination
MOVE (source,dest,1);  // dest[0] now contains 4
for (i=1; i <dest; i++)="" set="" i="1," and="" while="" <="" 4="" do="" the="" following<!--="" newline="" --="">{
    MOVE(source[i], dest[i], 1); // move the source byte at offset i to 
                                 // the byte at offset i of the destination
} // increment i and repeat while the value of i is less than 4

Это не удастся, так как цикл завершится до копирования байта со смещением 4, таким образом:

Value of i   copy byte
    1           A
    2           B
    3           C
    4 -> loop terminates since i is not less than byte 0 of dest.

таким образом, цикл for должен быть
for (i=1; i <= dest; i++)


Shubham_Dubey

Большое спасибо :)
Вот ответ, который мне был нужен.
Еще раз приношу свои извинения за то, что произошло раньше. Большое спасибо :)

Richard MacCutchan

Я также приношу свои извинения за то, что не заметил этого раньше.

Рейтинг:
0

Richard MacCutchan

Большинство наборов команд реализуют это с помощью регистров, которые автоматически увеличиваются после копирования каждого байта. Номер для копирования заносится в специальный регистр, который отсчитывает время для каждого повторения копии. Видеть Набор инструкций Intel-REP[^].


Shubham_Dubey

Можете ли вы объяснить алгоритм в терминах непрофессионала ?
Я хочу сказать, что не могли бы вы объяснить это без таких терминов, как регистры или счетчики.
Например, что делает цикл for В MOVEVAR и почему переменная loop count начинается с 1 и переходит в (dest-1)?

Richard MacCutchan

Код, который у вас есть, не имеет смысла:

for (i=1; i<dest; i++)

dest это место, которое нужно сравнить i к числу байтов для копирования.

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

Shubham_Dubey

Ну, этот код тоже не имеет особого смысла для меня, поэтому я поставил ссылку на источник вопроса.
Вы можете проверить ссылку, потому что я почти уверен, что вы этого не делали.
И, кроме того, я не пытаюсь просто размещать здесь Вопросы и не решать их самостоятельно.
Я пытался понять реализацию, но не мог понять ее.
Я изучаю "структуры данных с использованием языка Си" Аарона М. Тененбаума, и это очень уважаемая и высокоуровневая книга по структурам данных.
Поэтому лучше внимательно прочитайте вопрос и предоставленную ссылку, иначе вы всегда можете оставить этот вопрос и уйти, если не можете на него ответить.

Richard MacCutchan

Да, я действительно читал ссылку; она указывает на книгу для продажи, так что пользы от нее мало. Но игнорируя это, если вы не можете предоставить все детали вашей проблемы в вопросе, то нам трудно вам помочь.

И, пожалуйста, помните, что все здесь отдают вам свое время бесплатно, поэтому, возможно, вам следует быть немного более вежливым со своими комментариями.

Shubham_Dubey

При всем уважении приведенная ссылка указывает на Google books, показывающую некоторые из начальных страниц книги Аарона М. Тененбаума "структуры данных с использованием языка Си", и она действительно показывает страницу 20, содержащую указанный код.
Кроме того, я не хотел быть невежливым, я просто раздражен, потому что не получил объяснения, на которое надеялся.
Прости, если я обидел тебя раньше.

Richard MacCutchan

Извините, но все, что я получаю по этой ссылке, - это обложка книги, без содержания. Однако мой предыдущий комментарий остается в силе: если вы хотите помочь с вашей проблемой, то вам нужно предоставить все детали здесь, в вашем вопросе.