Answer:
;Macro mReadInt definition, which take two parameters
;one is the variable to save the number and other is the length
;of the number to read (2 for 16 bit and 4 for 32 bit) .
%macro mReadInt 2
mov eax,%2
cmp eax, "4"
je read2
cmp eax, "2"
je read1
read1:
mReadInt16 %1
cmp eax, "2"
je exitm
read2:
mReadInt32 %1
exitm:
xor eax, eax
%endmacro
;macro to read the 16 bit number, parameter is number variable
%macro mReadInt16 1
mov eax, 3
mov ebx, 2
mov ecx, %1
mov edx, 5
int 80h
%endmacro
;macro to read the 32 bit number, parameter is number variable
%macro mReadInt32 1
mov eax, 3
mov ebx, 2
mov ecx, %1
mov edx, 5
int 80h
%endmacro
;program to test the macro.
;data section, defining the user messages and lenths
section .data
userMsg db 'Please enter the 32 bit number: '
lenUserMsg equ $-userMsg
userMsg1 db 'Please enter the 16 bit number: '
lenUserMsg1 equ $-userMsg1
dispMsg db 'You have entered: '
lenDispMsg equ $-dispMsg
;.bss section to declare variables
section .bss
;num to read 32 bit number and num1 to rad 16-bit number
num resb 5
num1 resb 3
;.text section
section .text
;program start instruction
global _start
_start:
;Displaying the message to enter 32bit number
mov eax, 4
mov ebx, 1
mov ecx, userMsg
mov edx, lenUserMsg
int 80h
;calling the micro to read the number
mReadInt num, 4
;Printing the display message
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
;Printing the 32-bit number
mov eax, 4
mov ebx, 1
mov ecx, num
mov edx, 4
int 80h
;displaying message to enter the 16 bit number
mov eax, 4
mov ebx, 1
mov ecx, userMsg1
mov edx, lenUserMsg1
int 80h
;macro call to read 16 bit number and to assign that number to num1
;mReadInt num1,2
;calling the display mesage function
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
;Displaying the 16-bit number
mov eax, 4
mov ebx, 1
mov ecx, num1
mov edx, 2
int 80h
;exit from the loop
mov eax, 1
mov ebx, 0
int 80h
Explanation:
For an assembly code/language that has the conditions given in the question, the program that tests the macro, passing it operands of various sizes is given below;
;Macro mReadInt definition, which take two parameters
;one is the variable to save the number and other is the length
;of the number to read (2 for 16 bit and 4 for 32 bit) .
%macro mReadInt 2
mov eax,%2
cmp eax, "4"
je read2
cmp eax, "2"
je read1
read1:
mReadInt16 %1
cmp eax, "2"
je exitm
read2:
mReadInt32 %1
exitm:
xor eax, eax
%endmacro
;macro to read the 16 bit number, parameter is number variable
%macro mReadInt16 1
mov eax, 3
mov ebx, 2
mov ecx, %1
mov edx, 5
int 80h
%endmacro
;macro to read the 32 bit number, parameter is number variable
%macro mReadInt32 1
mov eax, 3
mov ebx, 2
mov ecx, %1
mov edx, 5
int 80h
%endmacro
;program to test the macro.
;data section, defining the user messages and lenths
section .data
userMsg db 'Please enter the 32 bit number: '
lenUserMsg equ $-userMsg
userMsg1 db 'Please enter the 16 bit number: '
lenUserMsg1 equ $-userMsg1
dispMsg db 'You have entered: '
lenDispMsg equ $-dispMsg
;.bss section to declare variables
section .bss
;num to read 32 bit number and num1 to rad 16-bit number
num resb 5
num1 resb 3
;.text section
section .text
;program start instruction
global _start
_start:
;Displaying the message to enter 32bit number
mov eax, 4
mov ebx, 1
mov ecx, userMsg
mov edx, lenUserMsg
int 80h
;calling the micro to read the number
mReadInt num, 4
;Printing the display message
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
;Printing the 32-bit number
mov eax, 4
mov ebx, 1
mov ecx, num
mov edx, 4
int 80h
;displaying message to enter the 16 bit number
mov eax, 4
mov ebx, 1
mov ecx, userMsg1
mov edx, lenUserMsg1
int 80h
;macro call to read 16 bit number and to assign that number to num1
;mReadInt num1,2
;calling the display mesage function
mov eax, 4
mov ebx, 1
mov ecx, dispMsg
mov edx, lenDispMsg
int 80h
;Displaying the 16-bit number
mov eax, 4
mov ebx, 1
mov ecx, num1
mov edx, 2
int 80h
;exit from the loop
mov eax, 1
mov ebx, 0
int 80h