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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 28.02.2010, 01:12   #1
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
Смущение Ошибка при многократном вызове макроопределения

Доброго времени суток, уважаемые програмисты.
пишу програму, що выводит текст в виде геометрических фигур, поскольку я лентяй, то для построения прямоугольника я решил написать 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, 20:39   #2
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

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

Код:
.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, 22:45   #4
Doholyan
Форумчанин
 
Регистрация: 26.04.2009
Сообщений: 270
По умолчанию

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

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

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

Да, именно это!
Doholyan вне форума Ответить с цитированием
Старый 01.03.2010, 01:03   #7
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

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

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

Код:
.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 в 08:36.
alexcoder вне форума Ответить с цитированием
Старый 01.03.2010, 21:37   #9
xVxSeRGxVx
Пользователь
 
Регистрация: 28.09.2009
Сообщений: 42
По умолчанию

Цитата:
Сообщение от 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 в 21:48.
xVxSeRGxVx вне форума Ответить с цитированием
Старый 01.03.2010, 22:49   #10
alexcoder
Форумчанин
 
Регистрация: 31.05.2009
Сообщений: 786
По умолчанию

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


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


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