Помогите пожалуйста! интересная штука

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Ответить
Ромашка
Сообщения: 13
Зарегистрирован: 22 апр 2007, 21:03

Привет всем! у меня маленькая трудность возникла при ассемблировании. Моя задача заключается в том, что необходимо вывести на экран любое слово из любого количества букв по-кругу. Препод предложил сделать это через матрицу, типа есть такая фигня, где каждому элементу массива можно задать конкретную координату. Я перелазила везде и не могу понять, откуда он это взял. Может есть знающие люди? помогите пожалуйста, иначе я скоро начну биться башкой об клавиатуру моего компа! сложно все как-то!
Спасибо!
Если кто предложит решение этой задачи, ощастливит бедную девушку!
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Начнем с теории:
Любая точка А окружности с радиусом R и углом смещения относительно оси ОУ равным В имеет координаты:
Ax = R*sin(B)
Ay = R*cos(B)
Если допустим, кол-во символов в слове = 8, то для того, чтобы расположить все буквы по окружности равномерно, необходимо отступать каждый раз по (360/8) градусов и считать местоположение букв по формуле. Т.е. B первоначально равен 0, потом 45, 90, 135, 180 ...
Учитывая слабость и отсталость нынешнего преподавания программирования на ассемблере от современного железа предполагаю, что буквы будут выводится в текстовом режиме и будет использоваться процессор 80286. Так как он не имеет FPU , то sin,cos будем считать "ручками" и заносить предварительно в таблицу. Если будут использоваться комманды процессора 80386 с использования FPU для математических расчетов - то на эту рутиную работу можно забить. Следует заметить, что формирование букв по окружности - процесс итерационный, и создавать таблицу с координатами необходимости нет - можно сказать, даже не рекомендуется, т.к. потребует лишнюю память. А вот таблицу синусов - ХЗ. Вот теперь вопрос, который задается в этом разделе всем - для каких процессоров будем писать?
It's a long way to the top if you wanna rock'n'roll
Ромашка
Сообщения: 13
Зарегистрирован: 22 апр 2007, 21:03

работаем на процессоре 80386.
спасибо, что откликнулся. я даже не ожидала. это был просто акт отчаяния.
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Код: Выделить всё

.model tiny
.386
.code
jmp @start

aWord   db 'Improvement',0
len     dw 0
center  dw 40, 12
radiusX dw 24
radiusY dw 10
dAngle  dd 0
x	 dw 0
y	 dw 0

	@start:
mov ax, cs		; Segment initialization
mov ds, ax
mov es, ax

mov ax, 3
int 10h		; Set new video mode 80x25

lea di, aWord
xor al, al
cld
xor cx, cx
dec cx
repnz scasb
sub di, offset aWord
dec di
mov len, di		; Search zero byte to get the length of a word

fld1
fld1
fadd
fldpi
fmul
fidiv len
fstp dAngle		; dAngle = 2*Pi/Len

mov ax, 0B800h		; Text video segment
mov es, ax
lea si, aWord
mov cx, Len
fldpi				; a = pi
	@calc:
fld st(0)			; Copy to stack prev. value
fsincos			; Complete two operations in one shot
fimul radiusX
fiadd word ptr Center	; X = RadiusX * cos(a) + CenterX
fistp x
fimul radiusY
fiadd word ptr Center+2
fistp y			; Y = RadiusY * sin(a) + CenterY
fadd dAngle			; st(0) = st(0) + dAngle ==> Next angle

mov ax, 80			; Offset = (80 * y + x)*2
mul y
add ax, x
shl ax, 1
mov di, ax
movsb				; Es:[di] <== Ds:[si]
loop @calc			; Next step

fistp x			; Means nothing, need to clear FPU stack
mov ax, 4c00h
int 21h
end
Просто задай любое слово в aWord, откомпиль и запусти.
Радиуса здесь два, чтобы было похоже на круг. Есть такое понятие как Aspect Ratio

AR = ScreenWidth/ScreenHeight

или коэф. пропорции. В нашем случае экран 80х25 дает AR = 80/25 = 3.2, однако AR стандартного монитора = 1.33, а это значит, что нарисованный попиксельно круг будет не кругом, а овалом. Для того, чтобы получить круг, немного подсчитаем, насколько надо растянуть круг, чтобы на экране 80х25 он был именно кругом.

AR1 = 3.2, AR2 = 1.33, K = AR1/AR2 = 3.2 / 1.33 = 2.4

RadiusY = 10
RadiusX = 10 * 2.4 = 24

Развернув на полный экран (ALT-ENTER) увидим именно круг.
It's a long way to the top if you wanna rock'n'roll
Ромашка
Сообщения: 13
Зарегистрирован: 22 апр 2007, 21:03

привет тебе, хороший человек!!! честно, живя в москве я давно забыла, что есть хорошие люди!!!! ты напомнил!!! спасибо!!!!
Sergey_
Сообщения: 8
Зарегистрирован: 20 апр 2007, 12:29

у меня скомпилилось так:

Код: Выделить всё

org 100h
.386

cseg segment // один сегмент для модели памяти tiny
start:
.... код самвера... :)
cseg ends

end start ; точка входа
________________________________________
и компилим так: ml.exe /AT krug.asm
главное - не забыть что кодишь :)
Ответить