Improve the assembly code on the next page, minimizing memory accesses as appropriate. Make sure that you properly save and restore registers as necessary. You may start from the assembler code and modify it or you may simply write assembler implementing the same C code. Include a comment about which variables are in which registers void simple(int a,int b, int c,int * answers) { int numNeg = 0; int numPos = 0; if (a < 0) numNeg++; else numPos++; if (b < 0) numNeg++; else numPos++; if (c < 0) numNeg++; else numPos++; answers[0] = numNeg; answers[1] = numPos; } _simple: pushq %rbp movq %rsp, %rbp subq $24, %rsp movl $0, -16(%rbp) movl $0, -12(%rbp) cmpl $0, %ecx jge L2 incl -16(%rbp) jmp L4 L2: incl -12(%rbp) L4: cmpl $0, %edx jge L5 incl -16(%rbp) jmp L7 L5: incl -12(%rbp) L7: cmpl $0, %r8d jge L8 incl -16(%rbp) jmp L10 L8: incl -12(%rbp) L10: movl -16(%rbp), %eax movl %eax, (%r9) movq %r9, %rdx addl $4, %rdx movl -12(%rbp), %eax movl %eax, (%rdx) leave ret
Improve the assembly code on the next page, minimizing memory accesses as appropriate. Make sure that you properly save and restore registers as necessary. You may
start from the assembler code and modify it or you may simply write assembler implementing the same C code. Include a comment about which variables are in which registers
void simple(int a,int b, int c,int * answers)
{
int numNeg = 0;
int numPos = 0;
if (a < 0)
numNeg++;
else
numPos++;
if (b < 0)
numNeg++;
else
numPos++;
if (c < 0)
numNeg++;
else
numPos++;
answers[0] = numNeg;
answers[1] = numPos;
}
_simple:
pushq %rbp
movq %rsp, %rbp
subq $24, %rsp
movl $0, -16(%rbp)
movl $0, -12(%rbp)
cmpl $0, %ecx
jge L2
incl -16(%rbp)
jmp L4
L2:
incl -12(%rbp)
L4:
cmpl $0, %edx
jge L5
incl -16(%rbp)
jmp L7
L5:
incl -12(%rbp)
L7:
cmpl $0, %r8d
jge L8
incl -16(%rbp)
jmp L10
L8:
incl -12(%rbp)
L10:
movl -16(%rbp), %eax
movl %eax, (%r9)
movq %r9, %rdx
addl $4, %rdx
movl -12(%rbp), %eax
movl %eax, (%rdx)
leave
ret
Step by step
Solved in 3 steps