Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
What? Where? Why?
106 / 106 / 32
Регистрация: 16.10.2012
Сообщений: 459
1

Вызов процедуры из модуля

12.10.2013, 01:39. Показов 3535. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется код основной программы:
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
.586 ;подключение набора команд Pentium
.MODEL flat, stdcall ;модель памяти и конвенция о передаче параметров 
OPTION CASEMAP:NONE ;опция различия строчных и прописных букв
 
Include kernel32.inc ; подключение описаний процедур и
Include masm32.inc ; констант
IncludeLib kernel32.lib ; подключение библиотек
IncludeLib masm32.lib
 
.CONST ; начало раздела констант
    MsgExit DB "Press Enter to Exit",0AH,0DH,0
    ErrorTxt DB "Error!", 0AH, 0DH, 0
    
.DATA ;раздел инициализированных переменных
    IncorrectWord DW 5BEFh ;23535
    CorrectWord DW 0AD7h ;2775
 
 
.DATA? ;раздел неинициализированных переменных
    inbuf DW 100 DUP (?)
    ResultStr DW 5 DUP (?)
 
.CODE ; начало сегмента кода
Start:
    push WORD PTR ResultStr
    push CorrectWord
    call OutInt
    
    TEST AX, AX
    JZ no_error
    Invoke StdOut,ADDR ErrorTxt
    jmp Exit
    
    
    no_error:
        Invoke StdOut,ADDR ResultStr
    Exit:   
        Invoke StdOut,ADDR MsgExit ; вывод сообщения
        Invoke StdIn,ADDR inbuf,LengthOf inbuf ; ввод строки
        Invoke ExitProcess,0 ; завершение программы
 End Start ; конец модуля
А также процедура в отдельном файле OutInt.asm
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
public OutInt
OutInt proc FAR
    ;pusha ;????
    pop ax ;наше исходное число в 16-ричной сс
    cmp ax,0270h ;9999
    ja Error
    pop di ;адрес выходной строки
    
    xor cx, cx
    mov bx, 16
oi2:
    xor dx,dx
    div bx
    push dx
    inc cx
    test ax, ax
    jnz oi2
    ;Вывод
oi3:
    xor ax,ax
    pop ax
    stosb ;положить байт в ES:[DI] и DI++
    loop oi3
    add ah, '0'
    stosb
    mov ah, 0
    jmp Exit
Error:
    mov ah, 1
Exit:
    ret
 
OutInt endp
Код пишу в RadASM, синтаксис masm'а. Проблема в том, что никак не могу подключить эту самую процедуру к основной программе. Пробовал писать extern OutInt:FAR, но это не дало результата.
А еще вопрос в том, что по заданию нужно, чтобы в процедуру параметры передавались через стек, но и процедура при входе в нее должна сохранять все регистры. И возникает еще один вопрос, если в начале процедуры сделать pusha, то каким образом доставать из стека параметры переданные ей?

Добавлено через 1 час 10 минут
Может не совсем верно, но пока сделал так
Assembler
1
Include OutInt.asm
Проект запустился, но упал, но это уже по причине какой-то ошибки в коде уже самой процедуры.
Оставил вот так:
Assembler
1
2
3
4
5
6
7
8
public OutInt
OutInt1 segment
OutInt proc FAR
    mov ax, 1
    ret
 
OutInt endp
OutInt1 ends
Вроде бы всё работает.

Однако вопрос про передачу данных в процедуру через стек и в тоже время сохранение всех регистров остается в силе.

Добавлено через 27 минут
pusha и popa всё же необходимы, что собственно логично, т.к. нам нужно знать, куда возвращаться.
Но как тогда понять смысл задания?
"Передача параметров во вспомогательную процедуру организуется через стек. Все необходимые вспомогательной процедуре переменные должны быть организованы как локальные и размещены в стеке. Вспомогательная процедура использует стек главной процедуры и не имеет собственного сегмента данных"

Добавлено через 1 час 22 минуты
Проблема решена
В контексте данной лабы решение нашлось ручным смещением относительно стека.
Надеюсь в реальных программах передача параметров в процедуры осуществляется иным способом)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.10.2013, 01:39
Ответы с готовыми решениями:

Вызов ассемблерной процедуры в программе на Си
Задание: В си-программе ввести матрицу 5х6 чисел(где каждая ячейка матрицы представляет строку...

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

Вызов процедуры после вызова макроса
Подскажите, как исправить следующую ошибку. Вызываю процедуру Execute для обработки данных. В...

Вызов процедуры из модуля
Подскажите, плз, как правильно написать код: имеется форма с кнопкой, по нажатию которой...

4
Ушел с форума
Автор FAQ
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
12.10.2013, 03:40 2
Exception,
проблема в том, что для Windows-программы ты вызываешь far-процедуру, а в MODEL flat процедуры должны быть типа near, кроме того не понятно для чего в программе для Windows используются 16-разрядные регистры, при такой передаче
Assembler
1
2
3
OutInt proc FAR
    ;pusha ;????
    pop ax ;наше исходное число в 16-ричной сс
ты получаешь не "исходное число в 16-ричной сс", а уничтожаешь адрес возврата из процедуры, посмотри в FAQ, там расписана работа с процедурой и ее параметрами
1
What? Where? Why?
106 / 106 / 32
Регистрация: 16.10.2012
Сообщений: 459
12.10.2013, 03:59  [ТС] 3
А каким образом можно сделать, чтобы метки с одинаковыми именами в основной программе и в модуле считались всё-таки различными?)
0
Ушел с форума
Автор FAQ
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
12.10.2013, 04:14 4
Exception,
MASM (а ты пишешь на MASM'e) считает метки внутри процедуры локальными, посмотри, я уже отвечал в Локальные метки
1
What? Where? Why?
106 / 106 / 32
Регистрация: 16.10.2012
Сообщений: 459
12.10.2013, 13:28  [ТС] 5
Mikl___, Локальными? Однако пока я не изменил имя метки "Exit" в процедуре, то в итоге jmp по метке Exit в процедуре прыгал на Exit в основной программе.
0
12.10.2013, 13:28
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.10.2013, 13:28
Помогаю со студенческими работами здесь

Вызов процедуры из модуля
Всем привет! Пишу на Лазарусе недавно и есть вопрос: У меня есть форма (на ней размещаются...

Вызов процедуры из другого модуля
Подскажите, что я сделал не так, хочу вынести подпрограммы в отдельный модуль, но как-то не...

Вызов процедуры формы из модуля
Всем привет! Подскажите, как процедуру, объявленную в форме State как Public Sub...

Вызов процедуры из другого модуля
Помогите пожалуйста, нужно вызвать свою процедуру из другого модуля, что надо для этого написать в...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru