Assembly Language Programming Lecture 7 PDF

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

Use Quizgecko on...
Browser
Browser