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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 28.02.2010, 02:12   #1
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Адрес: Киев, Ладыжин
Сообщений: 42
Репутация: 16

icq: 440876534
skype: xVxSeRGxVx
Смущение Ошибка при многократном вызове макроопределения

Доброго времени суток, уважаемые програмисты.
пишу програму, що выводит текст в виде геометрических фигур, поскольку я лентяй, то для построения прямоугольника я решил написать 2-a макроопределения, и вызвать их по 2 раза, то есть, для двух вертик. и гориз. сторон. Собственно вот его код программы:
Код:
.model small
.stack 100h

PRINT_STR_R MACRO STR, STRLEN, POS_R, POS_ST
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
POS_PRINT_R:
	; ...текст отстутсвует
LOOP POS_PRINT_R
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

PRINT_STR_S MACRO STR, STRLEN, POS_R, POS_ST
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
POS_PRINT_S:
	; ...текст отстутсвует
LOOP POS_PRINT_S
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

clear_screan	macro
	mov ax, 0600h
	mov bh, 05
	mov cx, 0000
	mov dx, 184fh
	int 10h
	endm
.data
	; ...текст отстутсвует
.code
main proc
	call INIT
	clear_screan

	PRINT_STR_R str1, strlen1, 12, 63
	PRINT_STR_R str1, strlen1, 24, 63
	PRINT_STR_S str2, strlen2, 13, 63
	PRINT_STR_S str2, strlen2, 12, 79

	call CLOSE_PROG 

main endp

INIT proc
	mov ax, @data
	mov ds,ax
	sub ax,ax
ret
INIT endp

CLOSE_PROG proc
	mov ah,4ch
	mov al,0
	int 21h
ret
CLOSE_PROG endp
end main
и вот, обратите внимание на циклы: POS_PRINT_R и POS_PRINT_S при повторном вызове TASM начинает ругаться:



я не знаю что делать, пробывал назвать @@POS_PRINT_R и @@POS_PRINT_S(где-то видел, что так обозначают), хотя не понимаю для чего. В общем всё.
xVxSeRGxVx вне форума   Ответить с цитированием
Старый 28.02.2010, 21:39   #2
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Адрес: Киев, Ладыжин
Сообщений: 42
Репутация: 16

icq: 440876534
skype: xVxSeRGxVx
По умолчанию

что даже соображений никаких нету?...
xVxSeRGxVx вне форума   Ответить с цитированием
Старый 28.02.2010, 23:40   #3
alexcoder
Участник клуба
 
Регистрация: 31.05.2009
Сообщений: 762
Репутация: 454

skype: alexcoder1
По умолчанию

Код:
.model small
.stack 100h

PRINT_STR_R MACRO STR, STRLEN, POS_R, POS_ST
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
@@:
	; ...текст отстутсвует
LOOP @b
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

PRINT_STR_S MACRO STR, STRLEN, POS_R, POS_ST
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
@@:
	; ...текст отстутсвует
LOOP @b
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

clear_screan	macro
	mov ax, 0600h
	mov bh, 05
	mov cx, 0000
	mov dx, 184fh
	int 10h
	endm
.data
	; ...текст отстутсвует
.code
version M510
main proc
	call INIT
	clear_screan

	PRINT_STR_R str1, strlen1, 12, 63
	PRINT_STR_R str1, strlen1, 24, 63
	PRINT_STR_S str2, strlen2, 13, 63
	PRINT_STR_S str2, strlen2, 12, 79

	call CLOSE_PROG

main endp

INIT proc
	mov ax, @data
	mov ds,ax
	sub ax,ax
ret
INIT endp

CLOSE_PROG proc
	mov ah,4ch
	mov al,0
	int 21h
ret
CLOSE_PROG endp
end main
__________________
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума   Ответить с цитированием
Старый 28.02.2010, 23:45   #4
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
Репутация: 10
По умолчанию

xVxSeRGxVx
Мне так кажеться....у тебя не полный код

Последний раз редактировалось Doholyan; 28.02.2010 в 23:48.
Doholyan вне форума   Ответить с цитированием
Старый 28.02.2010, 23:57   #5
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Адрес: Киев, Ладыжин
Сообщений: 42
Репутация: 16

icq: 440876534
skype: xVxSeRGxVx
По умолчанию

Цитата:
Сообщение от Doholyan Посмотреть сообщение
xVxSeRGxVx
Мне так кажеться....у тебя не полный код
да, код действительно не полный, наведён токо каркас программы, или Вы не это имели ввиду?
xVxSeRGxVx вне форума   Ответить с цитированием
Старый 01.03.2010, 00:56   #6
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
Репутация: 10
По умолчанию

Да, именно это!
Doholyan вне форума   Ответить с цитированием
Старый 01.03.2010, 02:03   #7
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Адрес: Киев, Ладыжин
Сообщений: 42
Репутация: 16

icq: 440876534
skype: xVxSeRGxVx
По умолчанию

Цитата:
Сообщение от Doholyan Посмотреть сообщение
Да, именно это!
а что по вашему мнению ещё должно присутсвовать?
xVxSeRGxVx вне форума   Ответить с цитированием
Старый 01.03.2010, 09:33   #8
alexcoder
Участник клуба
 
Регистрация: 31.05.2009
Сообщений: 762
Репутация: 454

skype: alexcoder1
По умолчанию

Посмотри внимательней, я исправил, теперь компилируется:
Цитата:
Код:

Код:
.model small
.stack 100h

PRINT_STR_R MACRO STR, STRLEN, POS_R, POS_ST
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
@@:
	; ...текст отстутсвует
