Страница 1 из 1
Помогите пожалуйста! интересная штука
Добавлено: 23 апр 2007, 00:25
Ромашка
Привет всем! у меня маленькая трудность возникла при ассемблировании. Моя задача заключается в том, что необходимо вывести на экран любое слово из любого количества букв по-кругу. Препод предложил сделать это через матрицу, типа есть такая фигня, где каждому элементу массива можно задать конкретную координату. Я перелазила везде и не могу понять, откуда он это взял. Может есть знающие люди? помогите пожалуйста, иначе я скоро начну биться башкой об клавиатуру моего компа! сложно все как-то!
Спасибо!
Если кто предложит решение этой задачи, ощастливит бедную девушку!
Re: Помогите пожалуйста! интересная штука
Добавлено: 23 апр 2007, 08:59
somewhere
Начнем с теории:
Любая точка А окружности с радиусом R и углом смещения относительно оси ОУ равным В имеет координаты:
Ax = R*sin(B)
Ay = R*cos(B)
Если допустим, кол-во символов в слове = 8, то для того, чтобы расположить все буквы по окружности равномерно, необходимо отступать каждый раз по (360/8) градусов и считать местоположение букв по формуле. Т.е. B первоначально равен 0, потом 45, 90, 135, 180 ...
Учитывая слабость и отсталость нынешнего преподавания программирования на ассемблере от современного железа предполагаю, что буквы будут выводится в текстовом режиме и будет использоваться процессор 80286. Так как он не имеет FPU , то sin,cos будем считать "ручками" и заносить предварительно в таблицу. Если будут использоваться комманды процессора 80386 с использования FPU для математических расчетов - то на эту рутиную работу можно забить. Следует заметить, что формирование букв по окружности - процесс итерационный, и создавать таблицу с координатами необходимости нет - можно сказать, даже не рекомендуется, т.к. потребует лишнюю память. А вот таблицу синусов - ХЗ. Вот теперь вопрос, который задается в этом разделе всем - для каких процессоров будем писать?
Re: Помогите пожалуйста! интересная штука
Добавлено: 23 апр 2007, 23:46
Ромашка
работаем на процессоре 80386.
спасибо, что откликнулся. я даже не ожидала. это был просто акт отчаяния.
Re: Помогите пожалуйста! интересная штука
Добавлено: 24 апр 2007, 09:56
somewhere
Код: Выделить всё
.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) увидим именно круг.
Re: Помогите пожалуйста! интересная штука
Добавлено: 24 апр 2007, 21:06
Ромашка
привет тебе, хороший человек!!! честно, живя в москве я давно забыла, что есть хорошие люди!!!! ты напомнил!!! спасибо!!!!
Re: Помогите пожалуйста! интересная штука
Добавлено: 26 апр 2007, 15:18
Sergey_
у меня скомпилилось так:
Код: Выделить всё
org 100h
.386
cseg segment // один сегмент для модели памяти tiny
start:
.... код самвера... :)
cseg ends
end start ; точка входа
________________________________________
и компилим так: ml.exe /AT krug.asm