Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.10.2012, 17:17   #1
qwe12355
 
Регистрация: 13.10.2012
Сообщений: 5
По умолчанию Ошибочка. Как с ней бороться?

В общем я делаю лабораторную: вывести матрицу любого размера(я использую для хранения размерности bx и сх) в любом месте экрана, начиная с любого симола. И у меня появилась ошибка.

Ошибка вот такая: "relative jump out of range by 0003h bytes". Я полазил по форумам там везде советуют поставить в начале .386 или применить директиву jumps. ZПроблема в том, что если я это пишу, то у меня вылетает черное окошко и сразу гаснет. Можно как-то по другому избавиться от ошибки? появляется ошибка в
cont: dec cl
jnz m_loop

Код:
.model small
.stack 100
.data
	BUFR db 14h,0,13h dup(?)
	string db "Gorodeckij N.V. 107221",0Dh,0Ah,'$'             
	
.code
begin:
	mov ax, @data
	mov ds,ax

 
     


	;ввести размерность массива
	mov bx,03h
	mov cx,03h
	mov si,bx
	mov di,si
	mov ax,bx
	mul cx
	mov cl,al



	;перевести на след. строку
	mov ax,0200h
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	
	mov ch,00
	mov bp,40h
	mov sp,0000
	;собсна сам вывод матрицы в бп+2 число на 1 больше чем позиция первого символа
	mov [bp+2],024fh
	mov [bp],0930h

	;поставіть курсор на 2 строку
	push dx
	mov ax,0200h
	;позіція первого сімвола
	mov dx,024eh
	mov [bp+6],dx
	int 10h	
	mov di,0000


m_loop:	mov ax,[bp]
	cmp dl,4fh
	jz next
	mov bx,0000h
	mov bl,0ch
	mov cx,0001h
	int 10h ;вывод на экран символа
	pop cx
	inc dl
	cmp dl,4fh
	jz next
	inc ch

	;нужно перейти на след. позицию

	push dx

	mov dx,[bp+2]

	inc ax
	mov [bp],ax
	mov ax,0200h
	int 10h
	inc dl
	inc dl
	inc di
	inc di
	mov [bp+2],dx

	mov dl,32
	int 29h
	mov ax,[bp]
	pop dx
	;div
	push dx
	mov dx,0000h
	mov dl,ch
	mov ax,dx
	pop dx
	mov bx,si
	div bl
	cmp ah,00h
	JNZ cont

	;ппереввод строки
	mov ax,0200h
	add [bp+2],0100h
	sub [bp+2],di
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	mov dx,[bp+2]
	dec dx
	int  10h
	mov di,0000


next: 	mov di,0000h
	mov [bp+4],di	;халтурка для наращивания номера символа
	mov [bp+5],cl
	mov di,si
	sub di,[bp+4]
	add ax,di
	mov dx,[bp+6]
	inc dh
	jmp  m_loop

cont:   dec cl
	jnz   m_loop

	

	;intput string
	mov ah,0ah
	lea dx,BUFR
	int 21h	

	
	mov ax,04c00h
	int 21h


end begin

Последний раз редактировалось qwe12355; 13.10.2012 в 17:19.
qwe12355 вне форума Ответить с цитированием
Старый 13.10.2012, 18:51   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Если .386 не хочешь, то
Код:
dec cl
jnz m_loop
Код:
dec cl
jz m_exitloop
jmp m_loop
m_exitloop:
Somebody вне форума Ответить с цитированием
Старый 13.10.2012, 20:53   #3
qwe12355
 
Регистрация: 13.10.2012
Сообщений: 5
По умолчанию

спасибо большое, ошибка пропала.

я тут дописал кое что и у меня при запуске скомпилированной программы вылетает ошибка "... Процессор NTVDM обнаружил недопустимую инструкция ...". Дело в том, что пошагово в дебаггере программа работает без проблем
Код:
.model small
.stack 100
.data
	BUFR db 14h,0,13h dup(?)
	string db "Gorodeckij N.V. 107221",0Dh,0Ah,'$'             
	
.code
begin:
	mov ax, @data
	mov ds,ax



	;ввести размерность массива
	mov bx,03h
	mov cx,03h
	mov si,bx
	mov di,si
	mov ax,bx
	mul cx
	mov cl,al



	;перевести на след. строку
	mov ax,0200h
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	
	mov ch,00
	mov sp,0000
	;собсна сам вывод матрицы в бп+2 число на 1 больше чем позиция первого символа
	mov ds:[42h],024fh
	mov ds:[40h],0930h

	;поставіть курсор на 2 строку
	push dx
	mov ax,0200h
	;позіція первого сімвола
	mov dx,024eh
	mov ds:[46h],dx
	int 10h	
	mov di,0000


