Изменить строку, заменив символы в дампе памяти - 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;
}

Объяснение кода листинга программы

  1. Установка кодовой страницы консоли в 1251.
  2. Использование ассемблера для выполнения операций, которые не могут быть выполнены на языке C.
  3. Замена символов в дампе памяти.
  4. Ввод трех чисел с помощью функции scanf.
  5. Вывод строки Разность AX и BX и значений AX и BX с помощью функции printf.
  6. Использование регистров eax и ebx для временного хранения значений.
  7. Использование стека для освобождения регистров после вызова функций.
  8. Использование команды sub для выполнения операции вычитания.
  9. Вывод результата операции вычитания с помощью функции printf.
  10. Использование стека для освобождения регистров после вызова функций.
  11. Использование команды pop для восстановления регистров после использования стека.
  12. Использование команды mov для перемещения значений между регистрами.
  13. Использование команды push для отправки значений в стек.
  14. Использование команды call для вызова функции.
  15. Использование команды ret для возврата из функции.
  16. Использование констант для хранения значений.
  17. Использование символов кавычек для обозначения строк.
  18. Использование формата %s для вывода строк.
  19. Использование формата %hd для вывода значений short int.
  20. Использование формата %hd %hd для вывода значений short int в определенном формате.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 3.933 из 5
Похожие ответы