2013-08-27 1 views
1

sys_newstat 시스템 호출을 사용하여 파일 크기를 얻는 nasm으로 어셈블 된 객체와 링크되는 C 프로그램을 실행하려고합니다. 이 프로그램은 gcc로 컴파일 할 때 올바른 파일 크기를 반환하지만 mexified 때 파일 크기는 0 만 반환합니다. 여기sys_newstat가 MATLAB 및 mex와 함께 작동하지 않습니다.

nasm -felf64 -o getSize.o getSize.asm 

: 여기

#include <stdio.h> 
    #include "mex.h" 

    extern int getSize(); 

    void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 
     int size = getSize(); 
     printf("%d \n", size); 
    } 

내가 어셈블리 프로그램을 컴파일하는 데 사용하는 명령입니다 : 여기
default rel 
    global getSize 
    sys_newstat  equ 106 

    struc STAT 
     .st_dev:  resd 1 
     .st_ino:  resd 1 
     .st_mode:  resw 1 
     .st_nlink:  resw 1 
     .st_uid:  resw 1 
     .st_gid:  resw 1 
     .st_rdev:  resd 1 
     .st_size:  resd 1 
     .st_blksize: resd 1 
     .st_blocks:  resd 1 
     .st_atime:  resd 1 
     .st_atime_nsec: resd 1 
     .st_mtime:  resd 1 
     .st_mtime_nsec: resd 1 
     .st_ctime:  resd 1 
     .st_ctime_nsec: resd 1 
     .unused4:  resd 1 
     .unused5:  resd 1 
    endstruc 

    %define sizeof(x) x %+ _size 

    section .data 
     fileName: db "input.xml",0 

    section .bss 
     stat: resb sizeof(STAT) 

    section .text 
    getSize: 
;; Get the size of the file 
      mov rbx, fileName 
      mov rcx, stat 
      mov rax, sys_newstat 
      int 80H 
      mov rax, [stat + STAT.st_size] 
     ret 

는 C 프로그램입니다 : 여기

어셈블리 프로그램입니다 내 C 프로그램을 mexify하는 데 사용하는 명령입니다 :

mex main.c getSize.o 

모든 도움을 주시면 대단히 감사하겠습니다. 고마워요

+0

''에있는 ['stat'] (http://linux.die.net/man/2/stat) 구조체에 대한 인터넷 검색 결과에 따르면, 필드의 크기는 플랫폼에 따라 달라집니다. 그래서 64 비트 리눅스에서는 위에서 정의한대로 1과 2 바이트가 아니라 2 바이트와 4 바이트가 될 수 있습니다. 아마도 그게 문제입니까? – Amro

+0

그래도 gcc에서 잘 작동합니다. – OshaMan

+1

64 비트 Linux에서 시스템 호출은 일반적으로 "int 80h"대신 "syscall"명령어를 사용하여 수행됩니다. 이 경우 레지스터의 의미가 다릅니다. GCC를 사용하여 프로그램을 컴파일하면 모든 주소가 일반적으로 2GB 미만이지만 MEX 파일에서는 주소가 2GB를 초과 할 수 있습니다. "int 80h"는 2GB 미만의 주소에서만 작동합니다. 이 동작을 테스트하려면 어셈블러 코드가 들어있는 동적 라이브러리 (.so)와이 동적 라이브러리를 사용하는 테스트 C 프로그램을 만들어야합니다. –

답변

1

나는 그것을 알아 냈습니다. 여기 내가 한 일이있다.

default rel 
    global getSize 
    sys_newstat  equ 4 

    struc STAT 
     .st_dev:  resq 1 
     .st_ino:  resq 1 
     .st_nlink:  resq 1 
     .st_mode:  resd 1 
     .st_uid:  resd 1 
     .st_gid:  resd 1 
     .pad0:   resd 1 
     .st_rdev:  resq 1 
     .st_size:  resq 1 
     .st_blksize: resq 1 
     .st_blocks:  resq 1 
     .st_atime:  resq 1 
     .st_atime_nsec: resq 1 
     .st_mtime:  resq 1 
     .st_mtime_nsec: resd 1 
     .st_ctime:  resq 1 
     .st_ctime_nsec: resq 1 
     .unused:  resq 3 
    endstruc 

    %define sizeof(x) x %+ _size 

    section .data 
     fileName: db "input.xml",0 

    section .bss 
     stat: resb sizeof(STAT) 

    section .text 
    getSize: 
     ;; Get the size of the file 
     mov rax, sys_newstat 
      mov rdi, fileName 
      mov rsi, stat 
      syscall 
      mov rax, [stat + STAT.st_size] 
     ret 

그 밖의 모든 것은 같습니다.

/usr/include/asm/unistd_64.h에서 시스템 호출 정보를 얻었습니다. 나는 /usr/include/asm/stat.h에서 구조체 정보를 얻었습니다.