m_loop:	mov ax,ds:[40h]
	cmp dl,4fh
	jz next
	push cx
	mov bx,0000h
	mov bl,0ch
	mov cx,0001h
	int 10h ;вывод на экран символа
	pop cx
	inc bp
	inc dl
	inc ch
	dec cl
	inc ax
	mov ds:[40h],ax
	cmp dl,4fh
	jz next

	;нужно перейти на след. позицию

	push dx

	mov dx,ds:[42h]

	
	mov ax,0200h
	int 10h
	inc dl
	inc dl
	inc di
	inc di
	mov ds:[42h],dx

	mov dl,32
	int 29h
	mov ax,ds:[40h]
	pop dx
	;div
	push dx
	mov dx,0000h
	mov dl,ch
	mov ax,dx
	pop dx
	mov bx,si
	div bl
	cmp ah,00h
	JNZ cont

	;ппереввод строки
	mov ax,0200h
	add ds:[42h],0100h
	sub ds:[42h],di
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	mov dx,ds:[42h]
	dec dx
	int  10h
	mov di,0000
	jmp cont


next: 	mov di,0000h
	mov ds:[44h],di	;халтурка для наращивания номера символа
	mov ds:[44h],bp
	mov di,si
	sub di,ds:[44h]
	add ax,di
	sub cx, di
	mov dx, ds:[46h]
	inc dh
	mov ds:[46h],dx
	mov ds:[40h],ax
	mov ax,0200h
	int 10h
	cmp cl,00h
	jz m_exitloop
	mov bp,0000h
	jmp  m_loop

cont:   dec cl
	jz m_exitloop
	jmp m_loop
	m_exitloop:

	mov ah,1
	int 21h

	


	;intput string
	;mov ah,0ah
	;lea dx,BUFR
	;int 21h	

	
	;mov ax,04c00h
	;int 21h


end begin
qwe12355 вне форума Ответить с цитированием
Старый 13.10.2012, 21:02   #4
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

Код:
	;mov ax,04c00h
	;int 21h
Это комментировать не нужно! Это выход из программы. Без этих строк программа уходит дальше по памяти пока не встретит недопустимую инструкцию.
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума Ответить с цитированием
Старый 13.10.2012, 21:08   #5
qwe12355
 
Регистрация: 13.10.2012
Сообщений: 5
По умолчанию

да, конечно. но эта ошибка и при незакомментированных строках вылазит

Код:
.model small
.stack 100
.data
	BUFR db 14h,0,13h dup(?)
	string db "Gorodeckij N.V. 107221",0Dh,0Ah,'$'             
	
.code
begin:
	mov ax, @data
	mov ds,ax



	;ввести размерность массива
	mov bx,03h
	mov cx,03h
	mov si,bx
	mov di,si
	mov ax,bx
	mul cx
	mov cl,al



	;перевести на след. строку
	mov ax,0200h
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	
	mov ch,00
	mov sp,0000
	;собсна сам вывод матрицы в бп+2 число на 1 больше чем позиция первого символа
	mov ds:[42h],024fh
	mov ds:[40h],0930h

	;поставіть курсор на 2 строку
	push dx
	mov ax,0200h
	;позіція первого сімвола
	mov dx,024eh
	mov ds:[46h],dx
	int 10h	
	mov di,0000


m_loop:	mov ax,ds:[40h]
	cmp dl,4fh
	jz next
	push cx
	mov bx,0000h
	mov bl,0ch
	mov cx,0001h
	int 10h ;вывод на экран символа
	pop cx
	inc bp
	inc dl
	inc ch
	dec cl
	inc ax
	mov ds:[40h],ax
	cmp dl,4fh
	jz next

	;нужно перейти на след. позицию

	push dx

	mov dx,ds:[42h]

	
	mov ax,0200h
	int 10h
	inc dl
	inc dl
	inc di
	inc di
	mov ds:[42h],dx

	mov dl,32
	int 29h
	mov ax,ds:[40h]
	pop dx
	;div
	push dx
	mov dx,0000h
	mov dl,ch
	mov ax,dx
	pop dx
	mov bx,si
	div bl
	cmp ah,00h
	JNZ cont

	;ппереввод строки
	mov ax,0200h
	add ds:[42h],0100h
	sub ds:[42h],di
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	mov dx,ds:[42h]
	dec dx
	int  10h
	mov di,0000
	jmp cont


next: 	mov di,0000h
	mov ds:[44h],di	;халтурка для наращивания номера символа
	mov ds:[44h],bp
	mov di,si
	sub di,ds:[44h]
	add ax,di
	sub cx, di
	mov dx, ds:[46h]
	inc dh
	mov ds:[46h],dx
	mov ds:[40h],ax
	mov ax,0200h
	int 10h
	cmp cl,00h
	jz m_exitloop
	mov bp,0000h
	jmp  m_loop

