Консультация № 67580
18.12.2006, 20:27
0.00 руб.
0 2 2
Уважаемые эксперты! Подскажите, пожалуйста, зачем в проге нужна команда mov ah,9 (прога в приложении)? Зачем сначало заполнять 8-разрядный регистр, а затем 16-разрядный.
И объесните ,пожалуста, почему при ассемблеровании этой же проги (ехе-файл я всё-таки заставил комп сделать) , но он выдал такую строку:
LINK : warning L4021: no stack segment
( Про отсутствие сегмента я понял , но почему ведь в проге стоит - CSEG segment? Непонятно.)

Приложение:
CSEG segmentorg 100hBegin:mov ah,9mov dx,offset Messageint 21hint 20hMessage db ‘Hello world!$‘CSEG endsend Begin

Обсуждение

Неизвестный
18.12.2006, 21:02
общий
это ответ
Здравствуйте, Loriendil!
1) mov ah,9 - когда вызывается прерывание 21h, то обработчик прерывания смотрит что находится в регистре аh. Если мы положим туда значение 9, то обработчик вызовет 9-ю функцию 21h-го прерывания (вывод сообщения), что нам и надо.
2) обработчик использует значения обоих регистров (и аh, и dх). В каждом из них должны быть нужные данные. А порядок заполнения значения не имеет, главное чтобы перед вызовом прерывания регистры содержали нужные значения.
3) линковщик справедливо ругается - в программе нет сегмента стека. Вы ведь объявили единственный сегмент, как для СОМ-программы. Вообще, у вас код СОМ-программы, а не ехе-программы. (один сегмент, команда начать код с 100h байт - org 100h)
4)для того чтобы сделать работоспособную ехе-программу код должен быть другой - содержать по крайней мере сегменты стека и кода, например:
stk segment stack ‘STACK‘
db 100 dup (0fah) ; стек на 100 байт
stk ends
CSEG segment
assume cs:CSEG, ds:CSEG, ss:stk
Begin:
mov ah,9
mov dx,offset Message
int 21h
xor ax,ax
int 20h
Message db ‘Hello world!$‘
CSEG ends
end Begin

вместо объявления сегмента стека по упрощённому синтаксису можно написать что-то вроде
.model small
.stack 1024 ; стек на 1024 байт
.data
Message db ‘Hello world!$‘
.code
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
end Begin
(Р.S. в коде могут быть ошибки, давно не писал на асме.)
Неизвестный
19.12.2006, 11:43
общий
это ответ
Здравствуйте, Loriendil!
В регистре AHзадается код функции 21-го ДОС прерывания. В регистре DX задается смещение к выдаваемой на экран строке.
А сообщение выдается по поводу отсутствия в тексте вашей программы явного указания сегмента стека. это всего лишь предупреждение, и в данном случае все нормально.
На это предупреждение Вам придется обращать внимание при написании более сложных программ.
Дело в том, что, если Вы не указываете явным образом сегмент стека, ДОС, при загрузке Вашей программы на выполнение определит сегментом стека системмный, а его глубина весьма невелика - что приводит к неправильной работе программы при интенсивном использовании подпрограмм, особенно с большим колличеством параметров передаваемых через стек.
Форма ответа