Консультация № 185866
20.04.2012, 23:18
92.49 руб.
0 1 1
Здравствуйте, уважаемые эксперты! Прошу вас помочь со следующим заданием.
1.Организация стековой памяти. Разработать программу с вызовом внутрисегментной команды CALL и RET ;
2.Организация стековой памяти. Разработать программу с вызовом межсегментной команды CALL и RET ;
3.Организация стековой памяти. Разработать программу вложенными вызовами внутрисегментных и межсегментных команд CALL и RET.
Благодарю, если сможете помочь.

Обсуждение

давно
Посетитель
7438
7205
21.04.2012, 03:35
общий
это ответ
Здравствуйте, Наталия!
1.Организация стековой памяти.
Разработать программу с вызовом внутрисегментной команды CALL и RET ;

При внутрисегментном вызове в стек заносится смещение следующей команды.
Сегментный регистр CS не меняется
По внутрисегментной команде ret извлекается из стека адрес, куда и передается управление
[code h=200]_stack segment 'stack'
dw 100h dup(?)
_stack ends

code segment 'code'
assume cs:code
start:
mov ax, 5
call square

mov ax, 4c00h
int 21h

square proc
mul ax
ret
square endp

code ends

end start[/code]
2.Организация стековой памяти.
Разработать программу с вызовом межсегментной команды CALL и RET ;

При межсегментном вызове в стек заносится сначала сегмент текущего кода,
затем смещение следующей команды.
После чего происходит длинный вызов подпрограммы
По межсегментной команде ret из стека извлекаются и смещение и сегмент,
т.о. происходит длинный возврат в точку вызова
[code h=200]_stack segment 'stack'
dw 100h dup(?)
_stack ends

code1 segment 'code'
assume cs:code1
start:
mov ax, 5
call square

mov ax, 4c00h
int 21h
code1 ends

code2 segment 'code'
assume cs:code2
square proc far
mul ax
ret
square endp
code2 ends

end start[/code]

3.Организация стековой памяти.
Разработать программу вложенными вызовами внутрисегментных и
межсегментных команд CALL и RET.

В этом примере сначала делаем межсегментный вызов подпрограммы square
В которой происходит внутрисегментный вызов подпрограммы add1,
из которой, в свою очередь, происходит межсегментный вызов подпрограммы sub1
В стек заносится каждый раз либо короткий адрес, либо длинный адрес,
в зависимости от типа вызова.
[code h=200]_stack segment 'stack'
dw 100h dup(?)
_stack ends

code1 segment 'code'
assume cs:code1
start:
mov ax, 5
call square

mov ax, 4c00h
int 21h

sub1 proc far
dec ax
ret
sub1 endp

code1 ends

code2 segment 'code'
assume cs:code2
square proc far
mul ax
call add1
ret
square endp

add1 proc near
inc ax
call sub1
ret
add1 endp

code2 ends

end start[/code]
5
Об авторе:
"Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться." Марк Твен
Форма ответа