▶ 输入 Count 个 32 位有符号整数,计算他们的和
● 代码,使用堆栈传参
1 ;// Sum_main.asm,主过程 2 INCLUDE Irvine32.inc 3 4 EXTERN PromptForIntegers@0:PROC ; 外部链接声明需要的函数 5 EXTERN ArraySum@0:PROC, DisplaySum@0:PROC 6 7 ArraySum EQU ArraySum@0 ; 外部链接声明需要的变量 8 PromptForIntegers EQU PromptForIntegers@0 9 DisplaySum EQU DisplaySum@0 10 11 Count = 3 ; 输入的变量数 12 13 .data 14 prompt1 BYTE "Enter a signed 32-bit integer: ", 0 15 prompt2 BYTE "Sum: ", 0 16 array DWORD Count DUP(?) 17 sum DWORD ? 18 19 .code 20 main PROC 21 call Clrscr ; 清屏 22 23 ; PromptForIntegers( addr prompt1, addr array, Count ),提示信息和输入整数 24 push Count 25 push OFFSET array 26 push OFFSET prompt1 27 call PromptForIntegers 28 29 ; eax = ArraySum( addr array, Count ),数组求和 30 push Count 31 push OFFSET array 32 call ArraySum 33 mov sum,eax 34 35 ; DisplaySum( addr prompt2, sum ),输出结果 36 push sum 37 push OFFSET prompt2 38 call DisplaySum 39 40 call Crlf 41 call WaitMsg 42 exit 43 main ENDP 44 END main
1 ;// _prompt.asm,提示信息和输入整数 2 INCLUDE Irvine32.inc 3 4 .code 5 PromptForIntegers PROC 6 arraySize EQU [ebp+16] ; 获取参数 7 ptrArray EQU [ebp+12] 8 ptrPrompt EQU [ebp+8] 9 enter 0,0 10 pushad 11 12 mov ecx, arraySize 13 cmp ecx, 0 14 jle L2 15 mov edx, ptrPrompt 16 mov esi, ptrArray 17 18 L1: 19 call WriteString 20 call ReadInt 21 call Crlf 22 mov [esi], eax 23 add esi, 4 24 loop L1 25 26 L2: 27 popad 28 leave 29 ret 12 ; 3 个参数 30 PromptForIntegers ENDP 31 END
1 ;// _arrysum.asm,数组求和 2 INCLUDE Irvine32.inc 3 4 .code 5 ArraySum PROC 6 ptrArray EQU [ebp+8] 7 arraySize EQU [ebp+12] 8 enter 0, 0 9 push ecx 10 push esi 11 12 mov eax, 0 ; 使用循环对数组求和,放入 eax 13 mov esi, ptrArray 14 mov ecx, arraySize 15 cmp ecx, 0 16 jle L2 17 18 L1: 19 add eax, [esi] 20 add esi, 4 21 loop L1 22 23 L2: 24 pop esi 25 pop ecx 26 leave 27 ret 8 28 ArraySum ENDP 29 END
1 ;// _display.asm,输出结果 2 INCLUDE Irvine32.inc 3 4 .code 5 DisplaySum PROC 6 theSum EQU [ebp+12] 7 ptrPrompt EQU [ebp+8] 8 enter 0, 0 9 push eax 10 push edx 11 12 mov edx, ptrPrompt 13 call WriteString 14 mov eax, theSum 15 call WriteInt 16 call Crlf 17 18 pop edx 19 pop eax 20 leave 21 ret 8 22 DisplaySum ENDP 23 END
● 代码,使用伪指令 PROTO 和 INVOKE 传参
1 ;// Sum_main.asm,主过程 2 INCLUDE sum.inc ; 需要头文件 3 4 Count = 3 5 6 .data 7 prompt1 BYTE "Enter a signed 32-bit integer: ", 0 8 prompt2 BYTE "Sum: ", 0 9 array DWORD Count DUP(?) 10 sum DWORD ? 11 12 .code 13 main PROC 14 call Clrscr 15 16 INVOKE PromptForIntegers, ADDR prompt1, ADDR array, Count ; 3 个过程直接传参 17 18 INVOKE ArraySum, ADDR array, Count 19 mov sum, eax 20 21 INVOKE DisplaySum, ADDR prompt2, sum 22 23 call Crlf 24 call WaitMsg 25 exit 26 main ENDP 27 END main
1 ;// _prompt.asm,提示信息和输入整数 2 INCLUDE sum.inc 3 4 .code 5 PromptForIntegers PROC, ptrPrompt:PTR BYTE, ptrArray:PTR DWORD, arraySize:DWORD 6 pushad ; 不用 enter 和 leave 7 8 mov ecx, arraySize 9 cmp ecx, 0 10 jle L2 11 mov edx, ptrPrompt 12 mov esi, ptrArray 13 14 L1: 15 call WriteString 16 call ReadInt 17 call Crlf 18 mov [esi], eax 19 add esi, 4 20 loop L1 21 22 L2: 23 popad 24 ret 25 PromptForIntegers ENDP 26 END
1 ;// _arrysum.asm,数组求和 2 INCLUDE sum.inc 3 .code 4 5 ArraySum PROC, ptrArray:PTR DWORD, arraySize:DWORD 6 push ecx 7 push esi 8 9 mov eax, 0 10 mov esi, ptrArray 11 mov ecx, arraySize 12 cmp ecx, 0 13 jle L2 14 15 L1: 16 add eax, [esi] 17 add esi, 4 18 loop L1 19 20 L2: 21 pop esi 22 pop ecx 23 ret 24 ArraySum ENDP 25 END
1 ;// _display.asm,输出结果 2 INCLUDE Sum.inc 3 4 .code 5 DisplaySum PROC, ptrPrompt:PTR BYTE, theSum:DWORD 6 push eax 7 push edx 8 9 mov edx, ptrPrompt 10 call WriteString 11 mov eax, theSum 12 call WriteInt 13 call Crlf 14 15 pop edx 16 pop eax 17 ret 18 DisplaySum ENDP 19 END
1 ;// sum.inc,头文件 2 INCLUDE Irvine32.inc 3 4 PromptForIntegers PROTO, ptrPrompt:PTR BYTE, ptrArray:PTR DWORD, arraySize:DWORD 5 6 ArraySum PROTO, ptrArray:PTR DWORD, count:DWORD 7 8 DisplaySum PROTO, ptrPrompt:PTR BYTE, theSum:DWORD