|
|
|
|
Передача данных через память программы
Передача данных через память программы является одним из вариантов передачи данных через общую область памяти. Первым отличием является то, что
данные располагаются в памяти программы (программном сегменте), а вторым - то, что местоположение данных определяется с помощью инструкции CALL,
поскольку данные размещаются непосредственно после вызова.
Вызываемая программа выбирает адрес возврата из стека, используемого в качестве указателя на область памяти, складывает размер области памяти с
адресом возврата и помещает его обратно в стек. При возврате управления в вызывающую программу адрес возврата располагается сразу же после области
данных.
Это кажется удобным до тех пор, пока не примем во внимание, что микропроцессор 8086 специально спроектирован для разделения программы и областей
данных. Передача данных через память программы требует, чтобы программный сегмент и сегмент данных были установлены в одно и то же значение, поэтому
адрес возврата относится к программному сегменту.
Самой наихудшей проблемой способа передачи данных через память программы является то, что он требует манипуляции стека, в котором происходит то
самое "сближение" для текущей самомодифицируемой программы. Одно правило, которое всегда необходимо помнить, состоит в том, чтобы никогда, никогда не
модифицировать память программы! Если все же поддаться соблазну, то программа станет почти неподдающейся отладке без тщательного анализа логики
программного обеспечения.
|
|