2012-10-10 3 views
0

GNU 어셈블러 사용 malloc을 호출하여 C 구조체를 만들고 구조체에 값을 삽입하고 해당 구조체에 대한 포인터를 반환하려고합니다. 내가 코드를 업데이트 한GNU 어셈블러를 사용하여 동적으로 구조체를 만들고 그것에 대한 포인터를 반환합니다.

push %ebp 
    movl %esp, %ebp 
    subl $0x1c, %esp 
    #movl $20, (%esp) #I've tried this but it doesn't seem to help 
    push $20   #Struct is 20 bytes 
    call malloc  
    test %eax, %eax 
    jz allocateFailed 
    jmp allocateOK 

allocateFailed: 
    leave 
    ret 

allocateOK: 
    movl 8(%ebp), %edx 
    movl %edx, 8(%eax) 
    movl 12(%ebp), %edx 
    movl %edx, 12(%eax) 
    leave 
    ret 

떨어진 %의 EBX 레지스터를 사용하여 한 번 봐 복용에서 머물 :

다음
struct node { 
    void  *next;  
    void  *last; 
    char  *name;  
    int  id;   
    uint8_t number; 
    uint8_t numberTwo; 
    uint8_t numberThree; 
    uint8_t numberFour; 
} 

내가 사용하고는 GNU 조립입니다 : 다음은 구조체이다 어셈블러가 이것을 어떻게 처리했는지를 나타내는 함수의 Objdump.

매개 변수가 잘 표시되지만 새로 만든 구조체에 넣으려고하면 seg 오류가 발생합니다. 아래는 코어 덤프입니다.

프로그램이 신호 6으로 종료되었습니다. 중단되었습니다. __kernel_vsyscall에서
0 0xb7727424는()

다음

내가 GDB의 역 추적을 실행할 것을 얻을 것입니다 : 나는 또한 --gstabs와 함께 C에서이 함수를 작성하고 컴파일 한

0 allocateOK() at new_student.s:25 
1 0x00000014 in ??()  #Not sure what this is coming from 
2 0xb7fc5a20 in ??() from /lib/i386-linux-gnu/libc.so.6 
3 0x080485ed in test() #function that calls and passes in the parameters 
4 0x080487b4 in main() 

- o 그것을 사용하기 위해 objdump를 사용했다. 나는 내 주변에있는 것처럼 보이지만 나는 그것을 알아낼 수 없다.

sub $0x1c,%esp 
movl $0x14,(%esp) 
call 8048350 <[email protected]> 
mov 0x20(%esp),%edx 
mov %edx,0xc(%eax) 
mov 0x24(%esp),%edx 
mov %edx,0x8(%eax) 

모든 도움을 주시면 감사하겠습니다. 구조체를 만들고 작업하기 위해 어셈블리 (C 만 사용)를 사용한 적이 없습니다. 나는 약간의 연구를했고 몇 가지 시도를 해왔지만, 나는 그것을 얻는 것처럼 보입니다.

답변

0

최상의 추측 : 저장 및 복원하지 않고 %ebx을 사용하고 있으므로 호출자가 루틴에 손상을 입혀 일상 반환 후 문제가 발생합니다. 또한 새로 할당 된 struct의 nameid 필드 만 설정합니다. 나머지는 초기화되지 않은 쓰레기를 포함합니다. 디버거를 사용하여 중단이 발생한 위치의 스택 추적을 가져옵니다.

+0

도움 주셔서 감사합니다. 코드와 질문을 업데이트했습니다. – RoberJimmer