Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2573
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2134
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1328
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1394
Дата выхода:09.12.2010, 10:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:223 / 66
Вопросов / ответов:1 / 1

Вопрос № 181100: Уважаемые эксперты! Помогите разработать программу, выполняющую циклическую обработку данных: вычисление значений функции Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e) в зависимости от изменяющегося на определенный шаг (задается в качестве переменной) зна...



Вопрос № 181100:

Уважаемые эксперты!
Помогите разработать программу, выполняющую циклическую обработку данных: вычисление значений функции Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e) в зависимости от изменяющегося на определенный шаг (задается в качестве переменной) значения переменной "а". Исходные данные: начальное значение переменной "а", шаг изменения переменной, количество повторений цикла и значения констант ("b", "c", "d", "e") вводятся из текстового файла на носителе. Результат вычислений выводится на экран и в файл на носителе.

Часть программы написана на MASM32 v10.

Dialog.asm

Код:

.486
.model fla t,stdcall ;модель памяти и соглашение о вызове параметров
option casemap:none



include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\Comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
include \masm32\include\oleaut32.inc
include \masm32\include\msvcrt.inc
include \masm32\macros\macros.asm

;*********************** подключаю библиотеки*************************************************
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\Comctl32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\shell32 .lib
includelib \masm32\lib\oleaut32.lib
includelib \masm32\lib\msvcrt.lib

;************************Прототипы функций*****************************************************
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
GetFileName PROTO :DWORD,:DWORD,:DWORD,:DWORD
SaveFile PROTO :DWORD
;***********************************************************************
.data ;переменные со значениями
ClassName db "DLGCLASS",0
MenuName db "MyMenu",0
DlgName db "MyDialog",0
szDisplayName db "Курсовая по СПО",0
TheTextExit db "Выход из программы",0
szFilterTXT db 'Текстовые Файлы (*.txt)',0,'*.txt',0,0 ;фильтр для выбора текстовых файлов
szTitle db 'Введите имя открываемого файла',0 ;заголовок для диалога выбора файлов
szTitleSave db 'Введите имя сохраняемого файла',0 ;заголовок для диалога выбора файлов
szMessage db "Файл изменен, сохран ить?",0 ;сообщение, когда было изменение
szDefault db 'default.txt',0 ;имя файла по-умолчанию
fChange dd 0 ;флаг изменения текста в редакторе
;************************************************************************
.data? ;переменные без значений
hInstance HINSTANCE ?
CommandLine LPSTR ?
buffer db 512 dup(?)
hMemDC dd ? ;описатель совместимого контекста устройства (DC)
szNameTXT db 256 dup (?) ;для хранения текущего имени txt-файла
;************************************************************************
.const ;константы
IDC_EDIT equ 3000 ; гребаный эдит
IDC_BUTTON equ 3001
IDC_EXIT equ 3002
IDM_OPEN equ 32000
IDM_SAVE equ 32001
IDM_EXIT equ 32003
IDM_CLEAR equ 32007
IDC_BCDE equ 3003
IDC_PROG equ 3008
IDC_Y equ 3004
IDM_SP equ 32005

;**************************************************************** *********
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine
mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
invoke ExitProcess,eax
;**************************************************************************
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hDlg:HWND
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground,COLOR_BTNFACE+1
mov wc.lpszMenuName,OFFSET MenuName
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_APPLICATION
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke CreateDialogParam,hInstance,ADDR DlgName,NULL,NULL,NULL
mov hDlg,eax
invoke GetDlgItem,hDlg,IDC_BCDE
in voke SetFocus,eax
INVOKE ShowWindow, hDlg,SW_SHOWNORMAL
INVOKE UpdateWindow, hDlg
.WHILE TRUE
INVOKE GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke IsDialogMessage, hDlg, ADDR msg
.if eax==FALSE
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.endif
.ENDW
mov eax,msg.wParam
ret
WinMain endp
;***************************************************************************
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL fname :DWORD
LOCAL patn :DWORD
LOCAL dwCount:dword, \ ;младшее двойное слово длины файла
dwHigh:dword ;старшее двойное слово длины файла
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.ELSEIF uMsg==WM_COMMAND
mov eax,wParam
.IF lParam==0
.IF ax==IDM_OPEN
;*******Открываю файл дл я чтения********************************************

