





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
An analysis of various control structures in c programming language, including if-then-else, do-while, while, and switch statements. It also discusses their assembly code equivalents and the use of jump tables for large switch statements.
Typology: Study notes
1 / 9
This page cannot be seen from the preview
Don't miss anything!






l Setting l Testing
l If-then-else l Varieties of Loops l Switch Statements class06.ppt
l Used to detect unsigned overflow
(a>0 && b>0 && t<0) || (a<0 && b<0 && t>=0)
l Used for unsigned comparisons
(a>0 && b<0 && (a-b)<0) || (a<0 && b>0 && (a-b)>0)
l Useful to have one of the operands be a mask
l Embedded within first 4 integer registers l Does not alter remaining 3 bytes l Typically use movzbl to finish job
%eax
%edx
%ecx
%ebx
%esi
%edi
%esp
%ebp
%ah %al
%dh %dl
%ch %cl
%bh %bl
int gt (int x, int y) { return x > y; }
movl 12(%ebp),%eax # eax = y cmpl %eax,8(%ebp) # Compare x : y setg %al # al = x > y movzbl %al,%eax # Zero rest of %eax
Note inverted ordering!
Body
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
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
/* 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; }
result x p 1 3 10 1 9 5 9 81 2 9 6561 1 531441 43046721 0
for ( Init ; Test ; Update )
Body
int result; for (result = 1; p != 0; p = p>>1) { if (p & 0x1) result = x; x = xx; }
result = 1
p != 0
p = p >> 1
if (p & 0x1) result = x; x = xx; }
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 :
.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)
l E x amine 6 he x adecimal format “ w ords” (4-bytes each) l Use command “ help x ” to get format documentation
Contents of section .rodata: 8048bc0 30870408 37870408 40870408 47870408 [email protected]... 8048bd0 50870408 57870408 46616374 28256429 P...W...Fact(%d) 8048be0 203d2025 6c640a00 43686172 203d2025 = %ld..Char = % …
8048730: b8 2b 00 00 00 movl $0x2b,%eax 8048735: eb 25 jmp 804875c 8048737: b8 2a 00 00 00 movl $0x2a,%eax 804873c: eb 1e jmp 804875c 804873e: 89 f6 movl %esi,%esi 8048740: b8 2d 00 00 00 movl $0x2d,%eax 8048745: eb 15 jmp 804875c 8048747: b8 2f 00 00 00 movl $0x2f,%eax 804874c: eb 0e jmp 804875c 804874e: 89 f6 movl %esi,%esi 8048750: b8 25 00 00 00 movl $0x25,%eax 8048755: eb 05 jmp 804875c 8048757: b8 3f 00 00 00 movl $0x3f,%eax
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
l 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; } }