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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2017, 09:34   #1
Melamed
Новичок
Джуниор
 
Регистрация: 12.04.2017
Сообщений: 1
Вопрос MASM Определение, что является аргументом макроса

Можно ли в теле макроса определить, что является его аргументом: либо один из регистров центрального процессора, либо ячейка памяти и в зависимости от этого выполнить соответствующие команды? Среда разработки MASM32
Melamed вне форума Ответить с цитированием
Старый 20.04.2017, 21:24   #2
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Можно, но это не такая тривиальная задача.
Я пишу как раз макрос, который будет определять тип аргумента. Как доделаю, выложу в тему http://programmersforum.ru/showthread.php?t=302597 (там будет ооочень много нового). Когда именно это будет - пока не скажу, руки не доходят доделать.

Но идея такова:
Код:
XARG_UNKNOWN	=	0		; неизвестный тип аргумента
XARG_REG	=	1		; регистр
XARG_NUM	=	2		; числовая константа (заданная цифрами или идентификатором)
XARG_LABEL	=	3		; метка/смещение
XARG_VAR	=	4		; переменная
XARG_IND_ADDR	=	5		; косвенная адресация (заданная регистрами)
XARG_DIR_ADDR	=	6		; прямая адресация (заданная числовым значением)

argtype	macro	arg, argtypeid
	local	t, l, r
	t = .type arg
	argtypeid = XARG_UNKNOWN
  	if	t eq 30h		; регистр
	  argtypeid = XARG_REG
	elseif	(t or 4) eq 25h		; метка [TASM=21h; MASM=25h]
	  argtypeid = XARG_LABEL
	elseif	(t or 40h) eq 6Ah	; переменная [TASM=2Ah; MASM=2Ah,6Ah]
	  argtypeid = XARG_VAR
	elseif	(t or 42h) eq 62h	; косвенная адресация (заданный регистрами) [TASM=20h; MASM=22h,2Ah,62h,6Ah]
	  argtypeid = XARG_IND_ADDR
	elseif	t eq 24h		; константа или прямая адресация (заданный числовым значением)
	  l instr <arg>,<[>
	  r instr <arg>,<]>
	  ifelif <(l eq 0) and (r eq 0)>, <argtypeid = XARG_NUM>, <(l ne 0) and (r ne 0)>, <argtypeid = XARG_DIR_ADDR>
	endif
endm
Вызывать: argtype eax,t
После этого константа t будет содержать тип (XARG_REG и пр...)

p.s. ifelif - это однострочный макрос if / elseif / else / endif
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru

Последний раз редактировалось 7in; 20.04.2017 в 21:29.
7in вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Определение разрядности приложения в MASM 7in Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 24.12.2016 21:15
Запуск макроса с аргументом по расписанию any2gambler Microsoft Office Excel 2 25.01.2016 22:20
набор подпрограмм для выполнения операций над числами ( 1.Определение является ли число палиндромом; 2.Реверсирование числа) tweeker Паскаль, Turbo Pascal, PascalABC.NET 1 18.12.2013 19:33
masm и RadASM что не так??? RobinVit Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 06.03.2013 04:00
Что выбрать TASM или MASM для программирования на ассемблере? Alabay Помощь студентам 1 11.01.2009 11:48