cont:   dec cl
	jz m_exitloop
	jmp m_loop
	m_exitloop:

	
	


	;intput string
	mov ah,0ah
	lea dx,BUFR
	int 21h	

	
	mov ax,04c00h
	int 21h


end begin
qwe12355 вне форума Ответить с цитированием
Старый 13.10.2012, 23:22   #6
qwe12355
 
Регистрация: 13.10.2012
Сообщений: 5
По умолчанию

проблема та же, но я код дописал, чтобы любая матрица была
Код:
.model small
.stack 100
.data
	BUFR db 14h,0,13h dup(?)
	string db "Gorodeckij N.V. 107221",0Dh,0Ah,'$'             
	
.code
begin:
	mov ax, @data
	mov ds,ax



	;ввести размерность массива
	mov bx,03h
	mov cx,03h
	mov si,bx
	mov di,si
	mov ax,bx
	mul cx
	mov cl,al



	;перевести на след. строку
	mov ax,0200h
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	
	mov ch,00
	mov sp,0000
	;собсна сам вывод матрицы в бп+2 число на 1 больше чем позиция первого символа
	mov ds:[42h],024fh
	mov ds:[40h],0930h

	;поставіть курсор на 2 строку
	push dx
	mov ax,0200h
	;позіція первого сімвола
	mov dx,024eh
	mov ds:[46h],dx
	int 10h	
	mov di,0000


m_loop:	mov ax,ds:[40h]
	cmp dl,4fh
	jz m_exitloop2
	jmp contimue
m_exitloop2:	jmp next
contimue:	push cx
	mov bx,0000h
	mov bl,0ch
	mov cx,0001h
	int 10h ;вывод на экран символа
	pop cx
	inc bp
	inc dl
	inc ch
	dec cl
	inc ax
	mov ds:[40h],ax


	;нужно перейти на след. позицию

	push dx
	
	mov dx,ds:[42h]

	
	mov ax,0200h
	int 10h
	inc dl
	cmp dl,51h
	jz next
	inc dl
	
	inc di
	inc di
	cmp dl,50h	;пропустить наращивание dx если он перерастает 4f
	jz temp	
	mov ds:[42h],dx
	jmp prbIg
temp:	mov ds:[42h],dx
prbIg:	mov dl,32
	int 29h
	cmp dl,50h 
	inc dl
	cmp dl,50h
	jz next
	mov ax,ds:[40h]
	pop dx
	;div
	push dx
	mov dx,0000h
	mov dl,ch
	mov ax,dx
	pop dx
	mov bx,si
	div bl
	cmp ah,00h
	JNZ cont

	;ппереввод строки
	mov ax,0200h
	add ds:[42h],0100h
	sub ds:[42h],di
	mov dl,0dh
	int 21h
	mov dl,0ah
	int 21h
	mov dx,ds:[42h]
	dec dx
	int  10h
	mov di,0000
	jmp cont


next: 	mov di,0000h
	mov ds:[44h],di	;халтурка для наращивания номера символа
	mov ds:[44h],bp
	mov di,si
	sub di,ds:[44h]
	mov ax,ds:[40h]
	add ax,di
	mov ds:[40h],ax
	sub cx, di
	mov dx, ds:[46h]
	inc dh
	mov ds:[46h],dx
	inc dx 
	mov ds:[42h],dx
	mov dx,ds:[46h]
	mov ax,0200h
	int 10h
	cmp cl,00h
	jz m_exitloop
	mov bp,0000h
	mov ch,00h
	jmp  m_loop

cont:   cmp cl,00
	jz m_exitloop
	jmp m_loop
	m_exitloop:

	


	;intput string
	mov ah,0ah
	lea dx,BUFR
	int 21h	

	
	mov ax,04c00h
	int 21h


end begin
qwe12355 вне форума Ответить с цитированием
Старый 14.10.2012, 11:58   #7
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

qwe12355, при использовании прямой адресации, например
Код:
mov ds:[42h],024fh
вы обращаетесь к сегменту кода, т.к. сегмент данных занимает всего 30h байт.
... предполагаю код можно значительно упростить, если вы укажите постановку задачи
на неконкретные вопросы даю неконкретные ответы ...

Последний раз редактировалось Step_UA; 14.10.2012 в 12:00.
Step_UA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как бороться с информерами del piero Свободное общение 2 11.06.2012 12:24
Кодировка и как с ней бороться Abuhamed PHP 10 21.03.2011 01:19
как бороться с табуляторами Fiesta200 Microsoft Office Word 11 08.10.2010 05:16
Как бороться с MP3 плеером? mutabor Компьютерное железо 6 17.11.2009 10:28