Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

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


В избранное