Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
dimaondmersik
3 / 3 / 1
Регистрация: 13.12.2015
Сообщений: 51
1

Передача параметров через стек. Тип процедуры – ближний

08.05.2016, 23:10. Просмотров 1088. Ответов 4
Метки нет (Все метки)

Всем привет! Есть задание: Ввести 8-битовое целое число А. Если оно четное, вычислить значение выражения А3 – 1, если нечетное – значение выражения А2. Написал для Передача параметров через регистр. Тип процедуры – дальний. А как сделать через стек? Есть идеи?
Листинг программы KR1Z1:

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
MODEL SMALL ;указание модели памяти
STACK 256    ; размер стека        
dseg segment; Начало сегмента данных
mess db 'rezultat A= $',0ah,0dh ; Само сообщение для пользователя
dseg ends;Конец сегмента данных
;==============================================================
; Сегмент кода 1                                                    
;==============================================================
cseg segment; начало кода сегмента №1
assume cs:cseg
soob proc;процедру вывода сообщения rezultat A=
mov    ah,09h    ;вывод сообщения, если нашли отрицательное число
lea    dx, mess ; сообщение nashli otricatelnoe i zamenili na null
int    21h; прирывание для вывода на экран.Вызов DOS
ret; возврат из процедуры
soob endp;конец процедуры вывода сообщения rezultat A=
start: ;метка места начала выполнения программы
mov ax,dseg; заносим данные в ах, далее
mov ds,ax; занести в ds данные ax;
call soob; вызываем процедуру сообщение Резултат А=
mov al,4; Помещаем в регистр al число, то есть А=3
test al,1; Проверяем на четность, если нечетное число то
jnz nechet ; переход на метку нечетный 
imul al; возводим число в квадрат, результат будет в ax;
imul al; возводим число в куб, результат будет в ax;
sub al,1; отнимаем от данных в А единицу то есть А вкубе минус 1  
;результат будет выводить через процедуру Vyvod;
jmp exit; если четное число то перейти на метку exit
nechet: ;метка nechet тут обрабатываем число если оно нечетное 
imul al; возвести данные в регистре в квадрат то есть А*А
; далее так как получили результат  надо будет
loop exit; перейти к метке выход
exit: ;метка выход
call far ptr vyvod; вызываем дальнею процедуру вывода числа то есть преоброзование
mov ah,4ch ;Функция 4Ch завершения программы
int 21h ;Вызов DOS
cseg ends; конец кода сегмента №1
;==============================================================
; Сегмент кода 2                                                    
;==============================================================
cseg2 segment; начало кода сегмента №2
 assume cs:cseg2
vyvod proc far; процедура обработки числа для вывода на экран
aam ;двоичное число преобразуем в неупакованное BCD число 
add ax,3030h ; преобразуем в символы ASCII
mov dl,ah; в DL старшая цифра
mov dh,al ; в DH младшая цифра
mov ah,02 ; вывод на дисплей
int 21h ;Вызов DOS
mov dl,dh 
int 21h;Вызов DOS
ret; возврат из процедуры
vyvod endp ; конец процедуры
cseg2 ends ; конец кода сегмента №1
end start ;завершаем всю программу, конец программы и указание метки начала выполнения.
программа рабочая. Выводит результат на экран. Как все это сделать через стек?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2016, 23:10
Ответы с готовыми решениями:

Передача параметров через стек
Здравствуйте . Вот есть задача решить уравнение 2*d/3*c - 6*c*d , используя внешние процедуры....

Передача параметров через стек
Здравствуйте! Подскажите как можно переменную передать через стек в качестве параметров и как...

Вызов процедуры с передачей параметров через стек
Программы различаются между собой способом передачи параметров в процедуру и типом процедуры: ...

Внешняя процедура, выполняющая сложение двух чисел (передача параметров через стек)
Помогите, пожалуйста!!!! Написать прорамму с внешней процедурой, выполняющую сложение 2 чисел с...

Перенос параметров через стек
Доброго времени суток . Даны два массива , заменить элемент массива кратный 5 на первый...

4
proc3nt
волшебник
947 / 520 / 156
Регистрация: 26.05.2012
Сообщений: 1,471
09.05.2016, 11:50 2
Лучший ответ Сообщение было отмечено dimaondmersik как решение

Решение

Цитата Сообщение от dimaondmersik Посмотреть сообщение
loop exit; перейти к метке выход
вот это здесь лишнее

