РАССЫЛКИ ПОРТАЛА RFPRO.RU Лучшие эксперты в разделе Номер выпуска: | 1669 | Дата выхода: | 20.11.2017, 21:15 | Администратор рассылки: | Лысков Игорь Витальевич (Старший модератор) | Подписчиков / экспертов: | 46 / 18 | Вопросов / ответов: | 2 / 2 | Консультация # 191723: Уважаемые эксперты! Пожалуйста, ответьте на вопрос: почему "Многие уже, наверное, заметили, что при запуске какой-нибудь COM-программы регистр sp равен 0FFFEh"? А не 0FFFFh?... Консультация # 191781: Уважаемые эксперты, здравствуйте, прошу помощи в следующем вопросе: написал код который должен выводить скан-коды клавиш (пока только для нажатия), но почему-то код не работает - при нажатии клавиш скан-коды не выводятся на экран. процедура работает правильно - я проверил ее как отдельную программу - выводит содержимое регистра AL на экр... Консультация # 191723: Уважаемые эксперты! Пожалуйста, ответьте на вопрос:
почему "Многие уже, наверное, заметили, что при запуске какой-нибудь COM-программы регистр sp равен 0FFFEh"? А не 0FFFFh? Дата отправки: 10.11.2017, 19:46 Вопрос задал: kerenskyaf (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Лысков Игорь Витальевич (Старший модератор): Здравствуйте, kerenskyaf! Четное значение вершины стека в 16-битном режиме процессора, а ДОС-овские программы работают именно в 16-битном режиме, необходимо для выравнивания адреса на слово. Процессоры х86 так устроены, что они работают лучше всего, если адреса памяти выровнены на разрядность процессора. Обычно выравнивание памяти происходит компиляторами (при компиляции) и ОС (при выполнении) автоматически.
Строго говоря, в незащищенном 16-битном режиме будет работать и с нечетной границей, просто при обращении к памяти будет тратиться лишний такт. А вот в защищенных 32- и 64-битных режимах (в Windows или Linux) предусмотрен режим контроля выравнивания, при котором произойдет исключение, т.е. аварийное завершение. Отсюда, в 32- и 64-битном режимах точно необходимо выравнивать память на 4 и 8 байт соответственно.
Именно поэтому память, и особенно стек, желательно выравнивать на необходимую величину.
Как справедливо заметил Зенченко К. Н.: Само значение 0xFFFE получается потому, что при запуске программы значение вершины стека SP = 0 Потом загрузчик программы выполняет команду PUSH 0, чтобы в стеке оказался адрес 0, по которому в начале программного сегмента записывается команда int 20h. Это сделано, чтобы работала команда ret, по которой перейдет управление как раз на адрес 0 и выполнится int 20h А после выполнения PUSH 0 и получается, что SP = 0xFFFE Консультация # 191781: Уважаемые эксперты, здравствуйте,
прошу помощи в следующем вопросе: написал код который должен выводить скан-коды клавиш (пока только для нажатия), но почему-то код не работает - при нажатии клавиш скан-коды не выводятся на экран. процедура работает правильно - я проверил ее как отдельную программу - выводит содержимое регистра AL на экран в HEX-формате. прошу вас подсказать мне, где моя ошибка и как ее можно исправить мою ошибку.
Спасибо.
model tiny code1 segment assume cs:code1,ds:code1,ss:code1,es:code1 org 100h begin: mov ax,3 int 10h mov ax,3509h int 21h mov old09o,bx mov old09s,es mov ax,2509h mov dx,offset new09 int 21h mov ah,9 mov dx,offset mess1 int 21h mov ah,10 mov dx,offset mess2 int 21h mov ax,2509h mov dx,old09o mov ds,old09s int 21h ret old09o dw ? old09s dw ? mess1 db 10,10,13,'Enter a key: $' mess2 db 120,?,120 dup(?) new09: in al,60h and al,01111111b push ax call proc1 proc1 proc pop ax mov bx,1030h mov ah,0 div bh ; ax/bh=(al, ost->ah) cmp ah,09h ja @@03 add bl,ah jmp @@04 @@03: mov bl,41h sub ah,0Ah add bl,ah @@04: mov ah,0 div bh ; ax/bh=(al, ost->ah) cmp ah,09h ja @@05 mov dx,3030h add dx,ax jmp @@06 @@05: mov dx,4141h sub ah,0Ah add dx,ax @@06: push dx mov ah,2 mov dh,10 mov dl,20 mov bh,0 int 10h pop dx mov ah,2 mov dl,dh int 21h mov dl,bl int 21h mov dl,68h int 21h ; mov dl,0Dh ; int 21h ret proc1 endp code1 ends end begin Дата отправки: 15.11.2017, 16:36 Вопрос задал: ialmiev (Посетитель) Всего ответов: 1 Страница онлайн-консультации » Консультирует Зенченко Константин Николаевич (Модератор): Здравствуйте, ialmiev!
Правильный вариант Вашего кода:
model tiny code org 100h begin: mov ah,11h int 16h jnz begin mov ah,10h int 16h cmp ah,1 jz OB02 mov al,ah aam 16 xchg al,ah call outByte xchg al,ah call outbyte mov al,' ' int 29h jmp begin outByte:cmp al,10 jb OB01 add al,7 OB01: add al,'0' int 29h OB02: ret end begin Удачи!  | Консультировал: Зенченко Константин Николаевич (Модератор) Дата отправки: 15.11.2017, 17:50 5 нет комментария ----- Дата оценки: 15.11.2017, 19:16 | Рейтинг ответа: 0 |
Оценить выпуск | Задать вопрос экспертам главная страница | стать участником | получить консультацию техническая поддержка Дорогой читатель! Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно! МЫ РАБОТАЕМ ДЛЯ ВАС! |
Комментариев нет:
Отправить комментарий