invoke GetFileName,offset szNameTXT,offset szFilterTXT,GetOpenFileName,offset szTitle
.if eax != 0
mov ebx, rv(CreateFile,offset szNameTXT,GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0)
;узнаем длину файла
mov [dwCount], rv(GetFileSize, ebx, ADDR dwHigh)
;резервируем память под содержимое файла
;в конце добавим 1 байт для завершающего нуля
lea edi, dwCount
mov eax, [edi]
inc eax
;esi - адрес буфера
mov esi, rv(GlobalAlloc, GMEM_FIXED, eax)
;читаем файл
;edi - адрес переменной с длиной
;ebx - описатеь файла
invoke ReadFile, ebx, esi, [edi], edi, 0
;закрываем файл
invoke CloseHandle, ebx
;читаем реальную длину файла
mov eax, [edi]
;завершим нулем
mov byte ptr [eax+esi], 0
;получим описатель Edit-а на странице диалога
invoke GetDlgItem, hWnd, IDC_BCDE
;и выведем в него
invoke SetWindowText, eax, esi
;освободим память
invoke GlobalFree, esi
.endif

;*****************Сохраняю в файл*******************************************
.ELSEIF ax==IDM_SAVE
invoke SaveFile, hWnd
;***************************************************************************
;*****************Очищаю Edit***********************************************
.ELSEIF ax==IDM_CLEAR
invoke SetDlgItemText,hWnd,IDC_BCDE,NULL
invoke SetDlgItemText,hWnd,IDC_PROG,NULL
invoke SetDlgItemText,hWnd,IDC_Y,NULL
invoke SetDlgItemText,hWnd,IDC_EDIT,NULL
;***************************************************************************
.ELSEIF ax==IDM_SP
ShellAboutBox hWnd,NULL,\
"СПО: Проект",\
NULL
.ELSEIF ax==IDM_EXIT
invoke MessageBox,hWnd,ADDR TheTextExit,ADDR szDisplayName,MB_YESNO
.if eax == IDNO
return 0
.endif
invoke DestroyWindow,hWnd
.ENDIF
.ELSE
mov edx,wParam
shr edx,16
;*******************************Обработчик нажатия кнопки "выполнить&quo t;***********************
.IF dx==BN_CLICKED
.IF ax==IDC_BUTTON

.ENDIF
.ENDIF
;********************************************************************************************
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
;***************************************************************************
GetFileName proc uses edi, pFName:dword, \ ;имя текущего файла
pFilter:dword,\ ;фильтр
fun:dword, \ ;функция, которая вызывается
pTitle:dword ;заголовок диалога
LOCAL ofn:OPENFILENAMEA

STRING szCurrPath,"." ;начальный путь - текущая папка

lea edi, ofn
mov ecx, (size OPENFILENAMEA) / 4
xor eax, eax
rep stosd
lea eax, [ofn]
mov [(OPENFILENAMEA ptr [eax]).lStructSize], size OPENFILENAMEA
m2m [(OPENFILENAMEA ptr [eax]).lpstrFile], pFName ;имя текущего фа йла
mov [(OPENFILENAMEA ptr [eax]).nMaxFile], 256 ;его макс длина
m2m [(OPENFILENAMEA ptr [eax]).lpstrFilter], pFilter ;фильтр
m2m [(OPENFILENAMEA ptr [eax]).lpstrTitle], pTitle ;заголовок диалога
mov [(OPENFILENAMEA ptr [eax]).lpstrInitialDir], offset szCurrPath ;текущий путь
mov [(OPENFILENAMEA ptr [eax]).Flags], OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST or OFN_HIDEREADONLY

