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
모든 도움을 주시면 대단히 감사하겠습니다. 고마워요
''에있는 ['stat'] (http://linux.die.net/man/2/stat) 구조체에 대한 인터넷 검색 결과에 따르면, 필드의 크기는 플랫폼에 따라 달라집니다. 그래서 64 비트 리눅스에서는 위에서 정의한대로 1과 2 바이트가 아니라 2 바이트와 4 바이트가 될 수 있습니다. 아마도 그게 문제입니까? –
Amro
그래도 gcc에서 잘 작동합니다. – OshaMan
64 비트 Linux에서 시스템 호출은 일반적으로 "int 80h"대신 "syscall"명령어를 사용하여 수행됩니다. 이 경우 레지스터의 의미가 다릅니다. GCC를 사용하여 프로그램을 컴파일하면 모든 주소가 일반적으로 2GB 미만이지만 MEX 파일에서는 주소가 2GB를 초과 할 수 있습니다. "int 80h"는 2GB 미만의 주소에서만 작동합니다. 이 동작을 테스트하려면 어셈블러 코드가 들어있는 동적 라이브러리 (.so)와이 동적 라이브러리를 사용하는 테스트 C 프로그램을 만들어야합니다. –