Добавлено через 9 минут
Цитата Сообщение от dimaondmersik Посмотреть сообщение
mess db 'rezultat A= $',0ah,0dh
перевод строки и возврат каретки не произойдет. символ доллара должен для этого стоять в конце
Assembler
1
mess db 'rezultat A= ',0ah,0dh,'$'
Добавлено через 28 минут
Цитата Сообщение от dimaondmersik Посмотреть сообщение
imul al; возводим число в квадрат, результат будет в ax
imul al; возводим число в куб, результат будет в ax
таким способом получится четвертая степень числа, а не третья
Assembler
1
2
3
mov cl,al
imul cl      ;возводим число в квадрат, результат будет в ax
imul cl      ;возводим число в куб, результат будет в ax
Добавлено через 2 минуты
Цитата Сообщение от dimaondmersik Посмотреть сообщение
sub al,1; отнимаем от данных в А единицу то есть А вкубе минус 1
и тогда желательно
Assembler
1
sub ax, 1
Добавлено через 27 минут
Цитата Сообщение от dimaondmersik Посмотреть сообщение
А как сделать через стек?
перед вызовом процедуры нужно поместить передаваемый ей параметр (результат вычисления выражения) в стек
Assembler
1
2
push ax
call far ptr vyvod
Добавлено через 3 минуты
в самой процедуре обращаться к принятому ей аргументу с помощью регистра bp
[bp+6] переданный параметр
[bp+4] сегмент возврата
[bp+2] смещение возврата
[bp+0] значение регистра bp
Assembler
1
2
3
push bp
mov bp,sp
mov ax,[bp+6]
Добавлено через 1 минуту
Цитата Сообщение от dimaondmersik Посмотреть сообщение
ret
не забываем про удаление параметра из стека при выходе из процедуры
Assembler
1
ret 2
Добавлено через 9 часов 40 минут
Цитата Сообщение от dimaondmersik Посмотреть сообщение
call far ptr vyvod
Цитата Сообщение от dimaondmersik Посмотреть сообщение
vyvod proc far
если тип процедуры - ближний, то всю процедуру нужно переместить из сегмента кода cseg2 в сегмент cseg. значение атрибута расстояния при вызове процедуры и при ее описании поменять с far на near. при передаче управления ближней процедуре сегмент возврата не помещается в стек. таким образом внутри тела процедуры обращаться к стеку с помощью регистра bp можно будет так
[bp+4] переданный параметр
[bp+2] смещение возврата
[bp+0] значение регистра bp
1
dimaondmersik
3 / 3 / 1
Регистрация: 13.12.2015
Сообщений: 51
09.05.2016, 13:14  [ТС] 3
Спасибо. Буду пробовать. Отпишусь. Посмотрим что получиться.

Добавлено через 1 час 13 минут
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
MODEL SMALL ;указание модели памяти
STACK 256    ; размер стека        
dseg segment; Начало сегмента данных
mess db 'rezultat A= ',0ah,0dh,'$'; Само сообщение для пользователя
dseg ends;Конец сегмента данных
;====================================================================
; Сегмент кода 1                                                    =
;====================================================================
cseg segment; начало кода сегмента №1
assume cs:cseg
soob proc;процедру вывода сообщения rezultat A=
mov    ah,09h    ;вывод сообщения, если нашли отрицательное число
lea    dx, mess ; сообщение nashli otricatelnoe i zamenili na null
int    21h; прирывание для вывода на экран.Вызов DOS
ret; возврат из процедуры
soob endp;конец процедуры вывода сообщения rezultat A=
vyvod proc; процедура обработки числа для вывода на экран
push bp
mov bp,sp
mov ax,[bp+4]
aam ;двоичное число преобразуем в неупакованное BCD число 
add ax,3030h ; преобразуем в символы ASCII
mov dl,ah; в DL старшая цифра
mov dh,al ; в DH младшая цифра
mov ah,02 ; вывод на дисплей
int 21h ;Вызов DOS
mov dl,dh 
int 21h;Вызов DOS
ret 2; возврат из процедуры
vyvod endp ; конец процедуры
start: ;метка места начала выполнения программы
mov ax,dseg; заносим данные в ах, далее
mov ds,ax; занести в ds данные ax;
call soob; вызываем процедуру сообщение Резултат А=
mov al,2; Помещаем в регистр al число, то есть А=2
test al,1; Проверяем на четность, если нечетное число то
jnz nechet ; переход на метку нечетный 
mov cl,al; запишем данные с регистра AL в регистр cl для возведения в степень;
imul cl;возводим число в квадрат, результат будет в ax
imul cl;возводим число в куб, результат будет в ax
sub ax,1; отнимаем от данных в А единицу то есть А вкубе минус 1  
;результат будет выводить через процедуру Vyvod;
jmp exit; если четное число то перейти на метку exit
nechet: ;метка nechet тут обрабатываем число если оно нечетное 
imul al; возвести данные в регистре в квадрат то есть А*А
; далее так как получили результат  надо будет
exit: ;метка выход
push ax; перед вызовом процедуры нужно поместить передаваемый ей параметр (результат вычисления выражения) в стек
call vyvod; вызываем дальнею процедуру вывода числа то есть преобразование
mov ah,4ch ;Функция 4Ch завершения программы
int 21h ;Вызов DOS
cseg ends; конец кода сегмента №1
end start ;завершаем всю программу, конец программы и указание метки начала выполнения
Выдает ошибку( процессор NTVDM ОБНАРУЖИЛ НЕДОПУСТИМУЮ ИНСТРУКЦИЮ). Программа компилируется. И не понятно правильно ли сделал через стек (ближняя процедура) Передача параметров через стек. Тип процедуры – ближний.
0
proc3nt
волшебник
947 / 520 / 156
Регистрация: 26.05.2012
Сообщений: 1,471
09.05.2016, 13:42 4
Лучший ответ Сообщение было отмечено dimaondmersik как решение

