$15
Pr 5: Create a macro named mReadInt that reads a 16- or 32-bit signed integer from standard input and returns the value in an argument. mReadInt MACRO intVal Use conditional operators to allow the macro to adapt to the size of the desired result. Write a program that calls the macro, passing it operands of various sizes, either signed or unsigned. If the operand has an unexpected size, should display an error message during assembling, e.g., when you test ; Pass different sizes of arguments ... mReadInt AL ; test the macro's error message the build issues error during assembling because the BYTE AL has an unexpected size 1MASM : error : ************************************************************************ 1MASM : error : Argument AL passed to mReadInt must be either 16 or 32 bits. 1MASM : error : AL must be of 16 or 32-bit data type. 1MASM : error : ************************************************************************ As see above, "Argument AL" is mentioned and no code assembled for AL. If mReadInt bVal as a BYTE, the error message should be "error : Argument bVal passed...". In a valid test, you should be able to pass an argument to mReadInt and get it back to verify like this: mWrite "Enter a 32-bit integer: " mReadInt dVal mWriteInt dVal mWrite "Enter a 16-bit integer: " mReadInt BX mWriteInt BX Here is an output of examples to use DWORD dVal and BX as arguments: Enter a 32-bit integer: 1234000111 dVal = +1234000111 Enter a 16-bit integer: -32000 BX = -32000 Pr 6: Create a macro named mWriteInt that writes a signed integer to standard output by calling WriteInt. The argument passed to the macro can be a positive or negative valued operand. Use conditional operators in the macro so it adapts to the size of the argument. Write a program that demonstrates the macro, passing it arguments of different sizes. You can define bVal SBYTE -2 wVal SWORD -122 dVal DWORD 1234567 qVal QWORD 11 and in code, simply test by invoking mWriteInt six times: mWriteInt bVal mWriteInt wVal mWriteInt dVal mWriteInt AX mWriteInt ebx ; Test the macro's error message mWriteInt qVal But the build issues warning during assembling because the operand qVal has an unexpected size, and then you display an warning message: 1 Assembling [Inputs]... 1MASM : warning : ************************************************************************ 1MASM : warning : Argument qVal passed to mWriteInt must be 8, 16, or 32 bits. 1MASM : warning : ************************************************************************ As see here, "Argument qVal" is indicated and and no code assembled for this qVal. You can check your code either at assembly time and test valid results at run time. The substitution & operator in your macro can make the output like this: bVal = -2 wVal = -122 dVal = +1234567 AX = +13176 ebx = +2130567168 Write three parts into one .ASM file: mReadInt, mWriteInt, and main. Attention to: The Macro parameter intVal can receive either register or memory of any size when being called Compare sizes and assign values between the type-less parameter intVal and the register Accumulator Make push/pop matching in pair in any conditions When test invalid sizes, mReadInt AL and mWriteInt qVal, make sure no code generated in listing Don't use mShow in your homework, but can read it as a good reference