[10] 어셈블리 스택메모리를 이용한 변수 저장 및 사용

2017. 10. 27. 20:07SystemHacking/Assembly




http://itsaessak.tistory.com/249 는 스택메모리를 사용하지 않고 bss section을 이용했습니다다.

더 쉬운 버전이니 참고하길 바랍니다


[ 어셈블리 코드 ] - 문자를 입력하면, 거꾸로 출력되어 진다

extern scanf

extern printf


section .data

prompt_str      db      '%s',00

print_chr       db      '%c',00

print_new       db      10,00



section .text

global  main

main:

push    ebp

mov     ebp,    esp ; function epilogue

sub     esp,    1028         ; 지역변수 공간 할당 1028 byte


lea     eax,    [ebp-1024]         ; eax에는 ebp-1024 주소값이 입력

push    eax

push    prompt_str

call    scanf ; scanf("%s", ebp-1024 )


mov     dword [ebp-1028],       0         ; 스택공간 ebp-1028는 0으로 초기화

while:

mov     edx,    dword [ebp-1028]            ; edx레지스터는 글자 수를 세는 역할을 할 것이다

cmp     byte [ebp-1024 + edx],  0            ; ebp-1024는 입력한 문자열의 시작주소

                          ; 문자열을 배열이라고 생각하고, 주소+1은 다음 인자로 이동한다고 생각하면 쉽다

                   ; => 다음글자로 이동하면서 문자열의 끝을 찾자

jz      while_end           ; 문자의 끝이라면 while_end 로 이동


inc     dword [ebp-1028] ; 문자의 끝이 아닐 때, ebp-1028주소의 값은 1씩 증가

jmp     while ; 반복


while_end:

dec     dword [ebp-1028]

mov     edx,    dword [ebp-1028]            ; edx = 문자열의 길이

mov     eax,    [ebp-1024 + edx]            ; eax = 문자열의 뒷자리부터 입력


push    eax

push    print_chr

call    printf


push    print_new

call    printf


cmp     dword [ebp-1028],       0                ; 문자열의 제일 첨까지 왔다면

jz      end       ; jump end

jmp     while_end       ; 아니면 반복


end:

;mov    esp,    ebp      ; 할당했던 지역변수 공간을 회수한다

;pop    ebp ; 저장해두었던 기존 ebp값을 돌려준다

leave ; = leave


 

[ 실행 결과 ]