push eax ;параметр - адрес структуры
mov eax, [fun] ;адрес функции
call dword ptr eax ;вызываем
ret
GetFileName endp
;***************************************************************************
;сохранение файла
SaveFile proc uses edi esi ebx, hwnd:DWORD
local dwHiLen:dword ;для старшего dword-а длины
;запросим имя TXT-файла
;проверим, было ли введено имя файла
.if [szNameTXT] == 0 ;первый байт == 0?
lea edi, [szDefault] ;если да, то берем имя файла по-умолчанию
.else
lea edi, [szNameTXT]
.endif
;ждем имя фа йла для записи
invoke GetFileName,edi,offset szFilterTXT,GetSaveFileName,offset szTitleSave
;что-то ввели?
.if eax != 0
push edi ;сохраним имя файла
;получим описатель Edit-а на странице диалога
mov edi, rv(GetDlgItem, hwnd, IDC_Y) ;edi - описатель окна редактора
mov ebx, rv(GetWindowTextLength, edi) ;ebx - длина содержимого
inc ebx ;учтем завершающий 0
mov esi, rv(GlobalAlloc, GMEM_FIXED, ebx) ;esi - адрес памяти под данные

invoke GetWindowText, edi, esi, ebx ;получим данные
pop edi ;edi - имя файла
;создаем файл на запись со сбросом в 0, если он уже был
mov edi, rv(CreateFile,edi,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
;в edi - описатель открытого файла
dec ebx ;последний 0 не пишем
;пишем файл
invoke WriteFile, edi, esi, ebx, ADDR dwHiLen, 0

invoke CloseHandle, edi ;закрываем файл
invoke GlobalFree, esi ;освобождаем память
mov fChange, 0 ;сбросим флаг изменения
.ENDIF
ret
SaveFile endp
;***************************************************************************
end start



rsrc.rc
Код:
#include
"\masm32\include\resource.h"

#define IDC_EDIT 3000
#define IDC_BUTTON 3001
#define IDM_OPEN 32000
#define IDM_SAVE 32001
#define IDM_EXIT 32003
#define IDM_SP 32005
#define IDC_STATIC3005 3005
#define IDC_STATIC3006 3006
#define IDC_STATIC3007 3007
#define IDC_STATIC3009 3009
#define IDM_CLEAR 32007
#define IDC_BCDE 3003
#define IDC_Y 3004
#define IDC_PROG 3008

MyMenu MENUEX DISCARDABLE
BEGIN
POP UP "Файл"
BEGIN
MENUITEM "Открыть",IDM_OPEN
MENUITEM "Сохранить",IDM_SAVE
MENUITEM " ", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "Очистить",IDM_CLEAR
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "Выход",IDM_EXIT
END
POPUP "Справка",32004
BEGIN
MENUITEM "О программе",IDM_SP
END
END

MyDialog DIALOGEX 10,10,186,121
CAPTION "СПО"
FONT 0,""
MENU MyMenu
CLASS "DLGCLASS"
STYLE 0x10ca0884
EXSTYLE 0x00000000
BEGIN
CONTROL "",IDC_EDIT,"Edit",0x10010080,75,5,53,13,0x00000200
CONTROL "Выполнить",IDC_BUTTON,"Button",0x10000001,130,5,46,13,0x00000000
CONTROL "",IDC_BCDE,"Edit",0x50b10084,8,53,81,61,0x00000200
CONTROL "",IDC_Y,"Edit",0x50b100c4,103,53,76,61,0x00000200
CONTROL "Переменные b, c, d, e",IDC_STATIC3005,"Static",0x50000000,10,38,78,11,0x00000000
CONTROL "Y=",IDC_STATIC3006,"Stat ic",0x50000000,108,38,8,13,0x00000000
CONTROL "Переменная а",IDC_STATIC3007,"Static",0x50000000,10,5,51,11,0x00000000
CONTROL "",IDC_PROG,"Edit",0x50010080,123,20,53,13,0x00000200
CONTROL "Количество прогонов",IDC_STATIC3009,"Static",0x50000000,10,20,91,11,0x00000000
END

Отправлен: 04.12.2010, 09:19
Вопрос задал: Александр (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Александр!
Вот Вам подправленная программа.
Удачи!
Код:
.486
.model flat,stdcall ;модель памяти и соглашение о вызове параметров
option casemap:none



include \masm32\include\windows.inc
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\Comctl32.inc
include \masm32\include\comdlg32.inc
include \masm32\include\shell32.inc
include \masm32\include\oleaut32.inc
include \masm32\include\msvcrt.inc
include \masm32\macros\macros.asm

;***** ****************** подключаю библиотеки*************************************************
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\Comctl32.lib
includelib \masm32\lib\comdlg32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\oleaut32.lib
includelib \masm32\lib\msvcrt.lib

;************************Прототипы функций*****************************************************
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
GetFileName PROTO :DWORD,:DWORD,:DWORD,:DWORD
SaveFile PROTO :DWORD
function PROTO
;***********************************************************************
.data ;переменные со значениями
ClassName db 'DLGCLASS',0
MenuName db 'MyMenu',0
szDisplayName db 'Курсовая по СПО',0
TheTextExit db 'Выход из программы',0
szFilterTXT db 'Текстов ые Файлы (*.txt)',0,'*.txt',0,0 ;фильтр для выбора текстовых файлов
szTitle db 'Введите имя открываемого файла',0 ;заголовок для диалога выбора файлов
szTitleSave db 'Введите имя сохраняемого файла',0 ;заголовок для диалога выбора файлов
szMessage db 'Файл изменен, сохранить?',0 ;сообщение, когда было изменение
szDefault db 'default.txt',0 ;имя файла по-умолчанию
;форматы
sFormat db 'a = %d',0dh,0ah ;строка формата для вывода значений
db 'step = %d%',0dh,0ah ; всех параметров в окно параметров
db 'count = %d',0dh,0ah
db 'b = %d',0dh,0ah
db 'c = %d',0dh,0ah
db 'd = %d',0dh,0ah
db 'e = %d',0
sErrorFormat db 'Error!!!',0dh,0ah ;строка формата для вывода ошибки
db 'b = %d',0dh,0ah ; в окно параметров
db 'd = %d',0dh,0ah ; (должно быть b!=0, d!=0, e!=0,
db 'e = %d',0 ; иначе будет деление на 0)
sFormatY db 'a = %d, Y = %d',0dh,0ah,0 ;строка формата для вывода в окно результата
;строки с именами параметров в файле параметров
sA db 'a',0
sStep db 'step',0
sCount db 'count',0
sB db 'b',0
sC db 'c',0
sD db 'd',0
sE db 'e',0
sParms db 'parms',0 ;имя секции
fMode dd 0 ;флаг режима:
; 0-ничего не ведено
; 1-введены данные
; 2-произведен расчет
;************************************************************************
.data? ;переменные без значений
varA dd ?
step dd ?
count dd ?
varB dd ?
varC dd ?
varD dd ?
varE dd ?
hInstance HINSTANCE ?
CommandLine LPSTR ?
buffer db 512 dup(?)
hMemDC dd ? ;описатель совместимого контекста устройства (DC)
szNameTXT db 256 dup (?) ;для хранения текущего имени txt-файла
;******************* *****************************************************
.const ;константы
IDC_BUTTON equ 3001
IDC_BCDE equ 3003
IDC_Y equ 30 04
IDM_OPEN equ 32000
IDM_SAVE equ 32001
IDM_EXIT equ 32003
IDM_CLEAR equ 32007
IDM_SP equ 32005
MYDIALOG equ 100
MyMenu equ 200

;*************************************************************************
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine,eax
invoke WinMain, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
invoke ExitProcess, eax
;**************************************************************************
WinMain proc hInst:HINSTANCE, hPrevInst:HINSTANCE, CmdLine:LPSTR, CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hDlg:HWND
mov wc.cbSize, SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra, NULL
mov wc.cbWndExtra, DLGWINDOWEXTRA
push hInst
pop wc.hInstance
mov wc.hbrBackground, COLOR_BTNFACE+1
mov wc.lpszMenuName, MyMenu
mov wc.lps zClassName, OFFSET ClassName
invoke LoadIcon, NULL, IDI_APPLICATION
mov wc.hIcon, eax
mov wc.hIconSm, eax
invoke LoadCursor, NULL, IDC_ARROW
mov wc.hCursor, eax
invoke RegisterClassEx, addr wc
invoke CreateDialogParam, hInstance, MYDIALOG, NULL, NULL, NULL
mov hDlg,eax
invoke GetDlgItem, hDlg, IDC_BUTTON
invoke SetFocus, eax
INVOKE ShowWindow, hDlg, SW_SHOWNORMAL
INVOKE UpdateWindow, hDlg
.WHILE TRUE
INVOKE GetMessage, ADDR msg, NULL, 0, 0
.BREAK .IF (!eax)
invoke IsDialogMessage, hDlg, ADDR msg
.if eax==FALSE
INVOKE TranslateMessage, ADDR msg
INVOKE DispatchMessage, ADDR msg
.endif
.ENDW
mov eax,msg.wParam
ret
WinMain endp
;***************************************************************************
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL fname:DWORD
.if uMsg==WM_DESTROY
invoke PostQuitMessage,NULL

.ELSEIF uMsg==WM_C OMMAND
mov eax,wParam
.IF ax==IDM_OPEN

;*******Читаем параметры из файла********************************************
;используем функцию GetPrivateProfileInt с параметрами:
;1) имя секции в файле
;2) адрес имени параметра
;3) значение по-умолчанию, если параметр не будет найден
;4) адрес имени файла
;возвращает целое - значение параметра
invoke GetFileName, offset szNameTXT, offset szFilterTXT, GetOpenFileName, offset szTitle
.if eax != 0
mov varA, rv(GetPrivateProfileInt,addr sParms,addr sA,0,addr szNameTXT)
mov step, rv(GetPrivateProfileInt,addr sParms,addr sStep,1,addr szNameTXT)
mov count, rv(GetPrivateProfileInt,addr sParms,addr sCount,1,addr szNameTXT)
mov varB, rv(GetPrivateProfileInt,addr sParms,addr sB,0,addr szNameTXT)
mov varC, rv(GetPrivateProfileInt,addr sParms,addr sC,0,addr szNameTXT)
mov varD, rv(GetPrivateProfileInt,addr sParms,addr sD,0,addr szNameTXT)
mov varE, r v(GetPrivateProfileInt,addr sParms,addr sE,0,addr szNameTXT)
;проверим корректность параметров (чтобы не возникло деления на 0!)
mov eax, varE
or eax, varD
or eax, varB
.if eax !=0
mov fMode, 1
invoke wsprintf, addr buffer, addr sFormat, varA, \
step, count, varB, varC, varD, varE
.else
mov fMode, 0
invoke wsprintf, addr buffer, addr sErrorFormat, \
varB, varD, varE
.endif
;получим описатель Edit-а на странице диалога
invoke GetDlgItem, hWnd, IDC_BCDE
;и выведем в него введенные параметры
invoke SetWindowText, eax, addr buffer
.endif

