Проблема с отображением цитаты в окне памяти в ассемблере Visual Studio

Вопрос или проблема

.386
.model flat

.data
quote byte "Машины действительно чувствуют",0
message byte SIZEOF quote DUP(0),0

.code
start proc
      mov esi,0
      mov ecx,SIZEOF quote

LP:
      mov al, quote[esi]  ;получить символ из quote
      mov message[esi],al ;сохранить в сообщении
      inc esi
      loop LP

      ret
start endp
end   start

Я использовал этот код в файле .asm на ассемблере, он был предназначен для платформы x86, точка входа была названа start, точка останова была на ret, код должен был показать цитату “машины действительно чувствуют” дважды в одном из четырех окон памяти, которые можно увидеть при использовании отладчика, и тем не менее, по какой-то причине она не появилась, хотя онлайн-курс, на котором я учусь, показывает другое. Из-за этого пока я прибегаю к тому, чтобы попросить помощи в интернете, надеюсь, я хорошо объяснил свою ситуацию и что есть ошибка, из которой я могу извлечь урок. Спасибо за ваше время.

Я пытался сделать так, чтобы сообщение “Машины действительно чувствуют” появилось дважды в окнах памяти при отладке программы.

Ответ или решение

Проблема, с которой вы столкнулись, заключается в том, что ваш код не копирует строку "Machines do feel" дважды в область памяти, и поэтому вы не видите ожидаемый результат в окне памяти отладчика. Давайте разберёмся, что нужно изменить, чтобы ваш код работал правильно.

Исправления в коде:

  1. Создание сообщения с дубликатом: Вместо того, чтобы просто скопировать строку в область памяти один раз, необходимо организовать цикл, позволяющий дублировать строку.

  2. Использование правильного размера: Вместо использования SIZEOF для определения длины строки, лучше использовать явное значение (размер) строки или вычислить его.

  3. Исправление логики копирования: Вам необходимо создать дополнительный цикл для дублирования строки.

Вот исправленный код с учётом вышеуказанных замечаний:

.386
.model flat

.data
quote byte "Machines do feel",0
quoteLength equ $ - quote
message byte quoteLength * 2 DUP(0),0  ; Создаем достаточно места для двух копий

.code
start proc
      ; Копируем строку в message дважды
      mov esi, 0             ; Индекс для исходной строки
      mov edi, 0             ; Индекс для целевой строки (message)
      mov ecx, quoteLength   ; Количество символов для копирования

copyQuote:
      mov al, quote[esi]     ; Берем символ из quote
      mov message[edi], al   ; Сохраняем в message
      inc esi                ; Переходим к следующему символу в quote
      inc edi                ; Переходим к следующему символу в message
      loop copyQuote         ; Повторяем для всех символов

      ; Копируем строку повторно для дублирования
      mov esi, 0             ; Сбрасываем индекс для исходной строки
      mov ecx, quoteLength   ; Количество символов для копирования ещё раз

copyQuoteAgain:
      mov al, quote[esi]     ; Берем символ из quote
      mov message[edi], al   ; Сохраняем в message снова
      inc esi                ; Переходим к следующему символу в quote
      inc edi                ; Переходим к следующему символу в message (продолжаем после первой копии)
      loop copyQuoteAgain    ; Повторяем для всех символов

      ret
start endp
end start

Объяснение изменений:

  • quoteLength: Мы определяем длину оригинальной строки quote при помощи директивы equ, чтобы код был более читаемым.

  • message: Размер message теперь в два раза больше размера quote, чтобы вместить оба экземпляра строки.

  • Циклы: Мы добавили два отдельных цикла копирования: один для первой копии строки и другой для дублирования.

Теперь вы должны увидеть строку "Machines do feel" в памяти дважды при отладке программы. Запустите программу с настройкой отладки и установите точку останова на команду ret, чтобы посмотреть содержимое message в окне памяти.

Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их. Удачи с вашим проектом!

Оцените материал
Добавить комментарий

Капча загружается...