Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
artem1403
15 / 11 / 7
Регистрация: 24.03.2014
Сообщений: 57
#1

Где собака зарыта? :)

02.06.2014, 14:36. Просмотров 816. Ответов 5
Метки нет (Все метки)

Добрый день!

Уважаемые форумчане, подскажите, что не так делаю.
Основная задача: Пользователь должен вручную ввести 2 числа, а зависимости от них я произвожу вычисления и выдаю результат.

Проблема: элементарно не могу считать 2 числа . Нашел пример вот Пункт "ввод целого числа", вытащил из процедуры, скомпилил (masm32), запускаю, и выдает ошибку "инструкция по адресу ... обратилась к памяти по адресу 0xffffffffffff память не может быть read"

Олли дебагером нашел, что вылетает на первом же вызове int 21h. - Как так??

Выведите пожалуйста на правильный путь

Вот код
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
.386
.model flat, stdcall
option casemap :none   ; case sensitive
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
 
;#########################################################################
.code
 
start:
        push    cx
        push    dx
        push    bx
        push    si
; В SI будет признак знака, в BX - число, CX тоже пригодится.
        xor     si, si
        xor     bx, bx
        xor     cx, cx
; Введём первый символ.
        mov     ah, 08h ;ввод без отображения на экран
 
 
        int     21h ;ВОТ ЗДЕСЬ ПАДАЕТ!!!!!!
 
 
; Здесь и только здесь может попасться минус. Если это не так,
; перейдём к обычной обработке символа.
        cmp     al, '-'
        jne     short @ii1
; Иначе установим признак знака и
        inc     si
; введём следующий символ.
@ii0:   mov     ah, 01h
        int     21h
; Если символ за '9', то ввод некорректный, прекратим этот беспредел.
@ii1:   cmp     al, 39h
        ja      short @ii2
; Переводим символ в число. Если при этом получится нечто отрицательное,
; то исходный символ перед '0', значит, ввод можно прерывать.
        sub     al, 30h
        jb      short @ii2
; Итак, в AL цифра, которую нужно приписать справа к уже имеющемуся
; в BX числу. Поместим цифру из AL в CX. Именно для этого он обнулялся.
        mov     cl, al
; Умножим текущий результат на 10.
        shl     bx, 1   ; BX = 2 * bx
        mov     ax, bx  ; AX = 2 * bx
        shl     ax, 2   ; AX = 8 * bx
        add     bx, ax  ; BX = 10 * bx
        add     bx, cx  ; BX = 10 * bx + al
; И так, пока вводят цифры.
        jmp     short @ii0
; Когда ввели нецифру, посмотрим, надо ли менять знак,
@ii2:   test    si, si
        jz      short @ii3
        neg     bx
; перейдём на новую строку
@ii3:   mov     ah, 02h
        mov     dl, 0Dh
        int     21h
        mov     dl, 0Ah
        int     21h
; и запишем результат в AX.
        mov     ax, bx
        pop     si
        pop     bx
        pop     dx
        pop     cx
end start
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2014, 14:36
Ответы с готовыми решениями:

как програма понимает где переменая, а где ее адрес
STR_BYTE_HELLO BYTE "BYTE HELLO",0 push 0FFFFFFFFh push...

где зарыта собака?
struct vector { int x; int y; int z; }; vector a, b; // functions...

не соображу, где собака зарыта?
Всем привет. Никак не соображу в чем дело... :wall: помогите разобраться! ...

Достанет собака прохожего или нет? Даны координаты точки, где находится собака, дана длина веревки, ограничивающей своб
Помогите

Где зарыта ошибка?
Хочу реализовать что бы по клику на картинку список прятался и снова появлялся....

5
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
02.06.2014, 14:54 #2
Лучший ответ Сообщение было отмечено artem1403 как решение

Решение

Цитата Сообщение от artem1403 Посмотреть сообщение
Выведите пожалуйста на правильный путь
Для винконсоли использование int 21h недопустимо. winconsole - get signed long, ввод целого знакового с отработкой удаления символа - версия для масма тоже есть.Если не нужен жёсткий контроль ввода, можно обойтись crt_scanf() из той же msvcrt.dll.
1
artem1403
15 / 11 / 7
Регистрация: 24.03.2014
Сообщений: 57
02.06.2014, 19:29  [ТС] #3
Спасибо!
По поводу поста "winconsole - get signed long, ввод целого знакового с отработкой удаления символа" - нашел код для MASM, скомпилил, получился exe-шник, запускаю... ничего не происходит
Может опять что-то не так сделал?

Пробовал перекомпилить несколько раз, точно ничего.
Пробовал запустить exe-шник через консоль - тоже ничего.

Куда вводить значение?

Заметил что процесс висит (процесс данного exe-файла), снял, скомпилил еще раз, запустил - ничего не поменялось.
0
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
02.06.2014, 19:39 #4
А вы Link'у ключик /SUBSYSTEM:CONSOLE скормили? Т.е. Link /SUBSYSTEM:CONSOLE proga.obj
1
artem1403
15 / 11 / 7
Регистрация: 24.03.2014
Сообщений: 57
02.06.2014, 22:47  [ТС] #5
Цитата Сообщение от Charles Kludge Посмотреть сообщение
Link /SUBSYSTEM:CONSOLE proga.obj
Пробовал такую команду (конечно с указанием собственного файла) запускать в консоли - ничего не вышло, говорит "Link не является внешней командой".

Зато нашел просто кладезь информации пока шарился по файлам masm-а.
нашел пример, где вводится к клавиатуры число, и сравнивается с 100, и выводится сообщение больше/меньше/равно наше число.

Спасибо большое за помощь!

Добавлено через 1 час 32 минуты
Но вот беда, компилируется приложение, но оно тоже вообще без консольного окна запускается-закрывается

Добавлено через 2 минуты
О чудо!
Свет знаний снизошел до меня!
Я сделал вот такой батник, в котором и указал компилятору какой тип приложения меня интересует, и все заработало!
Ну конечно не совсем все, но по крайней мере уже открывается консоль, и прога просит меня ввести число

Вот батник:

Впишите свое название файла
;======[CUT HERE]=====
с:\masm32\bin\ml.exe /c /coff current.asm
с:\masm32\bin\link.exe /subsystem:console current.obj
pause
;=======[CUT HERE]========

Добавлено через 5 минут
Кому надо выкладываю свою пустую заготовку (без расчетов) под названием
"Как ввести числа с клавиатуры MASM"
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    .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
 
    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 N, input("Press any key...")
 
    ret
main endp
 
; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««
 
end start                       ; Tell MASM where the program ends
0
Charles Kludge
Клюг
7641 / 3156 / 382
Регистрация: 03.05.2011
Сообщений: 8,382
02.06.2014, 22:54 #6
Цитата Сообщение от artem1403 Посмотреть сообщение
Свет знаний снизошел до меня!
У меня всё вбито одной строкой в FAR'е:
ml -c crt_cgetl.asm && wlink fi crt_cgetl.obj (имя файла подставляется автомагически). К тому же не люблю мелкомягкие продукты.
0
02.06.2014, 22:54
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.06.2014, 22:54

Не могу найти где зарыта ошибка
При вводе буквы вылазит следующее: -8500000 (дофига цифр). Когда ввожу цифры,...

Где собака порылась? VB и DBF.
Я новичок в VB. Нужно создать DBF файл и добавить туда записи. Создать не...

Не работает простейший SQL запрос. Где собака?
Подключаюсь через ADO к таблице Excel Запрос select * from where...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru