int a = 4; int b = 8; int d = 0; while(b > a) { d = a + 2; b--; }
movl $4, -4(%ebp) movl $8, -8(%ebp) movl $0, -12(%ebp) jmp .L2 .L3: movl -4(%ebp), %eax addl $2, %eax movl %eax, -12(%ebp) subl $1, -8(%ebp) .L2: movl -8(%ebp), %eax cmpl -4(%ebp), %eax jg .L3Location of local variables of the stack (local variables are explained here)
a => -4(%ebp) b => -8(%ebp) d => -12(%ebp)The use of registers as temporary memory is described here
# a = 4 movl $4, -4(%ebp) # b = 8 movl $8, -8(%ebp) # d = 0 movl $0, -12(%ebp) # jump to label .L2. The condition for the while loop is evaluated at .L2 jmp .L2 # The label .L3. This is the start instruction inside while {} .L3: # tmp = a movl -4(%ebp), %eax # tmp = tmp + 2 addl $2, %eax # d = tmp movl %eax, -12(%ebp) # b = b - 1 subl $1, -8(%ebp) # The instruction for evaluating the condition of while starts here .L2: # tmp = b movl -8(%ebp), %eax # compare a to tmp cmpl -4(%ebp), %eax # jump to start of loop block if the above tmp greater than a in above comparison jg .L3
For Loop
Take example of this C code:
int a = 4; int b = 8; int d = 0; for(b = 9; b > a; b--) { d = a + 2; }Generated assembly code:
movl $4, -4(%ebp) movl $8, -8(%ebp) movl $0, -12(%ebp) movl $9, -8(%ebp) jmp .L2 .L3: movl -4(%ebp), %eax addl $2, %eax movl %eax, -12(%ebp) subl $1, -8(%ebp) .L2: movl -8(%ebp), %eax cmpl -4(%ebp), %eax jg .L3The generated code is almost the same as the while loop. Here are few things to notice: