1. Пожалуйста, запустите тренажёр Лампанель . Введите программу с использованием следующего дизассемблера: program

  • 34
1. Пожалуйста, запустите тренажёр "Лампанель". Введите программу с использованием следующего дизассемблера: program: записать код команды "stop": запишите последовательность символов, представляющую содержимое памяти, где находится эта программа.
2. Как вы думаете, какой будет код команды "mov r1,r3"? Проверьте ваш ответ с помощью программы.
3. Напишите программу, которая будет преобразовывать строчные буквы в заглавные, используя операции с байтами. Блок данных может иметь следующий вид: d: data "abcdefgh".
Тигрёнок
16
1. Чтобы запустить тренажер "Лампанель", введите следующую программу с использованием дизассемблера:

\[
\begin{{align*}}
&\text{{org 1000h}} \\
&\text{{mov ah, 4Ch}} \\
&\text{{int 21h}} \\
&\text{{end}}
\end{{align*}}
\]

Эта программа записывает команду "stop" и прерывание, чтобы сообщить операционной системе о том, что программа завершена.

Чтобы записать последовательность символов, представляющую содержимое памяти программы, воспользуйтесь Hex дизассемблером. На лампанели найдите раздел, который позволяет вам просмотреть содержимое памяти. Введите адрес памяти, начиная с 1000h, и при необходимости измените формат отображения на символы ASCII. Там вы должны увидеть последовательность символов, представляющую содержимое памяти, где находится программа.

2. Код команды "mov r1, r3" зависит от архитектуры и набора инструкций, используемых в вашей программе. Для предположения давайте рассмотрим x86 архитектуру. В этом случае, чтобы проверить код команды, зависит от конкретной команды "mov" в вашем дизассемблированном коде. Программа может содержать что-то вроде:

\[
\begin{{align*}}
&\text{{org 1000h}} \\
&\text{{mov bx, 1234h}} \\
&\text{{mov ax, bx}} \\
&\text{{end}}
\end{{align*}}
\]

В этом примере, команда "mov bx, 1234h" загружает значение 1234h в регистр bx, а затем команда "mov ax, bx" копирует значение из регистра bx в регистр ax. Если предположить, что r1 и r3 являются регистрами bx и ax соответственно, то код команды "mov r1, r3" будет иметь следующий дизассемблированный вид:

\[
\text{{mov bx, 1234h}}
\]

Таким образом, код команды "mov r1, r3" будет интерпретирован как команда "mov bx, 1234h" в данном примере.

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

\[
\begin{{align*}}
&\text{{org 1000h}} \\
&\text{{mov cx, 8}} \\
&\text{{mov si, offset d}} \\
&\text{{mov al, 20h}} \\
&\text{{sub al, 32h}} \\
&\text{{add byte ptr [si], al}} \\
&\text{{loop $-1}} \\
&\text{{end}} \\
&\text{{d: db "abcdefgh"}} \\
&\text{{end}}
\end{{align*}}
\]

В этой программе мы используем регистры cx и si для обработки блока данных длиной 8 байт, начинающегося с адреса памяти, заданного меткой "d". Регистр al используется для временного хранения текущего символа, а также для хранения значения смещения, которое нужно добавить к текущему символу для его преобразования в заглавную букву. Сначала мы загружаем значение 20h в al, что является разницей между ASCII кодами строчной ("a") и заглавной ("A") буквы. Затем мы добавляем это смещение к каждому байту в блоке данных, на который указывает si.
Цикл "loop $-1" позволяет нам выполнить эту операцию для каждого байта в блоке данных.
По окончании выполнения программы, блок данных "abcdefgh" будет изменен на "ABCDEFGH".