Assembly Language Programming Lecture 7 PDF
Document Details
Uploaded by SmoothestSunstone
UMass Boston
Tags
Summary
This lecture provides an overview of conditional codes and jump instructions in assembly language programming.
Full Transcript
Assembly Language Programming III: Condition codes and jump instructions 1 Homework • Reading – PAL, pp 127-152 • Labs – Continue labs with your assigned section 2 Jumps and Flow of Control • In assembly language, there are NO “if-else”, “for”, “do”, or “do … while” statements as in C • Must...
Assembly Language Programming III: Condition codes and jump instructions 1 Homework • Reading – PAL, pp 127-152 • Labs – Continue labs with your assigned section 2 Jumps and Flow of Control • In assembly language, there are NO “if-else”, “for”, “do”, or “do … while” statements as in C • Must use some combination of conditional and unconditional “jump” instructions for if-else branching or looping • Jump instruction is similar to a C “go to” • Jump instruction is similar to “call” instruction, but it doesn’t push a return address via %esp 3 Jumps and Flow of Control • When the processor is fetching and executing instructions, it follows this cycle: – Fetches an instruction from memory using %eip – Executes the instruction – Increments %eip to point to the next instruction • When a jump is executed, the last step of the fetch and execute cycle may be the loading of a different value into the %eip instead of the address for the next instruction in sequence 4 Jumps and Flow of Control • Because there are no “structured programming” statements in assembly language, it may not be possible to use pseudo-code for the design • The design technique that best supports logic for an assembly language program is the flowchart • The flow chart has circles that represent labels and arrows that represent go-to’s 5 Jumps and Flow of Control • If-else in C One or more flags test are set or reset if (test) statement1; else statement2; Conditional Jump False True statement1 statement2 Unconditional Jump 6 Jumps and Flow of Control • If-else in assembly code: cmpl $0, %eax jnz else ... jmp end # test value of eax for zero … # statement1 # and jump over statement2 # just a label # statement2 … # next instruction after if-else else: end: 7 Jumps and Flow of Control • Iterative Loop in C while (test) { body; } test Conditional Jump One or more flags are set or reset False True body Unconditional Jump 8 Jumps and Flow of Control • While loop in assembly code: movl $3, %eax # loop three times while: # note – just a label cmpl $0, %eax # test value of eax for zero jz end # exit if counted down to zero … # body of loop here subl $1, %eax # decrement eax jmp while # loop end: … # next instruction after loop 9 Unconditional Jumps • “Unconditional jump” always loads %eip with a new value: – Hard coded address jmp 0x10ec # hard coded address . . . – Label for address jmp label # address of a label . . . label: 10 An Infinite Loop • The following is an infinite loop based on a single unconditional jump instruction: movl movl xyz: addl jmp $0, %eax $2, %ecx %ecx, %eax xyz 11 Conditional Jumps • “Conditional jump” may or may not load %eip with a new value • When your code performs instructions, specific flags in %eflag may get set (=1) or reset (=0) • Depends on the definition of the instruction: addb %bl, %al %al # affects zero and carry flags 1 0 1 1 0 0 0 1 %bl Carry Flag 1 0 0 1 0 0 1 0 Zero Flag %al 1 0 1 0 0 0 0 1 1 0 12 Flags • Flags are set by arithmetic or logical instructions: – – – – – – Carry Flag – Set by a carry out / borrow in at MSB Zero Flag – Set if entire byte, word, or long = = 0 Sign Flag – Set if sign bit = = 1 Parity Flag – Set if 8 LSB’s contain an even number of 1’s Overflow Flag – Set by a carry into sign bit w/o a carry out Auxiliary Carry Flag(Adjust Flag) – Set by a carry / borrow in 4 LSBs • These flags are individual bits in the %eflags register • Specific flag settings control the behavior of specific conditional jump instructions • You can find a good description of the carry flag and overflow flag in: – http://teaching.idallen.com/dat2343/10f/notes/040_overflow.txt 13 Carry and Overflow • Carry flag – Set if the addition of two numbers causes a carry out of the most significant (leftmost) bits added 1111 + 0001 = 0000 (carry flag is turned on) – set if the subtraction of two numbers requires a borrow into the most significant (leftmost) bits subtracted. 0000 - 0001 = 1111 (carry flag is turned on) 14 Carry and Overflow (cont’d) • Overflow flag – Set if the sum of two numbers with the sign bits off yields a result number with the sign bit on 0100 + 0100 = 1000 (overflow flag is turned on) – Set if the sum of two numbers with the sign bits on yields a result number with the sign bit off 1000 + 1000 = 0000 (overflow flag is turned on) 15 Conditional Jumps • Operation of conditional jump: If (state of specific flags) Load a new value based on operand into %eip Else Let the %eip be incremented to next sequential instruction • Examples: jz label js label jnz label jns label . . . label: # # # # if if if if zero sign zero sign flag flag flag flag is set is set not set not set 16 Conditional Jumps • Be careful about the meaning of flag bits! • C code: if (al < bl) eax = 1; else eax = 0; /* compute boolean value */ • Gas code (buggy): # assume values already in %al and %bl subb %bl, %al # set/reset sign flag js sib # jump if sign flag set movl $0, %eax # %al is bigger or = jmp end # don’t fall through sib: movl $1, %eax # %bl is bigger end: ret # return value 0 or 1 • Bug is ignoring overflow flag! 17 Signed Comparisons • Is it true? A < B is true if and only if A – B is negative • Not with fixed register sizes that can overflow! Example test in signed character (1 byte) arithmetic: Is 100 < -50? No, but 100 - (-50) = -106 (Due to overflow!) 100 01100100 - -50 + 00110010 (Add two’s complement of -50) - 106 10010110 (Sets sign flag and sets overflow flag) Note: Overflow-the sum of two numbers with the sign bits off yields a resulting number with the sign bit on! 18 Signed Comparisons • If overflow occurs, the sign flag value will be the opposite of what it should be! • So we need our jump condition to be: – If overflow flag == 0, jump if sign flag == 1 – If overflow flag == 1, jump if sign flag == 0 • Same as: – Jump if (sign flag XOR overflow flag) == 1 – Hence, useful Intel instruction “jump less than”: jl label # jump if (SF xor OV) is set 19 Signed Comparisons • Proper interpretation of flag bits! • C code: if (al < bl) eax = 1; else eax = 0; /* compute boolean value */ • Gas code (bug fixed for SIGNED data): # assume values already in %al and %bl subb %bl, %al # set/reset sign flag jl sib # jump less than movl $0, %eax # %al is bigger or = jmp end # don’t fall through sib: movl $1, %eax # %bl is bigger end: ret # return value 0 or 1 20 Signed Comparisons • Compare Command – Sets the flags according to a subtraction – Does not save the result of the subtraction – Does not overwrite values in the registers being compared (just sets the flag bits) 21 Signed Comparisons • Proper interpretation of flag bits! • C code: if (al < bl) eax = 1; else eax = 0; /* compute boolean value */ • Gas code (using cmpb instead of subb): # assume values already in %al and %bl cmpb %bl, %al # set/reset flags jl sib # jump less than movl $0, %eax # %al is bigger or = jmp end # don’t fall through sib: movl $1, %eax # %bl is bigger end: ret # return value 0 or 1 22 Conditional Jumps (Signed) • Jump – – – – – – jl jle jg jge je jncc Condition less than less than or equal greater than greater than or equal equal NOT of each of the above conditions 23 Unsigned Comparisons • Is it true?: A < B if and only if A – B is “negative” • Carry Flag will indicate underflow – Example test in unsigned character arithmetic: – Is 100 < 206? (206 = same bits as -50 was before) – Yes (because now the “sign bit” is 27) 100 01100100 - 206 + 00110010 (Add two’s compliment of 206) 150 10010110 (Underflows = goes below zero) Note: Underflow is a “Carry Error” → Set Carry flag! 24 Unsigned Comparisons • Meaning of the carry flag is reversed • A carry means a correct positive result after an unsigned subtraction, so carry flag = 0 • If underflow occurs, the carry flag = 1 will be indicator of an unsigned “negative” result! • So we need our jump condition to be: – If carry == 1, jump – If carry == 0, don’t jump • Hence, useful Intel instruction “jump below”: jb label # jump if CF is set 25 Unsigned Comparisons • Proper interpretation of flag bits! • C code: if (al < bl) eax = 1; else eax = 0; /* compute boolean value */ • Gas code (bug fixed for UNSIGNED data): # assume values already in %al and %bl cmpb %bl, %al # set/reset carry flag jb sib # jump below movl $0, %eax # %al is bigger or = jmp end # don’t fall through sib: movl $1, %eax # %bl is bigger end: ret # return value 0 or 1 26 Conditional Jumps (Unsigned) • Jump – – – – – – jb jbe ja jae je * jncc Condition below below or equal above above or equal equal * NOT of each of the above conditions – * Note: Same instruction as signed jump 27 loop Instruction • Loop instruction = decrement, test, and jump • Instruction explanation: decrement %ecx if %ecx != 0 jump to label else continue in sequence (Back to beginning of loop) (Ends the loop) • Example: movl $0x0a, %ecx # loop 10 times label: … (instructions in loop) loop label … (next instruction after loop)28 Scanning Pointer Problem • Want to sum up the elements in an array of N elements .data iarray: .long 1, 4, 9, 16 # n = 4 in example • The code might look like this: _sumarray:xorl movl movl add1: addl addl loop ret %eax, %eax $4, %ecx $iarray,%edx (%edx), %eax $4,%edx add1 # # # # # # initial sum = 0 initial loop count initial pointer value add in next element bump pointer test and loop 29 inc and dec Instructions • Incrementing and decrementing by one • Useful inside loops • Equivalent to post increment or decrement in C: i++; or i--; /* i is a variable in memory! */ • Incrementing and decrementing registers incl %eax or decl %eax • Incrementing and decrementing memory incl index or decl index 30