Как вывести информацию на экран функцией MessageBox ? - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте ! У меня возникла такая проблема:есть пример x=2*a+6^b .Его нужно решить для пяти значений переменной а , используя встроенные арифметические MASM-32 функции и вывести результат через MessageBox. Вот я написал программу:
.386
.model flat,stdcall
option casemap:none ; відмінність малих та великих літер
include C:\masm32\include\windows.inc
include C:\masm32\include\kernel32.inc
include C:\masm32\include\user32.inc
include C:\masm32\include\fpu.inc
includelib C:\masm32\lib\kernel32.lib
includelib C:\masm32\lib\user32.lib
includelib C:\masm32\lib\fpu.lib
BSIZE equ 30 ;завдання реальної кількості байтів
.data
a1 dt 3.0
a2 dt 4.0
a3 dt 5.0
a4 dt 6.0
a5 dt 7.0
b dt 5.0
op1 dt 2.0
op2 dt 6.0
 
res1 TBYTE 0  //для хранения результата работы программы
res2 TBYTE 0
res3 TBYTE 0
res4 TBYTE 0
res5 TBYTE 0
 
tmp1 DT ?     //для временных результатов
tmp2 DT ?
tmp3 DT ?
tmp4 DT ?
tmp5 DT ?
 
info1 db "x1= "       ;підпис числа для віконця результату
buf1 BYTE BSIZE dup(?),0  ;розмір буфера для символів, які перетворюються
buf2 BYTE BSIZE dup(?),0  ;розмір буфера для символів, які перетворюються
buf3 BYTE BSIZE dup(?),0  ;розмір буфера для символів, які перетворюються
buf4 BYTE BSIZE dup(?),0  ;розмір буфера для символів, які перетворюються
buf5 BYTE BSIZE dup(?),0  ;розмір буфера для символів, які перетворюються
st1 db "y=2*a+6^b"   ;назва віконця
.code
_Start:
finit  ;ініціювання процесора
invoke FpuMul,ADDR op1,ADDR a1,0,SRC1_REAL or SRC2_REAL or DEST_FPU  ;st(0):=2*a
invoke FpuXexpY,ADDR op2,ADDR b,ADDR tmp1,SRC1_REAL or SRC2_REAL or DEST_MEM  ;tmp:=6^b
invoke FpuAdd,0,ADDR tmp1,ADDR res1,SRC1_FPU or SRC2_REAL or DEST_MEM;  res1:=st(0)+tmp
invoke FpuFLtoA,ADDR res1,3,ADDR buf1,SRC1_REAL or SRC2_DIMM
 
invoke FpuMul,ADDR op1,ADDR a2,0,SRC1_REAL or SRC2_REAL or DEST_FPU  ;st(0):=2*a
invoke FpuXexpY,ADDR op2,ADDR b,ADDR tmp2,SRC1_REAL or SRC2_REAL or DEST_MEM  ;tmp:=6^b
invoke FpuAdd,0,ADDR tmp2,ADDR res2,SRC1_FPU or SRC2_REAL or DEST_MEM;  res2:=st(0)+tmp
invoke FpuFLtoA,ADDR res2,3,ADDR buf2,SRC1_REAL or SRC2_DIMM
 
invoke FpuMul,ADDR op1,ADDR a3,0,SRC1_REAL or SRC2_REAL or DEST_FPU  ;st(0):=2*a
invoke FpuXexpY,ADDR op2,ADDR b,ADDR tmp3,SRC1_REAL or SRC2_REAL or DEST_MEM  ;tmp:=6^b
invoke FpuAdd,0,ADDR tmp3,ADDR res3,SRC1_FPU or SRC2_REAL or DEST_MEM;  res3:=st(0)+tmp
invoke FpuFLtoA,ADDR res3,3,ADDR buf3,SRC1_REAL or SRC2_DIMM
 
invoke FpuMul,ADDR op1,ADDR a4,0,SRC1_REAL or SRC2_REAL or DEST_FPU  ;st(0):=2*a
invoke FpuXexpY,ADDR op2,ADDR b,ADDR tmp4,SRC1_REAL or SRC2_REAL or DEST_MEM  ;tmp:=6^b
invoke FpuAdd,0,ADDR tmp4,ADDR res4,SRC1_FPU or SRC2_REAL or DEST_MEM;  res:=st(0)+tmp
invoke FpuFLtoA,ADDR res4,3,ADDR buf4,SRC1_REAL or SRC2_DIMM
 
invoke FpuMul,ADDR op1,ADDR a5,0,SRC1_REAL or SRC2_REAL or DEST_FPU  ;st(0):=2*a
invoke FpuXexpY,ADDR op2,ADDR b,ADDR tmp5,SRC1_REAL or SRC2_REAL or DEST_MEM  ;tmp:=6^b
invoke FpuAdd,0,ADDR tmp5,ADDR res5,SRC1_FPU or SRC2_REAL or DEST_MEM;  res:=st(0)+tmp
invoke FpuFLtoA,ADDR res5,3,ADDR buf5,SRC1_REAL or SRC2_DIMM
 
invoke MessageBox,0,addr info1,addr st1,MB_OK
invoke ExitProcess,0
end _Start
Вообщем , я проделываю одинаковые действия , только для разных данных a,res,tmp- их меняю . Мне нужно вывести на экран результат работы , но когда я пишу строчку
invoke MessageBox,0,addr info1,addr st1,MB_OK
то выводится лишь результат при a1 . Как мне вывести все результаты на экран ? пробовал создавать info1 db "x2= " ....х3,х4,х5 - но это всё не то , в результате выводит х1=х2=х3=х4=х5=результат при а1. Помогите пожалуйста , я сам не могу понять как это сделать ( Заранее огромное спасибо за помощь !

Решение задачи: «Как вывести информацию на экран функцией MessageBox ?»

textual
Листинг программы
; masm windows gui #
.686
.model flat
include /masm32/include/windows.inc
include /masm32/include/user32.inc
include /masm32/include/kernel32.inc
includelib /masm32/lib/user32.lib
includelib /masm32/lib/kernel32.lib
.data
format db "%d",0Ah,"%d",0Ah,"%d",0Ah,"%d",0Ah,"%d",0
buffer db 200 dup(?)
.code
start:  mov esi,offset buffer
    mov ecx,5
    mov eax,7782
@@: push eax
    add eax,2
    loop @b
    invoke wsprintf,esi,addr format
    add esp,7*4
    invoke MessageBox,0,esi,0,MB_OK
    invoke ExitProcess,0
end start

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

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

  1. Переменная esi содержит адрес буфера.
  2. Переменная ecx содержит количество итераций цикла.
  3. Переменная eax содержит код операции для функции MessageBox.
  4. Цикл выполняется 5 раз.
  5. Функция wsprintf форматирует строку и записывает её в буфер.
  6. Функция MessageBox выводит диалоговое окно с сообщением.
  7. Функция ExitProcess завершает работу программы.

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

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