ALIGN0 MACRO looplabel TMP_MACRO_1 MACRO looplabel: ENDM ENDM ALIGN1 MACRO inst1:VARARG TMP_MACRO_2 MACRO inst1 ENDM ENDM ALIGN2 MACRO inst2:VARARG PREV_PC = $ ALIGN 16 CURR_PARA_BOUND = $ ORG PREV_PC TMP_MACRO_2 ;;inst1 inst2 ;;inst2 CURR_PC = $ ALIGN 16 NEXT_PARA_BOUND = $ ORG PREV_PC IF NEXT_PARA_BOUND-CURR_PC EQ 0 ;;insts end on para bound FILL CURR_PARA_BOUND-PREV_PC ELSE IF NEXT_PARA_BOUND-PREV_PC GT 16 ;;insts straddle para bound FILL CURR_PARA_BOUND-PREV_PC ENDIF ENDIF TMP_MACRO_1 ;;looplabel: TMP_MACRO_2 ;;inst1 inst2 ;;inst2 PURGE TMP_MACRO_1 PURGE TMP_MACRO_2 ENDM FILL MACRO arg LOCAL y ;;The FILL macro shows several ;;innovative ways to do nothing. ;;All LEAs and MOVs used here ;;are one-cycle instructions. IF arg EQ 1 ;;This is a 1-byte instruction NOP ENDIF IF arg EQ 2 ;;This is a 2-byte instruction MOV AX,AX ENDIF IF arg EQ 3 ;;This is a 3-byte instruction LEA BP,[BP] ENDIF IF arg EQ 4 ;;Code for LEA DI,[DI+0000] db 08dh,0bdh,000h,000h ENDIF IF arg EQ 5 ;;Code for LEA SI,[SI+0000] db 08dh,0b4h,000h,000h NOP ENDIF IF arg EQ 6 ;;Code for LEA BX,[BX+0000] DB 08dh,09fh,000h,000h MOV AX,AX ENDIF IF arg GT 6 JMP SHORT y DB arg-2 DUP (90h) y: EXITM ENDIF ENDM