Вопрос или проблема
.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" дважды в область памяти, и поэтому вы не видите ожидаемый результат в окне памяти отладчика. Давайте разберёмся, что нужно изменить, чтобы ваш код работал правильно.
Исправления в коде:
-
Создание сообщения с дубликатом: Вместо того, чтобы просто скопировать строку в область памяти один раз, необходимо организовать цикл, позволяющий дублировать строку.
-
Использование правильного размера: Вместо использования
SIZEOF
для определения длины строки, лучше использовать явное значение (размер) строки или вычислить его. -
Исправление логики копирования: Вам необходимо создать дополнительный цикл для дублирования строки.
Вот исправленный код с учётом вышеуказанных замечаний:
.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
в окне памяти.
Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь задавать их. Удачи с вашим проектом!