어셈블리 과제인데 도움좀 주세요 ㅜㅜ setjmp, longjmp관련
글쓴이: amuroray0112 / 작성시간: 토, 2015/02/07 - 9:52오후
아래 c언어 소스를 보고 mysetjmp mylongjmp를 Linux GAS 어셈블리 언어로 만들어야 하는 문제입니다
cc -m32 **.c **.s libkikaigo.a 이런식으로 컴파일해서
mysetjmp mylongjmp를 주석처리 하지 않고 실행시
touch: 0
func1: 0
func2: 0
func3: 0
func4: 1
func3: 2
func2: 3
func1: 1
touch: 1
이런 결과가 나오는데
주석처리 하지 않고 실행해서
touch: 0
func1: 0
func2: 0
func3: 0
touch: 1
이런식으로 실행되게 해야 합니다.
함수 goto비슷하게 만들라고 하는건데
어셈블리는
======================================
.data #for return addr, esp, ebp, ebx, esi, edi myenv: .long 0, 0, 0, 0, 0, 0 .text .globl mysetjmp mysetjmp: #戻るための情報を保存する処理(돌아오시 위해 정보를 보존하는 처리) ret .globl mylongjmp mylongjmp: #戻るための処理(돌아오기 위한 처리) ret
======================================
이런식에 mysetjmp mylongjmp의 소스를 채워넣는 과제입니다
이거 어떻게 해야하나 감도 안잡히네요 프린트물도 예를 들어서 써져있는게 아니라 두리뭉실하게 써져있어 참고도 안되고 ㅜㅜ
이거에 관해서 관련 자료를 인터넷 참조를 해볼려고 해도 잘 나오지도 않고 ㅜㅜ
함수1->함수2->함수3->함수4로 호출될때 함수4에서 23을 건너뛰어서 함수1로 와서 리턴하는 내용인데
1로 돌아올때 함수2의 스택프레임정보를 취득하고 그걸 취득하기위한 함수를 호출하면 된다고 하는데
감이 안잡히네요 ㅜㅜ 선배님들 도와주세요
#include <stdio.h> void mysetjmp(void); void mylongjmp(void); int touch; int func4(int i) { touch = 1; mylongjmp(); printf("func4: %d\n", i); return i + 1; } int func3(int i) { printf("func3: %d\n", i); i = func4(i); printf("func3: %d\n", i); return i + 1; } int func2(int i) { printf("func2: %d\n", i); i = func3(i); printf("func2: %d\n", i); return i + 1; } int func1(int i) { printf("func1: %d\n", i); i = func2(i); printf("func1: %d\n", i); return i; } int main(int argc, char *argv[]) { printf("touch: %d\n", touch); mysetjmp(); if (touch == 0) { func1(0); } printf("touch: %d\n", touch); }
Forums:
Intel Architecture 같은 경우스택의
Intel Architecture 같은 경우
스택의 끝을 나타내는 esp와 스택 프레임의 시작주소를 나타내는 ebp가 있는데
함수가 한단계 더 깊어질수록 변수 i, ebp에 대한 스택이 늘어나겠죠.
32bit면 함수하나당 8바이트씩 늘어난다 볼수있으므로 ebp 수치를 적절히 바꾼다면 함수를 건너띌 수 있겠죠.
다른 아키텍쳐는 잘 모르겠네요
댓글 달기