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

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


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный платный хостинг на базе Windows 2008

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

Чемпионы рейтинга экспертов в этой рассылке

Boriss
Статус: Академик
Рейтинг: 1659
∙ повысить рейтинг »
_Ayl_
Статус: Студент
Рейтинг: 1410
∙ повысить рейтинг »
vladisslav
Статус: 5-й класс
Рейтинг: 1054
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И ПО / Программирование / Assembler (Ассемблер)

Номер выпуска:1304
Дата выхода:08.01.2010, 19:30
Администратор рассылки:Лысков Игорь Витальевич, Модератор
Подписчиков / экспертов:441 / 70
Вопросов / ответов:1 / 1
IRC-канал по теме:#assembler

Вопрос № 175791: Здравствуйте, уважаемые эксперты! Срочно нужна маленькая помощь в подправке программы. В нижеследующей программе нужно задать константы, которые можно изменять динамически, а не статически как они заданы в программе. Возможно использование макрос...



Вопрос № 175791:

Здравствуйте, уважаемые эксперты!
Срочно нужна маленькая помощь в подправке программы. В нижеследующей программе нужно задать константы, которые можно изменять динамически, а не статически как они заданы в программе. Возможно использование макроса. Константы должны задаваться для функции Call Line, x1, x2, x3, x4, x5
Где x1 - начальная координата по Х, x2 - по Y, x3 и х4 - смещение по X и Y (таким образом, задаем направление), х5 - количество точек.
Цель программы: задаем константы - она рисует то, что нам надо. =)
Tasm; для x86; DOC, Граф.

P.S. Всех с Новым 2010 годом! Удачи, здоровья и любви вам в Новом году! =)

Код:
.model tiny, C

.code
org 100h
.186

start: mov ax, 11h ;устанавливаем граф. режим 640х480х 2
int 10h

mas dw 340, 240, 1, 0, 50 ; Вероятно неправильно
mov si, 0 ; Вероятно неправильно
;mov di, 2
;mov ax, mas[si]
;xor si, si
;mov si, 1
;mov bx, mas[si]
;mov ax, mas[si]

call line, mas[si], 240, 1, -1, 50 ; Вероятно неправильно

mov ah,0 ;ждем любую клавишу
int 16h ;для выхода

mov ax,3 ;установим текстовый режим
int 10h

mov ax, 4c00h
int 21h ;выход в ДОС


;Рисуем линию от точки (x, y) c направлением (deltax, deltay),
;и состоящую из count точек
line proc x:word, y:word, deltax:word, deltay:word, count:word
uses cx, dx, si

mov si, count
mov cx, x
mov dx, y
line_loop:
call SetPixel, cx, dx, 1

add cx, deltax
add dx, deltay
dec si ;счетчик точек
jnz line_loop

ret
line endp

; Name: PixelAddr
; Function: Определяет позицию пикселя в буфере VGA в режиме 640x480
;; Caller: AX = y-координата 0-479
; BX = x-координата 0-639
;
; Returns: AH = битовая маска
; BX = смещение байта в видеобуфере
; CL = число сдвигов для сдвига маски влево
; ES = сегмент видеобуфера

BytesPerLine EQU 80 ; число байт в одной гор.линии
VideoBufferSeg EQU 0A000h

PixelAddr PROC near
mov cl,bl ; CL := младший байт x

push dx ; сохраним DX

mov dx,BytesPerLine ; AX := y * BytesPerLine
mul dx

pop dx
shr bx,1
shr bx,1
shr bx,1 ; BX := x/8
add bx,ax ; BX := y*BytesPerLine + x/8
; BX - смещение байта в видеобуфере

mov ax,VideoBufferSeg
mov es,ax ; ES:BX := адрес байта пикселя

and cl,7 ; CL := x & 7
xor cl,7 ; CL := число сдвигов для сдвига маски влево
mov ah,1 ; AH := несдвинутая маска
ret

PixelAddr ENDP

; Name: SetPixel
;
; Function: Устанавливает значение пикселя в режиме 640x480
;
; void SetPixel(x,y,n);
;
; int x,y; /* координаты пикселя */
;
; int n; /* цвет пикселя */

RMWbits EQU 0 ; read-modify-write bits

SetPixel PROC ARGx:word, ARGy:word, ARGn:word
uses cx, dx, bx, es

mov ax,ARGy ; AX := y
mov bx,ARGx ; BX := x
call PixelAddr ; AH := битовая маска
; ES:BX -> буфер
; CL := число сдвигов

; установка регистра битовой маски графического контроллера (GC)

shl ah,cl ; AH := битовая маска в соответствующей позиции
mov dx,3CEh ; порт регистра адреса GC
mov al,8 ; AL := номер регистра битовой маски
out dx,ax

; установка регистра режима GC

mov ax,0005h ; AL := номер регистра режима
; AH := режим записи 0 (биты 0,1)
; режим чтения 0 (бит 3)
out dx,ax

; установка регистра выбора вращения/функции

mov ah,RMWbits ; AH := биты Read-Modify-Write (=0)
mov al,3 ; AL := регистр выбора Data Rotate/Func tion
out dx,ax

; установка регистров установки/сброса и разрешения установки/сброса

mov ah,byte ptr ARGn; AH := цвет пикселя
mov al,0 ; AL := регистр установки/сброса
out dx,ax

mov ax,0F01h ; AH := разрешаем все цветовые слои
; AL := регистр разрешения установки/сброса
out dx,ax

; установка значения пикселя

or es:[bx],al ; загрузка в защелки во время чтения
; и установка во время записи

; восстановим значения по-умолчанию

mov ax,0FF08h ; маска битов
out dx,ax

mov ax,0005 ; регистр режима
out dx,ax

mov ax,0003 ; выбор функции
out dx,ax

mov ax,0001 ; разрешение установки/сброса
out dx,ax

ret
SetPixel ENDP

end start

Отправлен: 03.01.2010, 19:01
Вопрос задал: Ефремов Николай Александрович, Посетитель
Всего ответов: 1
Страница вопроса »


Отвечает Зенченко Константин Николаевич, Модератор :
Здравствуйте, Ефремов Николай Александрович.

Смотрите приложение.
Ваша ошибка:данные массива mas воспринимались процессором как команды программы.

Добавлен ввод чисел, в том числе и отрицательных.

© Цитата: Ефремов Николай Александрович
Просто как пример мне надо будет показать как нарисовать в ней домик

© Цитата: данные для домика в деревне
25,45,1,-1,25
50,20,1,1,25
30,65,1,0,40
30,40,1,0,40
30, 40,0,1,25
70,40,0,1,25


ps:программа проверялась tasm 2.0 и 4.0
рps:команды компиляции:
tasm prog
tlink prog /t


Удачи!

Приложение:

-----
Итерация от человека. Рекурсия — от Бога. — Л. Питер Дойч

Ответ отправил: Зенченко Константин Николаевич, Модератор
Ответ отправлен: 05.01.2010, 17:38
Украина, Киев
Тел.: +38-097-953-66-19
Адрес: Украина, Киев

Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 258381 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:
  • Вам помогли? Пожалуйста, поблагодарите эксперта за это!


    Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.


    © 2001-2010, Портал RFpro.ru, Россия
    Авторское право: ООО "Мастер-Эксперт Про"
    Автор: Калашников О.А. | Программирование: Гладенюк А.Г.
    Хостинг: Компания "Московский хостер"
    Версия системы: 2009.6.13 от 28.12.2009

    В избранное