Решение

перед выходом из процедуры добавь
Assembler
1
pop bp
1
dimaondmersik
3 / 3 / 1
Регистрация: 13.12.2015
Сообщений: 51
09.05.2016, 15:38  [ТС] 5
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
MODEL SMALL ;указание модели памяти
STACK 256    ; размер стека        
dseg segment; Начало сегмента данных
mess db 'rezultat A= ',0ah,0dh,'$'; Само сообщение для пользователя
dseg ends;Конец сегмента данных
;====================================================================
; Сегмент кода 1                                                    =
;====================================================================
cseg segment; начало кода сегмента №1
assume cs:cseg
soob proc;процедру вывода сообщения rezultat A=
mov    ah,09h    ;вывод сообщения, если нашли отрицательное число
lea    dx, mess ; сообщение nashli otricatelnoe i zamenili na null
int    21h; прирывание для вывода на экран.Вызов DOS
ret; возврат из процедуры
soob endp;конец процедуры вывода сообщения rezultat A=
vyvod proc; процедура обработки числа для вывода на экран
push bp
mov bp,sp
mov ax,[bp+4]
pop bp
aam ;двоичное число преобразуем в неупакованное BCD число 
add ax,3030h ; преобразуем в символы ASCII
mov dl,ah; в DL старшая цифра
mov dh,al ; в DH младшая цифра
mov ah,02 ; вывод на дисплей
int 21h ;Вызов DOS
mov dl,dh 
int 21h;Вызов DOS
ret 2; возврат из процедуры
vyvod endp ; конец процедуры
start: ;метка места начала выполнения программы
mov ax,dseg; заносим данные в ах, далее
mov ds,ax; занести в ds данные ax;
call soob; вызываем процедуру сообщение Резултат А=
mov al,4; Помещаем в регистр al число, то есть А=2
test al,1; Проверяем на четность, если нечетное число то
jnz nechet ; переход на метку нечетный 
mov cl,al; запишем данные с регистра AL в регистр cl для возведения в степень;
imul cl;возводим число в квадрат, результат будет в ax
imul cl;возводим число в куб, результат будет в ax
sub ax,1; отнимаем от данных в А единицу то есть А вкубе минус 1  
;результат будет выводить через процедуру Vyvod;
jmp exit; если четное число то перейти на метку exit
nechet: ;метка nechet тут обрабатываем число если оно нечетное 
imul al; возвести данные в регистре в квадрат то есть А*А
; далее так как получили результат  надо будет
exit: ;метка выход
push ax; перед вызовом процедуры нужно поместить передаваемый ей параметр (результат вычисления выражения) в стек
call vyvod; вызываем дальнею процедуру вывода числа то есть преобразование
mov ah,4ch ;Функция 4Ch завершения программы
int 21h ;Вызов DOS
cseg ends; конец кода сегмента №1
end start ;завершаем всю программу, конец программы и указание метки начала выполнения
СПАСИБО ЗА ПОМОЩЬ!!! ВСЕ РАБОТАЕТ!!! РЕЗУЛЬТАТ ВЫВОДИТ НА ЭКРАН. ЕСЛИ МЕНЯЕШЬ В AL ЧИСЛО ТО ПРОГА ВЕРНО ВСЕ ВИДИТ ЧЕТНОЕ ОНО ИЛИ НЕТ. Proc3nt спасибо "наставил на путь истинный!"
0
09.05.2016, 15:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2016, 15:38

Реализовать передачу параметров через стек по ссылки в подпрограмму
Разобрался с сутью задания есть три модуля главный, подпрограмма ввода и вывода чисел в десятичной...

Передача через стек параметры в процедуру
Пытаюсь реализовать первое действие. Точнее проверить его. Реализовать в процедуре действие...

Передача параметров через регистры процесора
Написать программу используя подпрограмму-(программа изменяет все буквы на большие)!!!Передача...


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

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

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