










Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Material Type: Notes; Professor: Carver; Class: Computer Systems and Programm; Subject: Computer Science; University: George Mason University; Term: Unknown 1989;
Typology: Study notes
1 / 18
This page cannot be seen from the preview
Don't miss anything!











Setting Testing
If-then-else Varieties of Loops Switch Statements lecture9.ppt
Used to detect unsigned overflow
(a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)
Used for unsigned comparisons
(a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)
Useful to have one of the operands be a mask
int max(int x, int y) { if (x > y) return x; else return y; } _max: pushl %ebp movl %esp,%ebp movl 8(%ebp),%edx movl 12(%ebp),%eax cmpl %eax,%edx jle L movl %edx,%eax L9: movl %ebp,%esp popl %ebp ret Body Set Up Finish
movl 8(%ebp),%edx # edx = x movl 12(%ebp),%eax # eax = y cmpl %eax,%edx # x : y jle L9 # if <= goto L movl %edx,%eax # eax = x L9: # Done: int goto_max(int x, int y) { int rval = y; int ok = (x <= y); if (ok) goto done; rval = x; done: return rval; } Skipped when x ≤ y
Closer to machine-level programming style
int fact_do (int x) { int result = 1; do { result *= x; x = x-1; } while (x > 1); return result; }
int fact_goto(int x) { int result = 1; loop: result *= x; x = x-1; if (x > 1) goto loop ; return result; }
int fact_while (int x) { int result = 1; while (x > 1) { result *= x; x = x-1; }; return result; }
int fact_while_goto (int x) { int result = 1; loop: if (!(x > 1)) goto done ; result *= x; x = x-1; goto loop ; done: return result; }
int fact_while(int x) { int result = 1; while (x > 1) { result *= x; x = x-1; }; return result; }
int fact_while_goto (int x) { int result = 1; if (!(x > 1)) goto done ; loop: result *= x; x = x-1; if (x > 1) goto loop ; done: return result; }
while ( Test ) Body
if (! Test ) goto done ; do Body while( Test ); done :
if (! Test ) goto done ; loop : Body if ( Test ) goto loop ; done :
zi = 1 when pi = 0 zi = x when pi = 1
/* Compute x raised to nonnegative power p / int ipwr_for(int x, unsigned p) { int result; for (result = 1; p != 0; p = p>>1) { if (p & 0x1) result = x; x = xx; } return result; } n– 1 times Example 310 = 3^2 *** 3^8 = 3^2 *** ((3*^2 ) 2 ) 2
for ( Init ; Test ; Update ) Body Init ; while ( Test ) { Body Update ; }
Init ; if (! Test ) goto done ; loop: Body Update ; if ( Test ) goto loop ; done:
Init ; if (! Test ) goto done ; do { Body Update ; } while ( Test ) done :
result = 1
p != 0
p = p >> 1
if (p & 0x1) result = x; x = xx; }
Init ; if (! Test ) goto done ; loop : Body Update ; if ( Test ) goto loop ; done : result = 1; if (p == 0) goto done ; loop : if (p & 0x1) result = x; x = xx; p = p >> 1; if (p != 0) goto loop ; done :
Good if few cases Slow if many
Lookup branch target Avoids conditionals Possible when cases are small integer constants
Picks one based on case structure
No default given typedef enum {ADD, MULT, MINUS, DIV, MOD, BAD} op_type; char unparse_symbol(op_type op) { switch (op) { case ADD : return '+'; case MULT: return '*'; case MINUS: return '-'; case DIV: return '/'; case MOD: return '%'; case BAD: return '?'; } }
Code Block 0 Targ0: Code Block 1 Targ1: Code Block 2 Targ2: Code Block n– 1 Targ n -1:
Targ Targ Targ Targ n -
jtab: target = JTab[op]; goto *target; switch(op) { case val_0: Block 0 case val_1: Block 1
.section .rodata .align 4 .L57: .long .L51 #Op = 0 .long .L52 #Op = 1 .long .L53 #Op = 2 .long .L54 #Op = 3 .long .L55 #Op = 4 .long .L56 #Op = 5
movl $43,%eax # ’+’ jmp .L .L52: movl $42,%eax # ’*’ jmp .L .L53: movl $45,%eax # ’-’ jmp .L .L54: movl $47,%eax # ’/’ jmp .L .L55: movl $37,%eax # ’%’ jmp .L .L56: movl $63,%eax # ’?’
.L49: # Done: movl %ebp,%esp # Finish popl %ebp # Finish ret # Finish
08048718 : 8048718: 55 pushl %ebp 8048719: 89 e5 movl %esp,%ebp 804871b:8b 45 08 movl 0x8(%ebp),%eax 804871e: 83 f8 05 cmpl $0x5,%eax 8048721: 77 39 ja 804875c 8048723:ff 24 85 c0 8b jmp *0x8048bc0(,%eax,4)
E xamine 6 he xadecimal format “ words” (4-bytes each) Use command “ help x ” to get format documentation
8048730:b8 2b 00 00 00 movl 8048735:eb 25 jmp 8048737:b8 2a 00 00 00 movl 804873c:eb 1e jmp 804873e:89 f6 movl 8048740:b8 2d 00 00 00 movl 8048745:eb 15 jmp 8048747:b8 2f 00 00 00 movl 804874c:eb 0e jmp 804874e:89 f6 movl 8048750:b8 25 00 00 00 movl 8048755:eb 05 jmp 8048757:b8 3f 00 00 00 movl
0x 0x 0x 0x 0x 0x
Would require 1000 entries
/* Return x/111 if x is multiple && <= 999. -1 otherwise */ int div111(int x) { switch(x) { case 0: return 0; case 111: return 1; case 222: return 2; case 333: return 3; case 444: return 4; case 555: return 5; case 666: return 6; case 777: return 7; case 888: return 8; case 999: return 9; default: return -1; } }
movl 8(%ebp),%eax # get x cmpl $444,%eax # x: je L jg L cmpl $111,%eax # x: je L jg L testl %eax,%eax # x: je L jmp L
...
movl $1,%eax jmp L L6: movl $2,%eax jmp L L7: movl $3,%eax jmp L L8: movl $4,%eax jmp L
...
< ≠ (^) = > = < > = < > = < > = ≠ (^) = ≠ (^) = ≠ (^) = = ≠ = ≠