Q. Define looping in assembly language?
LOOPING
; Program: Assume a constant inflation factor that is added to a series of prices
; stored in the memory. The program copies the new price over the old price. It is
; assumed that price data is available in BCD form.
; The algorithm:
; Repeat
; Read a price from the array
; Add inflation factor
; Adjust result to correct BCD
; Put result back in array
; Until all prices are inflated
; REGISTERS: Uses DS, CS, AX, BX, CX
; PORTS : Not used
ARRAYS SEGMENT
PRICE DB 36h, 55h, 27h, 42h, 38h, 41h, 29h, 39h
ARRAYS ENDS
CODE SEGMENT
ASSUME CS:CODE, DS: ARRAYS
START: MOV AX, ARRAYS; Initialize data segment
MOV DS, AX; register using AX
LEA BX, PRICES; initialize pointer to base of array
MOV CX, 0008h; Initialise counter to 8 as array have 8
; Values.
DO_NEXT: MOV AL, [BX] ; Copy a price to AL. BX is addressed in
; Indirect mode.
ADD AL, 0Ah ; Add inflation factor
DAA ; Make sure that result is BCD
MOV [BX], AL ; Copy result back to the memory
INC BX ; increment BX to make it point to next price
DEC CX ; Decrement counter register
JNZ DO_NEXT : If not last, (last would be when CX will
; become 0) Loop back to DO_NEXT
MOV AH, 4CH ; Return to DOS
INT 21H
CODE ENDS
END START
Discussion:
Please note the use of instruction: LEA BX, PRICES: It would load BX register with offset of the array PRICES in data segment. [BX] is an indirection through BX and comprises the value stored at that element of array. PRICES. BX is incremented to point to next element of array. CX register acts as a loop counter and is decremented by one to keep a check of the bounds of array. As soon as CX register becomes zero, zero flag is set to 1. JNZ instruction keeps track of value of CX and loop terminates when zero flag is 1 as JNZ doesn't loop back. The same program can be written by LOOP instruction in such case DEC CX and JNZ DO_NEXT instructions are substituted by LOOP DO_NEXT instruction. LOOP decrements value of CX and jumps to given label only if CX isn't equal to zero.