Q. Explain Passing Parameters Using Pointers ?
This method overcomes the drawback of using variable names directly in procedure. It uses registers to pass procedure pointers to desired data. Let's explain it more with the help of a program.
Program version 2:
DATA_SEG SEGMENT
BCD DB 25h; Storage for BCD test value
BIN DB? ; Storage for binary value
DATA_SEG ENDS
STACK_SEG SEGMENT STACK
DW 100 DUP (0) ; Stack of 100 words
TOP_STACK LABEL WORD
STACK_SEG ENDS
CODE_SEG SEGMENT
ASSUME CS: CODE_SEG, DS: DATA_SEG, SS: STACK_SEG
START: MOV AX, DATA_SEG ; Initialize data
MOV DS, AX ; segment using AX register
MOV AX, STACK_SEG ; initialize stack
MOV SS, AX; segment. Why stack?
MOV SP, OFFSET TOP_STACK; initialize stack pointer
; Put pointer to BCD storage in SI and DI prior to procedure call.
MOV SI, OFFSET BCD ; SI now points to BCD_IN
MOV DI, OFFSET BIN; DI points BIN_VAL
; (returned value)
CALL BCD_BINARY ; Call the conversion
; Procedure
NOP ; Continue with program
; Here
; PROCEDURE : BCD_BINARY Converts BCD numbers to binary.
; INPUT : SI points to location in memory of data
; OUTPUT : DI points to location in memory for result
; DESTROYS : Nothing
BCD_BINARY PROC NEAR
PUSHF ; Save flag register
PUSH AX; and AX registers
PUSH BX; BX
PUSH CX; and CX
MOV AL, [SI] ; Get BCD value from memory
; For conversion
MOV BL, AL ; copy it in BL also
AND BL, 0Fh ; and mask to get lower 4 digits
AND AL, 0F0h; Separate upper 4 bits in AL
MOV CL, 04 ; initialize counter CL so that upper digit
ROR AL, CL; in AL can be brought to lower 4 bit
; Positions in AL
MOV BH, 0Ah ; Load 10 in BH
MUL BH; Multiply upper digit in AL by 10
; The result is stored in AL
ADD AL, BL ; Add lower BCD digit in BL to result of
; Multiplication
; End of conversion, now restore the original values prior to call. All calls will be in
; reverse order to save above. The result is in AL register.
MOV [DI], AL ; Store binary value to memory
POP CX; Restore flags and
POP BX; registers
POP AX
POPF
RET
BCD_BINARY ENDP
CODE_SEG ENDS
END START
Discussion:
In the program written above DI points to BIN and SI points to the BCD. The instruction MOV AL, [SI] copies the byte pointed by SI to AL register. In the same manner MOV [DI], AL transfers result back to memory location which is pointed by DI.
This scheme allows you to pass procedure pointers to data anywhere in memory. You can pass pointer to individual data element or a group of data elements such as strings and arrays. This scheme is used for parameters passing to BIOS procedures.