Как вывести результат в сообщение - Assembler
Формулировка задачи:
386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\fpu.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\fpu.lib .Data st1 db "Результат вычисления:", 0 st2 db "Проба", 0 .Code _start: mov ax, 12 mov bx,1eh add ax,bx invoke MessageBox, NULL, addr st2, addr st1, MB_OK invoke ExitProcess, NULL end _start
Решение задачи: «Как вывести результат в сообщение»
textual
Листинг программы
.386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc include \masm32\include\fpu.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\fpu.lib .Data st1 db "Результат вычисления:", 0 st2 db "Проба", 0 .Code _start: mov ax, 12h mov bx,1eh add ax,bx mov edi,offset st2 ;; если число знаковое, то необходимо расскоментировать следующие строки ;; Проверяем число на знак. ; test ax, ax ; jns oi1 ; ;; Если оно отрицательное, выведем минус и оставим его модуль. ; mov cx, ax ; mov al,'-' stosb ; mov ax, cx ; neg ax ;; Количество цифр будем держать в CX. ;oi1: xor cx, cx mov bx, 10 ; основание сс. 10 для десятеричной и т.п. oi2: xor dx,dx div bx ; Делим число на основание сс. В остатке получается последняя цифра. ; Сразу выводить её нельзя, поэтому сохраним её в стэке. push dx inc cx ; А с частным повторяем то же самое, отделяя от него очередную ; цифру справа, пока не останется ноль, что значит, что дальше ; слева только нули. test ax, ax jnz oi2 ; Теперь приступим к выводу. mov ah, 02h oi3: pop dx ; Извлекаем очередную цифру, переводим её в символ и выводим. ;; раскоментировать если основание сс > 10, т.е. для вывода требуются буквы ; cmp dl,9 ; jbe oi4 ; add dl,7 ;oi4: add dl, '0' mov al,dl stosb ; Повторим ровно столько раз, сколько цифр насчитали. loop oi3 invoke MessageBox, NULL, addr st2, addr st1, MB_OK invoke ExitProcess, NULL end _start
Объяснение кода листинга программы
Список элементов:
- .386 - указание на использование 32-битного режима
- .model flat, stdcall - указание на модель памяти и сегментацию кода
- include \masm32\include\windows.inc, include \masm32\include\kernel32.inc, include \masm32\include\user32.inc, include \masm32\include\fpu.inc - подключаемые файлы, содержащие определения функций и констант
- includelib \masm32\lib\user32.lib, includelib \masm32\lib\kernel32.lib, includelib \masm32\lib\fpu.lib - библиотеки, которые должны быть подключены компилятором
- .Data - сегмент данных
- st1 db
Результат вычисления:
, 0 - строка, которую нужно вывести - st2 db
Проба
, 0 - вспомогательная строка - .Code - сегмент кода
- _start: - метка начала работы программы
- mov ax, 12h, mov bx,1eh, add ax,bx - код для выполнения математической операции
- mov edi,offset st2 - указание на строку для вывода
- test ax, ax - проверка на знак числа
- jns oi1 - если число знаковое, то переход к следующей инструкции
- mov cx, ax - инициализация счетчика цифр числа
- mov al,'-' - если число отрицательное, то добавление минуса
- stosb - выведение одной цифры числа
- mov ax, cx - сохранение модуля числа в AX
- neg ax - инвертирование числа для получения положительного значения
- oi1: xor cx, cx - инициализация счетчика цифр числа
- mov bx, 10 - установка основания системы счисления
- oi2: xor dx,dx - инициализация регистра для деления числа
- div bx - деление числа на основание системы счисления
- push dx - сохранение остатка от деления в стеке
- inc cx - увеличение счетчика цифр числа
- test ax, ax - проверка на ноль, чтобы перейти к следующей инструкции
- jnz oi2 - если число не равно нулю, то продолжение цикла
- mov ah, 02h - установка регистра для функции вывода сообщения
- pop dx - извлечение цифры из стека и преобразование ее в символ
- add dl, '0' - добавление символа цифры к регистру DL
- stosb - вывод очередной цифры числа
- loop oi3 - повторение цикла до тех пор, пока не будут выведены все цифры числа
- invoke MessageBox, NULL, addr st2, addr st1, MB_OK - вызов функции для вывода сообщения с результатом вычисления
- invoke ExitProcess, NULL - вызов функции для завершения работы программы