main5.c
#include<stdio.h>
void calc_sum(int,int *)__attribute__((cdecl));
int main(void){
int n,sum;
printf("Sum integers up to:");
scanf("%d", &n);
calc_sum(n, &sum)
printf("Sum is %d\n",sum);
return 0;
}
sub5.asm
segment .text
global _calc_sum
_clac_sum:
enter 4,0
push ebx
mov dword [ebp-4],0
dump_stack 1,2,4
mov ecx,1
for_loop:
cmp ecx,[ebp+8]
jnle end_for
add [ebp-4],ecx
inc ecx
jmp short for_loop
end_for:
mov ebx,[ebp+12]
mov eax,[ebp-4]
mov [ebx],eax
pop ebx
leave
24행은 dump_stack 메크로가 어떻게 작동하는지 보여주고 있다.(asm_io.inc)
첫 번째 인자는 단지 정수 라벨, 두 번째와 세번째 인자는 출력할 EBP의 범위를 설정하는 것이다.
만일 calc_sum이 포인터를 통해서 값을 전달하지 않고
return 시키기 위해서는 아래와 같이 코드를 바꾸어야 한다.
main6.c
#include<stdio.h>
void calc_sum(int,int *)__attribute__((cdecl));
int main(void){
int n,sum;
printf("Sum integers up to:");
scanf("%d", &n);
sum=calc_sum(n);
printf("Sum is %d\n",sum);
return 0;
}
sub6.asm
segment .text
global _calc_sum
_calc_sum:
enter 4,0
mov dword [ebp-4],0
mov ecx,1
for_loop:
cmp ecx,[ebp+8]
jnle end_for
add [ebp-4],ecx
inc ecx
jmp short for_loop
end_for:
mov eax,[ebp-4]
leave
ret
return 할 값이 int 이므로 EAX에 값을 저장한다.