WMmail.ru - сервис почтовых рассылок

понедельник, 20 ноября 2017 г.

RFpro.ru: Ассемблер? Это просто! Учимся программировать

Subscribe.ru
RFpro.ru: Ассемблер? Это просто! Учимся программировать

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

Коцюрбенко Алексей aka Жерар
Статус: Мастер-Эксперт
Рейтинг: 312
• повысить рейтинг »
Evgen aka Chuma
Статус: 5-й класс
Рейтинг: 0
• повысить рейтинг »
quirck
Статус: 1-й класс
Рейтинг: 0
• повысить рейтинг »

• Assembler

Номер выпуска: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

Консультировал: Лысков Игорь Витальевич (Старший модератор)
Дата отправки: 20.11.2017, 11:49
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 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!

Правильный вариант Вашего кода:

Код (Assembler) :: выделить код
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 благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


 
     Прошлые выпуски
RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать RFpro.ru: Ассемблер? Это просто! Учимся программировать Все выпуски рассылки
 
Если выпуск не отображается, вы можете прочесть его на сайте

Это сообщение было отправлено на admin10383.deep@blogger.com потому, что вы подписались на рассылку comp.prog.assembler на subscribe.ru.
Чтобы гарантировать получение писем от нас — добавьте наш адрес в адресную книгу.

Вы можете отказаться от получения писем.

Архив рассылки Поддержка подписчиков

Комментариев нет:

Отправить комментарий