Indefinite repeat argument directive Format .IRP symbol,<argument list> . . . range . . . .ENDR
1 – Parameters
symbol A formal argument that is successively replaced with the specified actual arguments enclosed in angle brackets (<>). If no formal argument is specified, the assembler displays an error message. <argument list> A list of actual arguments enclosed in angle brackets and used in expanding the indefinite repeat range. An actual argument can consist of one or more characters. Multiple arguments must be separated by a legal separator (comma, space, or tab). If no actual arguments are specified, no action is taken. range The block of source text to be repeated once for each occurrence of an actual argument in the list. The range can contain macro definitions and repeat ranges. .MEXIT is legal within the range and causes the current and remaining repetitions to be aborted.
2 – Description
.IRP replaces a formal argument with successive actual arguments specified in an argument list. This replacement process occurs during the expansion of the indefinite repeat block range. The .ENDR directive specifies the end of the range. .IRP is similar to a macro definition with only one formal argument. At each successive expansion of the repeat block, this formal argument is replaced with successive elements from the argument list. The directive and its range are coded in line within the source program. This type of macro definition and its range do not require calling the macro by name, as do other macros described in this section. .IRP can appear either inside or outside another macro definition, indefinite repeat block, or repeat block (see the description of .REPEAT). The rules for specifying .IRP arguments are the same as those for specifying macro arguments.
3 – Example
The macro definition is as follows: .macro CHECK_PROCEDURE_KIND PROCEDURE_KIND OK = 0 ; Assume procedure_kind is unknown .irp REFERENCE_KIND,BOUND,NULL, REGISTER,STACK .if identical, <PROCEDURE_KIND>, <REFERENCE_KIND> OK = 1 ; Procedure_kind is known .mexit ; No need to look further .endc .endr .if eq, OK ; If unknown procedure kind .error "Unknown procedure kind: PROCEDURE_KIND" .endc .endm CHECK_PROCEDURE_KIND CHECK_PROCEDURE_KIND REGISTER CHECK_PROCEDURE_KIND FOOZLE The macro call and expansion of the previously defined macro is as follows: CHECK_PROCEDURE_KIND REGISTER OK = 0 ; Assume procedure kind is unknown .if identical,<REGISTER>,<BOUND> .endc .if identical,<REGISTER>,<NULL> .endc .if identical,<REGISTER>,<REGISTER> OK = 1 ; Procedure kind is known .mexit ; No need to look further .if eq, OK ; If unknown procedure kind .endc CHECK_PROCEDURE_KIND FOOZLE OK = 0 ; Assume procedure kind is unknown .if identical,<FOOZLE>,<BOUND> .endc .if identical,<FOOZLE>,<NULL> .endc .if identical,<FOOZLE>,<REGISTER> .endc .if identical,<FOOZLE>,<STACK> .endc .if eq, OK ; If unknown procedure kind .error "Unknown procedure kind: FOOZLE" .endc In this example the CHECK_PROCEDURE_KIND macro uses the .IRP directive to iterate over a list of reference keywords to determine if its argument matches one of the reference keywords. If a match is not found, the macro displays an error message.