어셈블리 과제인데 도움좀 주세요 ㅜㅜ setjmp, longjmp관련

amuroray0112의 이미지

아래 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);
}
yukariko의 이미지

Intel Architecture 같은 경우
스택의 끝을 나타내는 esp와 스택 프레임의 시작주소를 나타내는 ebp가 있는데
함수가 한단계 더 깊어질수록 변수 i, ebp에 대한 스택이 늘어나겠죠.
32bit면 함수하나당 8바이트씩 늘어난다 볼수있으므로 ebp 수치를 적절히 바꾼다면 함수를 건너띌 수 있겠죠.
다른 아키텍쳐는 잘 모르겠네요

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.