### ------------------------------------------------------------------ ### sumarraylea.s ### Author: Bob Dondero ### The lea Instruction ### ------------------------------------------------------------------ .equ ARRAYSIZE, 100 ### ------------------------------------------------------------------ .section ".rodata" cPrompt: .asciz "How many integers? " cScanfFormat: .asciz "%d" cResult: .asciz "The sum is %d.\n" ### ------------------------------------------------------------------ .section ".data" ### ------------------------------------------------------------------ .section ".bss" iNumbers: .skip 4 * ARRAYSIZE iIndex: .skip 4 iCount: .skip 4 iSum: .skip 4 ### ------------------------------------------------------------------ .section ".text" ## ----------------------------------------------------------- ## int main(int argc, char *argv[]) ## Read up to ARRAYSIZE integers from stdin, and write to ## stdout the sum of those integers. ## ----------------------------------------------------------- ## Formal parameter offsets: .equ ARGC, 8 .equ ARGV, 12 .globl main .type main,@function main: pushl %ebp movl %esp, %ebp ## iIndex = 0; movl $0, iIndex ## printf("How many integers? "); pushl $cPrompt call printf addl $4, %esp ## scanf("%d", &iCount); pushl $iCount pushl $cScanfFormat call scanf addl $8, %esp loop1: ## if (iIndex >= iCount) goto loopend1; movl iIndex, %eax cmpl iCount, %eax jge loopend1 ## scanf("%d", &piNumbers[iIndex]); movl iIndex, %eax leal iNumbers(,%eax,4), %eax # the lea instruction pushl %eax pushl $cScanfFormat call scanf addl $8, %esp ## iIndex++; incl iIndex ## goto loop1; jmp loop1 loopend1: ## iSum = 0; movl $0, iSum ## iIndex = 0; movl $0, iIndex loop2: ## if (iIndex >= iCount) goto loopend2; movl iIndex, %eax cmpl iCount, %eax jge loopend2 ## iSum += piNumbers[iIndex]; movl iIndex, %eax movl iNumbers(,%eax,4), %eax addl %eax, iSum ## iIndex++; incl iIndex ## goto loop2; jmp loop2 loopend2: ## printf("The sum is %d.\n", iSum); pushl iSum pushl $cResult call printf addl $8, %esp ## return 0; movl $0, %eax movl %ebp, %esp popl %ebp ret