;*****************Сохраняю в файл*******************************************
.ELSEIF ax==IDM_SAVE
.if fMode==2 ;сохраняем, только если был расчет
invoke SaveFile, hWnd
.endif

;*****************Очищаю Edit***********************************************
.ELSEIF ax==IDM_CLEAR
invoke SetDlgItemText,hWnd,IDC_BCDE,NULL
invoke SetDlgItemText,hWnd,IDC_Y,NULL
mov fMode, 0

;********** *****************************************************************
.ELSEIF ax==IDM_SP
ShellAboutBox hWnd,NULL,\
"СПО: Проект",\
NULL
.ELSEIF ax==IDM_EXIT
invoke MessageBox,hWnd,ADDR TheTextExit,ADDR szDisplayName,MB_YESNO
.if eax == IDNO
return 0
.endif
invoke DestroyWindow,hWnd
;*******************************Обработчик нажатия кнопки "выполнить"***********************
.ELSEIF ax==IDC_BUTTON
.if fMode==1
.if count!=0 ;при нулевом счетчике мы просто ничего не делаем
mov eax, 32
mul count ;резервируем 32 байт на каждую строку
mov esi, rv(GlobalAlloc, GMEM_FIXED, eax) ;esi - адрес памяти
mov byte ptr [esi],0;в начале пустая строка
mov ecx, count ;количество расчетов
push esi ;сохраним адрес начала
calc_loop: ;цикл формирования строки со всеми значениями
push ecx
mov ebx, r v(lstrlen, esi);длина ранее сформированной строки
add ebx, esi ;ebx - адрес, куда добавляем новую строку
invoke function ;считаем eax = Y
invoke wsprintf, ebx, addr sFormatY, varA, eax ;добавим подстроку со значениями
mov eax, step
add varA, eax ;инкремент параметра A
pop ecx
loop calc_loop
invoke GetDlgItem, hWnd, IDC_Y ;описатель окна редактора
pop esi ;адрес сформированной строки
invoke SetWindowText, eax, esi ;отправим в редактор "Y="
invoke GlobalFree, esi ;освободим память
mov fMode, 2 ;пометим, что расчет сделан
.endif
.endif
.ENDIF
.ELSE
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
;***************************************************************************
GetFileName proc uses edi, pFName:dword, \ ;имя текущего файла
pFilter:dword, \ ;фильтр
fun:dword, \ ;функция, которая вызывается
pTitle:dword ;заголовок диалога
LOCAL ofn:OPENFILENAMEA

