Пытаюсь вывести число, выдает ошибку (память не может быть "written") MASM - Assembler
Формулировка задачи:
Доброго времени суток!, помогите поправить код, чтобы вывести значение.
(объявлять пробовал с разными размерами)
После вычислений в сопроцессоре, получаю значение вот такой командой
И вывожу на экран вот таким способом
При попытке запустить приложение вылетает ошибка:
"инструкция по адресу 0x004001000 обратилась к памяти 0x0000000000 память не может быть "written"
Пробовал объявлять переменную вот так:
так все работает, но выводит значение некорректное (-102462333, или что-то в этом роде)
Задача:
необходимо посчитать некоторую формулу и выдать результат на экран.Проблема:
как оказалось не могу вывести значение в консоль Объявляю пустую переменную,res dq ?
FST res
invoke crt_printf, ADDR res invoke crt__getch invoke crt_exit,0
Привожу весь код
.486 ; create 32 bit code .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include \masm32\include\windows.inc ; always first include \masm32\macros\macros.asm ; MASM support macros ; ----------------------------------------------------------------- ; include files that have MASM format prototypes for function calls ; ----------------------------------------------------------------- include \masm32\include\masm32.inc include \masm32\include\gdi32.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc include \masm32\include\msvcrt.inc ; ------------------------------------------------ ; Library files that have definitions for function ; exports and tested reliable prebuilt code. ; ------------------------------------------------ includelib \masm32\lib\masm32.lib includelib \masm32\lib\gdi32.lib includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\msvcrt.lib .code ; Tell MASM where the code starts ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« start: ; The CODE entry point to the program call main ; branch to the "main" procedure exit ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« main proc LOCAL vX:DWORD ; Числовая переменная X LOCAL vY:DWORD ; Числовая переменная Y LOCAL sY:DWORD ; Текстовая переменная Y LOCAL vZ:DWORD ; Числовая переменная Z LOCAL sZ:DWORD ; Текстовая переменная Z ;/////////////////// res dq ? ; ОБЪЯВЛЕНИЕ ТОЙ САМОЙ ПЕРЕМЕННОЙ ;/////////////////// LOCAL N:DWORD ;print str$(ecx) ; Вывести состав переменной на экран ;print chr$(13,10,13,10) ; Перевод каретки mov vY, sval(input("Enter Y : ")) print str$(vY) ; Выводим значение переменной на экран print chr$(13,10) ; Перенос строки mov vZ, sval(input("Enter Z : ")) print str$(vZ) ; Выводим значение переменной на экран print chr$(13,10) ; Перенос строки mov eax, vY cmp eax, vZ ; Сравниваем 2 введенных значения je equalOrLower ; Если У равен Z, то переходим на метку "equalOrLower" jg bigger ; Если У больше Z, то переходим на метку "bigger" jl equalOrLower ; Если У меньше Z, то переходим на метку "equalOrLower" equalOrLower: print chr$("---- Y<=Z ----",13,10) ;Приступаем к расчету значения FINIT FILD vZ FILD vY FILD vY FMUL ; Посчитали Y*Y FSUB ; Посчитали Z-Y*Y FSIN FST res print chr$("sin(z-y*y)=") ;print str$(res) ;/////////////////// invoke crt_printf, ADDR res //ВЫВОД ЗНАЧЕНИЯ НА ЭКРАН invoke crt__getch invoke crt_exit,0 ;/////////////////// jmp over bigger: print chr$("---- Y>Z ----",13,10) jmp over over: print chr$(13,10,13,10) mov N, input("Press any key...") ret main endp ; ««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««« end start ; Tell MASM where the program ends
LOCAL res:DWORD
Результат должен быть равен примерно "-0,42" и хвост
Помогите пожалуйста! Забыл добавить, если вдруг у кого заработает, то консолька просит ввести по очереди 2 числа, я для проверки вводил сначала 5, а затем 12. Спасибо еще разРешение задачи: «Пытаюсь вывести число, выдает ошибку (память не может быть "written") MASM»
textual
Листинг программы
.486 ; create 32 bit code .model flat, stdcall ; 32 bit memory model option casemap :none ; case sensitive include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\msvcrt.inc include \masm32\macros\macros.asm includelib \masm32\lib\masm32.lib includelib \masm32\lib\msvcrt.lib .data sinz db 'sin(z-y*y) = %2.7f',0 tpts db '%s',0 tptd db '%d',0 entY db 'Enter Y: ',0 entZ db 'Enter Z: ',0 YleZ db '--- Y <= Z ---',0 YgtZ db '--- Y > Z ---',0 bye db 0Dh,0Ah,'Press any key...',0 .data? vX dd ? vY dd ? vZ dd ? res dq ? .code ; Tell MASM where the code starts start: ; The CODE entry point to the program invoke crt_printf, ADDR tpts, ADDR entY invoke crt_scanf, ADDR tptd, ADDR vY invoke crt_printf, ADDR tpts, ADDR entZ invoke crt_scanf, ADDR tptd, ADDR vZ mov ebx, offset YleZ mov eax, [vZ] cmp eax, [vY] ; Сравниваем 2 введенных значения jg @F mov ebx, offset YgtZ @@: invoke crt_puts, ebx ;Приступаем к расчету значения FINIT FILD [vZ] FILD [vY] FILD [vY] FMUL ; Посчитали Y*Y FSUB ; Посчитали Z-Y*Y FSIN FSTP res ;/////////////////// invoke crt_printf, ADDR sinz, [res] ;//ВЫВОД ЗНАЧЕНИЯ НА ЭКРАН invoke crt_puts, ADDR bye invoke crt__getch invoke crt_exit,0 end start ; Tell MASM where the program ends
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д