2017. 10. 27. 20:07ㆍSystemHacking/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 |
[ 실행 결과 ]
'SystemHacking > Assembly' 카테고리의 다른 글
[12] 어셈블리 mkdir 구현 ( SystemCall ) (0) | 2017.10.31 |
---|---|
[11] 어셈블리 argc, argv 이해하기 (0) | 2017.10.30 |
[9] 어셈블리 스택 메모리를 이용한 간단한 덧셈 ( leave, ret, call ) (0) | 2017.10.27 |
프로세스의 메모리 구조 ( + ESP, EBP ) (0) | 2017.10.25 |
[8] 어셈블리 반복문 연습 (0) | 2017.10.24 |