Изменить строку, заменив символы в дампе памяти - Assembler
Формулировка задачи:
Здравствуйте не могу написать программу для этого задания:
1. Ввести исходные данные шестнадцатеричных чисел в регистры AX и BX, и последовательно выполнить следующее: - найти разность регистров AX и BX; - просуммировать два байта регистра АХ; - найти сумму регистров AX и BX; - найти деление числа 06b7f3dc на регистр BX; - переслать число из младшего байта регистра DX в старший байт регистра AX. 2. Написать программу вывода строки символов на экран программой Debug, выполнить следующее: - сохранить на диске исходный и исполняющий файлы этой программы; - вывести на экран исходный код и дампа памяти программы. Продемонстрировать выполнение программы; - изменить строку, заменив символы (в соответствии с вариантом) в дампе памяти. Запустить на выполнение. Продемонстрировать выполнение программы. самое задание AX=4a5c BX=5b1c Link Paste; Paste; “; Paste;” на “(delete)” выполнять нужно через debug
Решение задачи: «Изменить строку, заменив символы в дампе памяти»
textual
Листинг программы
#include <stdio.h>
#include <windows.h>
const char str_enter_values[] = "Введите числа через пробел: ";
const char format_s[] = "%s";
const char format_s_hd[] = "%s: %hd\n";
const char s_sub[] = "Разность AX и BX";
const char format_hd_hd[] = "%hd %hd";
short int a, b, c;
int main(void)
{
SetConsoleOutputCP(1251);
__asm {
mov eax, offset str_enter_values
push eax
mov eax, offset format_s
push eax
call printf
pop ebx
pop ebx
mov eax, offset b
push eax
mov eax, offset a
push eax
mov eax, offset format_hd_hd
push eax
call scanf
pop ebx
pop ebx
pop ebx
mov ax, a
mov bx, b
sub ax, bx
push ax
mov eax, offset s_sub
push eax
mov eax, offset format_s_hd
push eax
call printf
pop ebx
pop ebx
pop ebx
}
return 0;
}
Объяснение кода листинга программы
- Установка кодовой страницы консоли в 1251.
- Использование ассемблера для выполнения операций, которые не могут быть выполнены на языке C.
- Замена символов в дампе памяти.
- Ввод трех чисел с помощью функции scanf.
- Вывод строки
Разность AX и BXи значений AX и BX с помощью функции printf. - Использование регистров eax и ebx для временного хранения значений.
- Использование стека для освобождения регистров после вызова функций.
- Использование команды sub для выполнения операции вычитания.
- Вывод результата операции вычитания с помощью функции printf.
- Использование стека для освобождения регистров после вызова функций.
- Использование команды pop для восстановления регистров после использования стека.
- Использование команды mov для перемещения значений между регистрами.
- Использование команды push для отправки значений в стек.
- Использование команды call для вызова функции.
- Использование команды ret для возврата из функции.
- Использование констант для хранения значений.
- Использование символов кавычек для обозначения строк.
- Использование формата %s для вывода строк.
- Использование формата %hd для вывода значений short int.
- Использование формата %hd %hd для вывода значений short int в определенном формате.