
CS485G Spring 2015 24
(b) %ebx, %esi, %edi are non-volatile (callee-save) general-purpose
registers.
(c) %esp and %ebp are non-volatile (callee-save) special-purpose
registers.
5. Example
1 int bitCount(unsigned x) {
2 if (x == 0)
3 return 0;
4 else
5 return (x & 1) + bitCount(x >> 1)
6 }
bitCount:
pushl %ebp # save %ebp (non-volatile)
movl %esp, %ebp # new %ebp
pushl %ebx # save b (non-volatile)
subl $4, %esp # room for p1
movl 8(%ebp), %ebx # b = x
movl $0, %eax # a = 0
testl %ebx, %ebx # x ==? 0
je .L3 # if (x==0) jump
movl %ebx, %eax # a = x
shrl %eax # a = x >> 1
movl %eax, (%esp) # p1 = x >> 1
call bitCount # a = bitCount(p1)
movl %ebx, %edx # d = x
andl $1, %edx # d = x & 1
leal (%edx,%eax), %eax # a = (x&1) + bitCount(p1)
.L3:
addl $4, %esp # remove p1
popl %ebx # restore b
popl %ebp # restore ebp
ret # return
24 Code for local variables, pointers
1. Lecture 14, 2/18/2015
Comentarios a estos manuales