Пытаюсь вывести число, выдает ошибку (память не может быть "written") MASM - Assembler

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

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

Доброго времени суток!, помогите поправить код, чтобы вывести значение.

Задача:

необходимо посчитать некоторую формулу и выдать результат на экран.

Проблема:

как оказалось не могу вывести значение в консоль Объявляю пустую переменную,
res dq ?
(объявлять пробовал с разными размерами) После вычислений в сопроцессоре, получаю значение вот такой командой
FST res
И вывожу на экран вот таким способом
    invoke  crt_printf, ADDR res
        invoke  crt__getch
        invoke  crt_exit,0
При попытке запустить приложение вылетает ошибка: "инструкция по адресу 0x004001000 обратилась к памяти 0x0000000000 память не может быть "written"

Привожу весь код

    .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
так все работает, но выводит значение некорректное (-102462333, или что-то в этом роде)

Результат должен быть равен примерно "-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

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

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