Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler
Регистрация

Восстановить пароль
Повторная активизация e-mail

Ответ
 
Опции темы
Старый 18.11.2012, 06:08   #1
Starget-93
Пользователь
 
Регистрация: 12.11.2012
Сообщений: 11
Репутация: 10
Вопрос Некорректная работа программы

Здравствуйте !
Необходимо написать программу на Ассемблере, выводящую на экран флаг Бангладеша. Флаг изображается в виде квадрата, раскрашенного в несколько цветов. Сторона квадрата вводится с клавиатуры.

Обозначим a – сторона флага, a2 – половина стороны квадрата, r – число a деленое на 4 в квадрате, радиус круга
Для вывода круга программа будет проверять условие:
(x-a2)^2+(y-a2)^2≤r^2.

Код:

codesg  segment
assume  cs:codesg, ds:codesg, ss:codesg
org     100h
again:
jmp main
a	dw	?	
a2	dw	?	; a = a / 2
r	dw	?	; R*R 
main proc
	mov     dl, 'a'
	mov     ah, 2
	int     21h
	mov     dl, '='
	mov     ah, 2
	int     21h
;***** Enter a *****
	mov bx, 0
	mov si, 10
	mov cx, 5
next:
	mov ah, 1		; enter a symbol
	int 21h		; in AL
	cmp al, ' '
	je back
	and ax, 15		; leave a number
	mov di, ax
	mov ax, bx
	mul si
	add ax, di		; AX = 10*BX + number
	mov bx, ax
	loop next
back:
	mov a, bx
	sar bx, 1		; BX = BX/2
	mov a2, bx
	mov ax, a
	mov cl, 4
	div cl		; ax = ax  / 4
	mov ah, 0
	mul ax		; ax = ax * ax
	mov r, ax
;***** Saving of videomode *****
	mov ah, 0Fh		; saving
	int 10h
	push ax
      mov ax, 0013h	; set up
    	int 10h
    	mov dx, 0		; y
    	mov cx, 0		; x
a50:
	mov	ax, cx	; x
	sub ax, a2		; x - a2
	push dx
	mul	ax		; (x - a2)^2
	pop dx
	mov	si, ax	; save
	mov	ax, dx	; y
	sub ax, a2		; y - a2
	push dx
	mul	ax		; (y - a2)^2
	pop dx
	add	ax, si	; (x - a2)^2 + (y - a2)^2
	mov al, 4		; red
	cmp	ax, r		; (x - a2)^2 + (y - a2)^2 < r * r
	jb	a40		; yes
	mov al, 2		; green
	cmp dx, a		; y < a?
	jb a40		; yes
a40:
	mov ah, 0Ch		; output of point
	mov bh, 0		; page
	int 10h
	inc cx
    	cmp cx, a		; x != a?
    	jne a50		; yes
    	mov cx, 0
    	inc dx
    	cmp dx, 200		; y >= 200?
    	jae  exit		; yes
    	cmp dx, a		; y < a
    	jb a50		; yes
exit:
	mov ax, 0
	int 16h
	pop ax
	mov ah, 0
	int 10h
    	ret
main endp
codesg ends
end main

При вводе a=200 флаг отображается правильно. Если же ввести а=500 или больше, программа некорректно выводит изображение флага.


В чем ошибка и как ее исправить ?

Последний раз редактировалось Stilet; 18.11.2012 в 12:49.
Starget-93 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректная работа программы в Windows 7. Vedaslav Общие вопросы Delphi 19 02.08.2011 00:03
Некорректная работа программы... HyperZen Общие вопросы Delphi 2 03.07.2011 10:46
Некорректная работа WPF _-Re@l-_ WPF, UWP, WinRT, XAML 0 19.04.2011 16:05
Некорректная работа программы при формировании массива @Manya@ Общие вопросы C/C++ 13 22.04.2010 21:40
Некорректная работа потока 3D Hunter Общие вопросы Delphi 7 09.03.2009 11:51


08:45.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru