Как вывести информацию на экран функцией MessageBox ? - Assembler
Формулировка задачи:
Здравствуйте ! У меня возникла такая проблема:есть пример x=2*a+6^b .Его нужно решить для пяти значений переменной а , используя встроенные арифметические MASM-32 функции и вывести результат через MessageBox.
Вот я написал программу:
Вообщем , я проделываю одинаковые действия , только для разных данных a,res,tmp- их меняю .
Мне нужно вывести на экран результат работы , но когда я пишу строчку то выводится лишь результат при a1 . Как мне вывести все результаты на экран ? пробовал создавать info1 db "x2= " ....х3,х4,х5 - но это всё не то , в результате выводит х1=х2=х3=х4=х5=результат при а1.
Помогите пожалуйста , я сам не могу понять как это сделать (
Заранее огромное спасибо за помощь !
.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
invoke MessageBox,0,addr info1,addr st1,MB_OK
Решение задачи: «Как вывести информацию на экран функцией 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
Объяснение кода листинга программы
Список элементов:
- Переменная
esi
содержит адрес буфера. - Переменная
ecx
содержит количество итераций цикла. - Переменная
eax
содержит код операции для функцииMessageBox
. - Цикл выполняется 5 раз.
- Функция
wsprintf
форматирует строку и записывает её в буфер. - Функция
MessageBox
выводит диалоговое окно с сообщением. - Функция
ExitProcess
завершает работу программы.