Консультация № 69864
07.01.2007, 14:48
0.00 руб.
0 3 3
Здравствуйте,уважаемые эксперты!
разбирая программку из книги Калашникова возникла парочка вопросов(прога в приложении):
1.mov di,0;обнуляем di для того , чтобы счётчик не уходил на бесконечность(т.е. в di заносим число оставшихся попыток,а тогда что происходит с cx или наоборот- непонятно. )
2.Интересно, если во внутреннем цикле add di,2 всё супер,но если пишем add di,1 (какая разница с какой скоросью растёт di [ведь любой символ ASC II занимает 1 байт]) вдруг программа работает глючит.
Связано ли это с ячейкой памяти выделяемой под 1 рожицу или нет.
И самое интересное, проверяя две идентичные проги (прога Калашникова) только с 2 разными операторами:
add di,1
sub di,2 ( в каждой прге всё идентично кроме этих операторов)
эффект одинаковый (проверено по afdpro). Почему?
И ещё скажите ,пожалуйста, как бы с эмулироват DOS по-нормальному,
а то у меня DOS`а нет и я запускаю com-программы в Dos Navigator`е, но хотелось бы полноценной вещи. Как с эмулировать Dos в WinXP(или может лучше скачатьMS-DOS где-нибуть?[Вы не подсажете,где поискать?])

Приложение:
CSEG segmentassume CS:CSEG, DS:CSEG, ES:CSEG, SS:CSEGorg 100hStart: mov ax,0B800h mov es,ax mov al,1 mov ah,31 mov cx,254Next_screen: mov di,0 call Out_chars inc al loop Next_screen mov ah,10h int 16h int 20hOut_chars proc mov dx,cx mov cx,2000Next_face: mov es:[di],ax add di,2 loop Next_face mov cx,dx retOut_chars endpCSEG endsend Start

Обсуждение

Неизвестный
07.01.2007, 16:14
общий
это ответ
Здравствуйте, Loriendil!

1. cx используется в нутри процетуды Out_chars как внутренний счетчик. и во вторых в конце этой процедуры мы восстанавливаем значение cx
mov cx,dx
для внешнего цикла
loop Next_screen

2. di используется что бы получить доступи к видео памяти.
mov es:[di],ax
es в данном случае указывает на начало сегмента видеопамяти 0B800h, а di - на текущий символ видеопамяти. Увеличение di на 2 связано с тем как видеопамять устроена. на каждый символ выводимый на экран хранится 2 байта: сам символ и аттрибут цвета. Увеличивая di на 2 каждый раз Вы не только переходите к следующему символу, но и пропускаете байт аттрибута текущего символа. Думаю подробней должно быть в Вашем учебнике

3. Обычно использую или Far или Dos Navigator как Вы
давно
Советник
419
1011
07.01.2007, 16:32
общий
это ответ
Здравствуйте, Loriendil!

Поставь DosBox. Отличный эмулятор реального режима.

http://dosbox.sourceforge.net
Неизвестный
07.01.2007, 19:00
общий
это ответ
Здравствуйте, Loriendil!
Все просто.
- Команда loop инкрементирует cx
- add di, 2 необходимо для того, что мы осуществляем прямой вывод в видео память. А адресация каждой экранной позиции в сегменте видео буфера равна 2 байтам. (Цвет фона и симфола) + ASCII код символа!
Форма ответа