main.c-2

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
; _calc_sum
;1 n .
; :
; n - ([ebp+8] )
; sump -sum int ([[ebp+8] )
; C :
;void calc_sum(int n, int *sump){
; int i,sum=0;
; for(i=1;i<=n;i++)
; sum+=i;
; *sump=sum;
;}
segment .text
global _calc_sum
;
; :
; [ebp-4]
_clac_sum:
enter 4,0 ;sum
push ebx ;EBX !
mov dword [ebp-4],0 ;sum=0
dump_stack 1,2,4 ;ebp-8 ebp+16
mov ecx,1 ;ecx i
for_loop:
cmp ecx,[ebp+8] ;cmp i & n
jnle end_for ;if i<=n
add [ebp-4],ecx ;sum+=i
inc ecx
jmp short for_loop
end_for:
mov ebx,[ebp+12] ;ebx=sump
mov eax,[ebp-4] ;eax=sum
mov [ebx],eax
pop ebx ;restore 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
; _calc_sum
;1 n .
; :
; n - ([ebp+8] )
; :
;
; C :
;void calc_sum(int n){
; int i,sum=0;
; for(i=1;i<=n;i++)
; sum+=i;
; return sum;
;}
segment .text
global _calc_sum
;
; local variable:
; sum at [ebp-4]
_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] ;eax=sum
leave
ret
return 할 값이 int 이므로 EAX에 값을 저장한다.