STRING szCurrPath,"." ;начальный путь - текущая папка

lea edi, ofn
mov ecx, (size OPENFILENAMEA) / 4
xor eax, eax
rep stosd
lea eax, [ofn]
mov [(OPENFILENAMEA ptr [eax]).lStructSize], size OPENFILENAMEA
m2m [(OPENFILENAMEA ptr [eax]).lpstrFile], pFName ;имя текущего файла
mov [(OPENFILENAMEA ptr [eax]).nMaxFile], 256 ;его макс длина
m2m [(OPENFILENAMEA ptr [eax]).lpstrFilter], pFilter ;фильтр
m2m [(OPENFILENAMEA ptr [eax]).lpstrTitle], pTitle ;заголовок диалога
mov [(OPENFILENAMEA ptr [eax]).lpstrInitialDir], offset szCurrPath ;текущий путь
mov [(OPENFILENAMEA ptr [eax]).Flags], OFN_PATHMUSTEXIST or OFN_FILEMUSTEXIST or OFN_HIDEREADONLY

push eax ;параметр - адрес структуры
mov eax, [fun] ;адрес функции
call dword ptr eax ;вызываем
ret
GetFileName endp
;** *************************************************************************
;сохранение файла
SaveFile proc uses edi esi ebx, hwnd:DWORD
local dwHiLen:dword ;для старшего dword-а длины
;запросим имя TXT-файла
;проверим, было ли введено имя файла
.if [szNameTXT] == 0 ;первый байт == 0?
lea edi, [szDefault] ;если да, то берем имя файла по-умолчанию
.else
lea edi, [szNameTXT]
.endif
;ждем имя файла для записи
invoke GetFileName,edi,offset szFilterTXT,GetSaveFileName,offset szTitleSave
;что-то ввели?
.if eax != 0
push edi ;сохраним имя файла
;получим описатель Edit-а на странице диалога
mov edi, rv(GetDlgItem, hwnd, IDC_Y) ;edi - описатель окна редактора
mov ebx, rv(GetWindowTextLength, edi) ;ebx - длина содержимого
inc ebx ;учтем завершающий 0
mov esi, rv(GlobalAlloc, GMEM_FIXED, ebx) ;esi - адрес памяти под данные

