Консультация № 196673
13.10.2019, 22:20
0.00 руб.
0 2 1
Здравствуйте! Прошу помощи в следующем вопросе:
Ввести с клавиатуры целое число X и вычислить Y. Результат вывести на
экран. Y=((X+1)*10%3-150)/X

Вот что я написала. Подскажите пожалуйста, почему не выводит результат? Спасибо!

Код:
format PE Console 4.0
entry Start
include 'win32a.inc'
section '.text' code readable executable
Start:
cinvoke scanf, x
call [scanf] ; функция для ввода х
; умножение, деление и тд.
mov ax,[x]
inc ax
imul [L]
idiv [F]
sub ax,150
div [x]
mov [y], ax

; Вывод результата на экран
push ax
call [printf]
call [getchar]

Exit:
push 0
call [ExitProcess]

section '.data' data readable writeable

y dw ?
x dw 0
F dw 3
L dw 10

section '.idata' import data readable
library kernel, 'KERNEL32.DLL', msvcrt, 'msvcrt.dll'
import msvcrt, printf, 'printf', getchar, 'getchar', scanf, 'scanf'
import kernel, ExitProcess, 'ExitProcess'

Обсуждение

давно
Посетитель
7438
7205
14.10.2019, 12:18
общий
это ответ
Здравствуйте, Алина!
Во-первых, Вы пишете 32-битный код, какая необходимость использовать 16-битные регистры?
Во-вторых, используя 16-битную переменную х для параметра при вводе, функция все равно запишет 32-битное значение!
Т.е. в х и в следующую переменную F запишется 32-битная величина, причем в F запишется 0!!! И на которую Вы потом собираетесь делить!!!!
В-третьих, посмотрите формат функций scanf, printf. Они требуют строку формата, которой у Вас нет.
В-четвертых, в нашем случае getchar() надо вызвать два раза. Первый извлекает из потока символ 0x0a, оставленный scanf(), и тут же завершается.
Только второй будет ждать нажатия на клавишу
В-пятых, числа у нас зо знаком, поэтому надо везде использовать idiv
Еще кое-что подправил, по мелочам...
[code lang=asm]format PE Console 4.0
entry Start
include '..\..\include\win32a.inc'
section '.text' code readable executable
Start:
invoke scanf, sformat, x ; функция для ввода х
; умножение, деление и тд.
mov eax,[x]
inc eax
imul [L]
idiv [F]
sub eax,150
sbb edx,0
idiv [x]
mov [y], eax
; Вывод результата на экран
invoke printf,sformat,eax
invoke getchar
invoke getchar
invoke ExitProcess, 0

section '.data' data readable writeable
sformat db "%d",0
y dd ?
x dd 0
F dd 3
L dd 10

section '.idata' import data readable
library kernel, 'KERNEL32.DLL', msvcrt, 'msvcrt.dll'
import msvcrt, printf,'printf', getchar,'getchar', scanf,'scanf'
import kernel, ExitProcess,'ExitProcess'
[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
давно
Посетитель
403326
11
14.10.2019, 17:11
общий
Адресаты:
Добрый день!
Что-то много проколов у меня какая-то сложная логика в format pe console, потому что в dos как-то это все легче даётся))) Спасибо что подкорректировали код))) Я попробовала посчитать с помощью программы и без, результат выдает неверный (возможно я не правильно считала ) Во всяком случае пока буду разбираться заодно и подтяну теорию которую вы описали выше Спасибо вам большое!
Форма ответа