Как вывести результат в сообщение - 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
Прога компилируется. Сообщение выводит значение переменной. Не получается присвоить значение из ах переменной st2& Или как проще сделать без переменных? Результат сложения в сообщение

Решение задачи: «Как вывести результат в сообщение»

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

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

Список элементов:

  1. .386 - указание на использование 32-битного режима
  2. .model flat, stdcall - указание на модель памяти и сегментацию кода
  3. include \masm32\include\windows.inc, include \masm32\include\kernel32.inc, include \masm32\include\user32.inc, include \masm32\include\fpu.inc - подключаемые файлы, содержащие определения функций и констант
  4. includelib \masm32\lib\user32.lib, includelib \masm32\lib\kernel32.lib, includelib \masm32\lib\fpu.lib - библиотеки, которые должны быть подключены компилятором
  5. .Data - сегмент данных
  6. st1 db Результат вычисления:, 0 - строка, которую нужно вывести
  7. st2 db Проба, 0 - вспомогательная строка
  8. .Code - сегмент кода
  9. _start: - метка начала работы программы
  10. mov ax, 12h, mov bx,1eh, add ax,bx - код для выполнения математической операции
  11. mov edi,offset st2 - указание на строку для вывода
  12. test ax, ax - проверка на знак числа
  13. jns oi1 - если число знаковое, то переход к следующей инструкции
  14. mov cx, ax - инициализация счетчика цифр числа
  15. mov al,'-' - если число отрицательное, то добавление минуса
  16. stosb - выведение одной цифры числа
  17. mov ax, cx - сохранение модуля числа в AX
  18. neg ax - инвертирование числа для получения положительного значения
  19. oi1: xor cx, cx - инициализация счетчика цифр числа
  20. mov bx, 10 - установка основания системы счисления
  21. oi2: xor dx,dx - инициализация регистра для деления числа
  22. div bx - деление числа на основание системы счисления
  23. push dx - сохранение остатка от деления в стеке
  24. inc cx - увеличение счетчика цифр числа
  25. test ax, ax - проверка на ноль, чтобы перейти к следующей инструкции
  26. jnz oi2 - если число не равно нулю, то продолжение цикла
  27. mov ah, 02h - установка регистра для функции вывода сообщения
  28. pop dx - извлечение цифры из стека и преобразование ее в символ
  29. add dl, '0' - добавление символа цифры к регистру DL
  30. stosb - вывод очередной цифры числа
  31. loop oi3 - повторение цикла до тех пор, пока не будут выведены все цифры числа
  32. invoke MessageBox, NULL, addr st2, addr st1, MB_OK - вызов функции для вывода сообщения с результатом вычисления
  33. invoke ExitProcess, NULL - вызов функции для завершения работы программы

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

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