460 likes | 564 Views
Microprocessor Programming II. To discuss more complicated programming techniques Flag control instructions Compare and jump Subroutines Loop and string instructions. Flag instructions. Can affect the setting of flags directly Can store value of AH into flags Can clear/set the carry
E N D
Microprocessor Programming II • To discuss more complicated programming techniques • Flag control instructions • Compare and jump • Subroutines • Loop and string instructions
Flag instructions • Can affect the setting of flags directly • Can store value of AH into flags • Can clear/set the carry • Can clear/set interrupt • Complement carry flag (0->1 , 1->0)
Flag instruction • Can you identify one application for clearing the carry flag? • Example before a rotation through carry • Example if you want to calculate the average value of a series of data, the first time you use ADC
Compare instruction • To compare two 8-bit or 16-bit numbers • Operands can stored in Register, memory, ACC (AX), or an immediate • The compare operation will affect the following flags: overflow, sign, zero, auxiliary carry, parity, and carry • Instruction mnemonic is CMP • Usually use compare operation when decision to branch (or jump) is required
Compare • In the compare operation, the source operand is subtracted from the destination operand • But the result of the subtraction is not saved (i.e. the values in the source and destination did not change) • Flags are changed according to the subtraction result • After the compare, we can do a conditional jump based on the flags status
Compare • In C++ , we do if(x==0) • cmp x, #00h (compare X and 0 so if x = 0 then x-0 will set the zero flag!!) • JZ abc ; JZ – jump if zero flag is set
Exercise • Want to do if (AX > 10) • After cmp AX, #10 then which flag should be checked?
Example • CMP 10011001, 00011011 • Do 10011001 - 00011011 • Results of flags after the compare • AF is set • CF is clear • OF is set • PF is set • SF is clear • ZF is clear
Exercise Describe what will happen to the status flags (C, S, O, Z) as the sequence of instructions that follow is executed MOV AX, 1234H MOV BX, ABCDH ; this is a 16-bit value CMP AX, BX Assume that initially all flags are reset (0) The CF=1
Change the flow of the program The flow of a program can also be changed by: jump Conditional Jump Subroutine call looping Normal program flow Is top-down jmp abc abc:
Program flow control • Jump (jmp) – after the jump, the program will execute instructions at the jump label and will not return • Syntax: jmp label • Subroutine call (call) – program will go to the location of the subroutine, execute the subroutine and when it finishes return back to the original program • Syntax: call function (or acall function) • Function is a user defined name representing the subroutine
JUMP instruction • To alter the execution path of instructions in the program • By changing the values of the code segment register and the instruction pointer • Program execution is not intended to return to the next sequential instruction after the jump, so no return linkage is saved • Two kinds of jump operation: unconditional and conditional
Unconditional Jump • As its name implies, there are no status (condition) requirements imposed for the jump to occur • As the instruction is executed, the jump always takes place to change the execution sequence Conditional Jump The jump operation depends on some status conditions ( for example jump if Carry is set!) If condition(s) is/are met, then the jump takes place; Otherwise execution continues with the next sequential instruction of the program
Unconditional jump • There are 2 kinds of unconditional jump: intrasegment jump, and intersegment jump • Intrasegment jump is limited to addresses within the current code segment (only the IP value is changed) • Intersegment jump permits jumps from one code segment to another (both CS and IP values are changed)
Examples for unconditional jump • JMP $ -14 • Short-label – an 8-bit number is coded as an immediate operand to specify a signed displacement (+127 to –128) • IP = IP - 14 • JMP START • Near-label – operand specifies a new value of IP with a 16-bit displacement • START is a label
Intersegment jump • Use a 32-bit immediate operand to specify the jump address • The operand can be called a far-label • The first 16 bits are loaded to IP and the next 16 bits are loaded into the CS
Example of unconditional jump XOR BX,BX ; why doing this ????? Start: mov AX, #1 ADD AX,BX JMP NEXT NEXT: mov BX, AX JMP start
Conditions • Conditions that can be referenced by a conditional jump: CF, PF and OF • Mnemonic for some condition jump operations • JC jump if CF=1 • JS jump if SF=1 (could set by CMP, SUB, ADD, AND, OR, XOR ) • JB jump if CF =1 (but CF is set after a CMP operation ) • JNL jump if first operand is not less than second operand in the CMP operation (SF = OF)
Exercise • The program that follows implements what is known as a delay loop • MOV CX, 1000 • DLY: DEC CX JNZ DLY ; jump if not zero (zero is specified by what?) NXT: ----- How many times does the JNZ DLY get executed? Change the program so that JNZ DLY is executed just 17 times
Need to store the return address!!!! But in where? Subroutine call
PUSH and POP • PUSH and POP are used to stored data onto the stack. Stack is used as a temporary storage • When performing PUSH AX ; value of AH is stored in SP-1, value of AL is stored in SP-2, the new value of SP is SP-2 • SP – stack pointer (offset) • During a POP AX • Content of SP is stored in AL • Content of SP+1 is stored in AH • New value of SP is SP+2
Stack operation TOS – Top Of Stack
Subroutines • A subroutine is a special segment of program that can be called for execution from any point in a program (similar to a function in C program) • To invoke a subroutine, we perform a CALL • Using subroutines can reduce the size of the program and make the program easy to read • When performing a CALL operation, value of IP is changed in order to branch to the location of the subroutine • When the subroutine is completed then the program returns to the main program so the last statement in the subroutine must be RETURN
Subroutine • There are intrasegment call and intersegment call • During a CALL operation, value of IP is stored in the STACK • The IP value saved is the instruction following the CALL operation • Example: CALL 1234 (1234 is a 16-bit displacement that gets added to IP) • Example: Call delay • Delay is the name of a subroutine
RETURN operation • Mnemonic for RETURN is RET • During the return operation, value of IP or both the values of IP and CS that were saved on the stack to be returned back to their corresponding registers
Example Write a procedure named SUM that adds 2 numbers 5 and 31 together and places their sum in DX. Assume that this procedure is to be called from another procedure in the same code segment and that at the time it is to be called, DX contains the value of ABCD16 and this value must be saved at entry of the procedure and restored at its completion.
Sample solution Sum: push dx mov dx, 5 add dx,31 pop dx ret
Loop instructions • A mechanism to repeat a sequence of operations repeatedly • Three different operations: loop, loope/loopz, and loopne/loopnz • The number of looping is stored in CX
Looping • Whenever LOOP is executed, the contents of CX are first decremented by 1 and then checked to determine if they are equal to 0 • If CX equals to 0, then return to the instruction following the loop statement
Example Syntax of the loop operation mov cx, count Next: …….. Loop Next Loop repeated Do something else Check CX For ADuC832, one looping function is DJNZ (do jump if not zero )
Loop while equal (loope) • Loop while equal (loope) checks the contents of both CX and the ZF flag. Each time the loop instruction is executed, CX decrements by 1 without affecting the flags, its contents are checked for 0, and the state of ZF that results from execution of the previous instruction is tested for. • Loope (loop if CX != 0 and ZF = 1) • Loopne (loop if CX != 0 and ZF = 0)
Exercise Given the following sequence of instructions: mov AX, 0 mov DS, AX mov AL, 05 mov DI, A000 mov CX, 0FH Again: inc DI cmp [DI], AL loopne Again Next: Explain what will happen as they are executed Ans. Search for 05 for addresses A001H to A010H
String instructions • String refers to a series of data words (or bytes) that reside in consecutive memory locations. • In C++, you get the strcpy function • Can move a data from a block of memory to a block elsewhere • To scan a string of data elements stored in memory looking for a specific value • To compare two strings • Five basic string instructions
FFFF FFFF d SI DI a 0000 0000 Memory (Data Segment) Memory (Extra Segment) String Operation String db “abcd” Source Destination
String operations • The instructions MOVS, MOVSB, MOVSW all perform the same basic operation. • An element of the string specified by the source index (SI) register with respect to the current data segment (DS) register is moved to the location specified by the destination index (DI) register with respect to the current extra segment (ES) register • It can be a byte or word operation • After the move is completed, the contents of both SI and DI are automatically incremented or decremented by 1 for byte move, or by 2 for word move
Direction flag Direction flag selects the auto-increment or the auto-decrement operation for the DI and SI registers during string operations. The direction flag is used only with the string instructions. CLD – clear direction flag (D=0 auto increment) STD – set (D=1 auto decrement)
Move string • Increment or decrement is controlled by the direction flag DF • Example of copying N bytes of characters from blk1addr to blk2addr • Mov AX, datasegaddr ; load AX with data segment • Mov DS, AX ; address • Mov ES, AX ; ES = DS point to the same segment • LEA SI, blk1addr ; note this is moving the address • LEA DI, blk2addr • Mov CX, N • CLD ; clear the direction flag - increment • Next: movsb • Loop next • HLT ; halt = stop
Compare strings • Compare operations perform: subtracts the destination operand from the source operand and adjusts flags CF, PF, AF, ZF, SF, and OF accordingly. • The result of subtraction is not saved • Operation does not affect the operands • Example • cmpsb ; compare byte no operand • Source is pointed to by the address in SI • Destination is specified by DI • SI and DI are updated after the operation and pointed to the next element
Scan string • Scan string – look for a character (target) in a string • AL, or AX stores a target element • Destination string is referred by DI and ES • Flags are adjusted based on the operation and DI incremented or decremented
Example for scan • Example: mov Ax, 0 • mov DS, AX • mov ES, AX • mov AL, 05H • mov DI, A000H • mov CX, 0F • CLD ; clear direction flag • Again: scasb ; scan byte no operand • loopne again ; stop if find the same byte • Next:
Load and store string • To move string elements between the accumulator (AX or AL) and memory • LODS loads either a byte or a word from a string in memory into AL or AX, respectively • Address is derived from SI and DS • Example: LODSW • Load AX with a word • Value of SI is incremented by 2 • STOS stores a byte from AL or a word from AX into a string location in memory • Location is generated by ES and DI
Example mov AX, 0 mov DS, AX mov ES, AX mov AL, 05 mov DI, A000 mov CX, 0F CLD Again: stosb loopne again Next: Store the value 5 into location A000 to A00F
Exercise Describe what will happen as the following sequence of instructions is executed CLD Mov AX, data_segment Mov DS, AX Mov AX, extra_segment Mov ES, AX Mov CX, 20 LEA SI, offset_master LEA DI, offset_copy Ops: CMPSB Loop ops Ans. The two strings are compared for 20 bytes