LOOP @b
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

PRINT_STR_S MACRO STR, STRLEN, POS_R, POS_ST
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
@@:
	; ...текст отстутсвует
LOOP @b
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

clear_screan	macro
	mov ax, 0600h
	mov bh, 05
	mov cx, 0000
	mov dx, 184fh
	int 10h
	endm
.data
	; ...текст отстутсвует
.code
version M510
main proc
	call INIT
	clear_screan

	PRINT_STR_R str1, strlen1, 12, 63
	PRINT_STR_R str1, strlen1, 24, 63
	PRINT_STR_S str2, strlen2, 13, 63
	PRINT_STR_S str2, strlen2, 12, 79

	call CLOSE_PROG

main endp

INIT proc
	mov ax, @data
	mov ds,ax
	sub ax,ax
ret
INIT endp

CLOSE_PROG proc
	mov ah,4ch
	mov al,0
	int 21h
ret
CLOSE_PROG endp
end main
либо так:
Код:
.model small
.stack 100h

PRINT_STR_R MACRO STR, STRLEN, POS_R, POS_ST
local POS_PRINT_R
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
POS_PRINT_R:
	; ...текст отстутсвует
LOOP POS_PRINT_R
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

PRINT_STR_S MACRO STR, STRLEN, POS_R, POS_ST
local POS_PRINT_S
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
POS_PRINT_S:
	; ...текст отстутсвует
LOOP POS_PRINT_S
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

clear_screan	macro
	mov ax, 0600h
	mov bh, 05
	mov cx, 0000
	mov dx, 184fh
	int 10h
	endm
.data
	; ...текст отстутсвует
.code
main proc
	call INIT
	clear_screan

	PRINT_STR_R str1, strlen1, 12, 63
	PRINT_STR_R str1, strlen1, 24, 63
	PRINT_STR_S str2, strlen2, 13, 63
	PRINT_STR_S str2, strlen2, 12, 79

	call CLOSE_PROG 

main endp

INIT proc
	mov ax, @data
	mov ds,ax
	sub ax,ax
ret
INIT endp

CLOSE_PROG proc
	mov ah,4ch
	mov al,0
	int 21h
ret
CLOSE_PROG endp
end main
__________________
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru

Последний раз редактировалось alexcoder; 01.03.2010 в 09:36.
alexcoder вне форума   Ответить с цитированием
Старый 01.03.2010, 22:37   #9
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Адрес: Киев, Ладыжин
Сообщений: 42
Репутация: 16

icq: 440876534
skype: xVxSeRGxVx
По умолчанию

Цитата:
Сообщение от alexcoder Посмотреть сообщение
Посмотри внимательней, я исправил, теперь компилируется:


либо так:
Код:
.model small
.stack 100h

PRINT_STR_R MACRO STR, STRLEN, POS_R, POS_ST
local POS_PRINT_R
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
POS_PRINT_R:
	; ...текст отстутсвует
LOOP POS_PRINT_R
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

PRINT_STR_S MACRO STR, STRLEN, POS_R, POS_ST
local POS_PRINT_S
	push ax
	push bx
	push cx
	push dx
	; ...текст отстутсвует
POS_PRINT_S:
	; ...текст отстутсвует
LOOP POS_PRINT_S
	pop dx
	pop cx
	pop bx
	pop ax
	ENDM

clear_screan	macro
	mov ax, 0600h
	mov bh, 05
	mov cx, 0000
	mov dx, 184fh
	int 10h
	endm
.data
	; ...текст отстутсвует
.code
main proc
	call INIT
	clear_screan

	PRINT_STR_R str1, strlen1, 12, 63
	PRINT_STR_R str1, strlen1, 24, 63
	PRINT_STR_S str2, strlen2, 13, 63
	PRINT_STR_S str2, strlen2, 12, 79

	call CLOSE_PROG 

main endp

INIT proc
	mov ax, @data
	mov ds,ax
	sub ax,ax
ret
INIT endp

CLOSE_PROG proc
	mov ah,4ch
	mov al,0
	int 21h
ret
CLOSE_PROG endp
end main
ДА, это именно то, спасибо!!!! я сегодня утречком так и сделал, а только зашёл сюда, что бы ответ написать, а тут исправление уже есть есть, я прописал local перед циклом.
а что значит, если мы @@ или @b , а то я что-то не могу понять принцип работы

Последний раз редактировалось xVxSeRGxVx; 01.03.2010 в 22:48.
xVxSeRGxVx вне форума   Ответить с цитированием
Старый 01.03.2010, 23:49   #10
alexcoder
Участник клуба
 
Регистрация: 31.05.2009
Сообщений: 762
Репутация: 454

skype: alexcoder1
По умолчанию

Это фишка масма. @b - ближайшая метка @@, просматриваемая в обратном направлении от перехода(backward). @f - ближайшая метка @@ вперед(forward).
__________________
Помощь с программами:
vk.com/alexcoder1
e-mail: informatik101@mail.ru
alexcoder вне форума   Ответить с цитированием
Ответ

Опции темы

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

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

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

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пожирнение текста на StatusBar'е при многократном Repaint'e TwiX Общие вопросы Delphi 10 07.02.2010 19:52
выдает ошибку при вызове scanf Wi1D Общие вопросы C/C++ 6 27.12.2009 20:53
Ошибка сегментации при вызове system("PAUSE") Lavisa Общие вопросы C/C++ 9 01.08.2009 18:14
Ошибка сегментации при вызове system("PAUSE") Lavisa Помощь студентам 0 29.07.2009 17:43


01:34.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.