Рисование в ASMе

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

Модератор: Andy

Ответить
Svet_lana
Сообщения: 8
Зарегистрирован: 06 дек 2005, 13:01
Откуда: г.Усть-Лабинск

По заданию нужно написать программу вывода на середину экрана красного квадрата размерностью 10x10 пикселей
Я пробовала сделать но проверить не могу. Я плохо разбираюсь в ASMе, так что проверьте пожалуйста!!!! Где ошибки (Я знаю точно есть)

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

CSEG segment
  org 100h

start:
mov ax, 0013h
int 10h
mov byte ptr es [320*10+10],12
mov byte ptr es [320*10+11],12
mov byte ptr es [320*10+12],12
mov byte ptr es [320*11+10],12
mov byte ptr es [320*11+11],12
mov byte ptr es [320*11+12],12
mov byte ptr es [320*12+10],12
mov byte ptr es [320*12+11],12
mov byte ptr es [320*12+12],12

mov ah,0
int 16h

mov ax, 0003h
int 10h
end start
CSEG ends
----------------------------------------------
P.S. Как запустить на выполнение все то, что написала в MASM или в VisualAsembler1_0. Причем при запуске MASM.exe пишется программа не запускается. :( . Его запускаю через PWB.exe.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Svet_lana, А плчему ты решила рисовать пиксели прямым выводом в память, а не через Int 10h?

Int 10/AH=0Ch
VIDEO - WRITE GRAPHICS PIXEL
AH = 0Ch
BH = page number
AL = pixel color
if bit 7 set, value is XOR'ed onto screen except in 256-color modes
CX = column
DX = row
Return:Nothing

Desc: Set a single pixel on the display in graphics modes
Notes: Valid only in graphics modes. BH is ignored if the current video mode supports only
one page

P.S. Как запустить на выполнение все то, что написала в MASM или в VisualAsembler1_0. Причем при запуске MASM.exe пишется программа не запускается. . Его запускаю через PWB.exe.
Я, когда в свое время баловался ассемблером, пользовался TASM-ом. Т.е. компилировал текст при помощи TASM.EXE, при этом получался obj-файл, а затем на этот obj-файл апускал линкер TLINK.EXE и получал уже COM-файл (exe-шники практически никогда не делал).
Аватара пользователя
Romeo
Сообщения: 3126
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

Перед непосредственным выводом квадрата нужно в es занести адрес видеобуфера. В твоём случае es не инициализирован, и ты пишешь по адресу, который в нём должен содержаться. Естественно всё наварачивается. Добавь перед кучей mov следующий код:

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

mov ax, 0A000h
mov es, ax
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Andy
Сообщения: 238
Зарегистрирован: 17 фев 2004, 08:15
Откуда: Минск

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

CSeg	segment byte public 'CODE'
	assume cs:CSeg

PIXEL_COLOR	equ 12

	org 100h
	
_start:
	mov	ax,13h
	int	10h
	
	push	0a000h
	pop	ds
	
	mov	ax,(200 - 10)/2
	mov	di,320
	mul	di
	add	ax,(320 - 10)/2
	xchg	ax,di
	
	mov	cx,10
PutSquare:
	push	cx
	mov	cx,10
PutRow:
	mov	byte ptr ds:[di],PIXEL_COLOR
	inc	di
	loop	PutRow
	add	di,310
	pop	cx
	loop	PutSquare
	
	xor	ax,ax
	int	16h
	
	mov	ax,3
	int	10h
	
	mov	ah,4ch
	int	21h
	
CSeg	ends
	end _start
*provided AS IS
Svet_lana
Сообщения: 8
Зарегистрирован: 06 дек 2005, 13:01
Откуда: г.Усть-Лабинск

Работает!!!!!!! :) !!!! :D
Огромное спасибо :wink:
Ответить