invoke GetWindowText, edi, esi, ebx ;получим данные
pop edi ;edi - имя файла
;создаем файл на запись со сбросом в 0, если он уже был
mov edi, rv(CreateFile,edi,GENERIC_WRITE,0,0,CREATE_ALWAY S,FILE_ATTRIBUTE_NORMAL,0)
;в edi - описатель открытого файла
dec ebx ;последний 0 не пишем
;пишем файл
invoke WriteFile, edi, esi, ebx, ADDR dwHiLen, 0

invoke CloseHandle, edi ;закрываем файл
invoke GlobalFree, esi ;освобождаем память
mov fMode, 0 ;сбросим флаг изменения
.ENDIF
ret
SaveFile endp
;***************************************************************************
function proc ;расчет по формуле Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e)
mov eax, varE ;e
imul varC ;e*c
idiv varD ;e*c/d
neg eax ;-e*c/d
add eax, varA ;-e*c/d + a
add eax, varB ;-e*c/d + a + b
mov ecx, eax ;ecx = a + b - e*c/d

mov eax, varA ;a
imul varE ;e*a
idiv varB ;e*a/b
neg eax ;-e*a/b
add eax, varB ;-e*a/b + b
add eax, varC ;-e*a/b + b + c
add ecx, eax ;ecx = (a + b - e*c/d) + (b + c - a*e/b)

mov eax, varD ;d
cdq
idiv varE ;d/e
neg eax ;-d/e
add eax , varC ;-d/e + c
add ecx, eax ;ecx = (a + b - e*c/d) + (b + c - a*e/b) - d/e + c
mov eax, varA ;a
imul varB ;a*b
add eax, ecx ;eax = (a + b - e*c/d) + (b + c - a*e/b) - d/e + c + a*b
ret
function endp

end start

Подправленный rsrc.rc
Код:
#include "\masm32\include\resource.h"

LANGUAGE 0x19, 0x01
#pragma code_page(1251)

#define IDC_BUTTON 3001
#define IDM_OPEN 32000
#define IDM_SAVE 32001
#define IDM_EXIT 32003
#define IDM_SP 32005
#define IDM_CLEAR 32007
#define IDC_STATIC -1
#define IDC_BCDE 3003
#define IDC_Y 3004
#define MYDIALOG 100
#define MyMenu 200

MyMenu MENUEX DISCARDABLE
BEGIN
POPUP "Файл"
BEGIN
MENUITEM "Открыть",IDM_OPEN
MENUITEM "Сохранить",IDM_SAVE
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "Очистить",IDM_CLEAR
MENUITEM "", , 0x0800 /*MFT_SEPARATOR*/
MENUITEM "Выход",IDM_EXIT
END
POPUP "Справка"
BEGIN
MENUITEM "О программе",IDM_SP
END
END

MYDIALOG DIALOGEX 10, 10, 186, 121
STYLE DS_MODALFRAME | DS_CENTER | DS_3DLOOK | WS_VISIBLE | WS_CAPTION | WS_MINIMIZEBOX | WS_SYSMENU
CAPTION "СПО"
CLASS "DLGCLASS"
MENU MyMenu
BEGIN
EDITTEXT IDC_BCDE, 8, 25, 81, 88, ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY |
ES_LEFT | WS_VSCROLL | WS_HSCROLL | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
EDITTEXT IDC_Y, 103, 25, 76, 88, ES_MULTILINE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_READONLY |
ES_LEFT | WS_VSCROLL | W S_HSCROLL | NOT WS_TABSTOP, WS_EX_CLIENTEDGE
DEFPUSHBUTTON "Выполнить",IDC_BUTTON,133, 5, 46, 13, BS_CENTER | BS_VCENTER
LTEXT "Переменные a,b,c,d,e",IDC_STATIC, 10, 14, 78, 9, NOT WS_GROUP
LTEXT "Y=",IDC_STATIC, 105, 14, 8, 9, NOT WS_GROUP
LTEXT "Y=(a+b-e/d*c)+(b+c-a*e/b)+(a*b+c-d/e)",IDC_STATIC, 8, 4, 125, 9, NOT WS_GROUP
END

Примерный файл c параметрами a.txt
Код:
[parms]
a=12
step=20
count=5
b=3
c=10
d=7
e=1

-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 06.12.2010, 13:05
Номер ответа: 264549
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 264549 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFPRO.RU, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2010.6.24 от 30.11.2010

    В избранное