【发布时间】:2013-08-30 20:26:19
【问题描述】:
我正在尝试对一个 C 程序进行混合,该程序与一个用 nasm 组装的对象链接,该对象使用 sys_newstat 系统调用来获取文件的大小。程序在使用 gcc 编译时返回正确的文件大小,但在 mexified 时仅返回文件大小为 0。
这是汇编程序:
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 程序:
#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);
}
这是我用来编译汇编程序的命令:
nasm -felf64 -o getSize.o getSize.asm
这是我用来对我的 C 程序进行 mexify 的命令:
mex main.c getSize.o
我们将不胜感激所有帮助。 谢谢你
【问题讨论】:
-
谷歌搜索驻留在
<sys/stat.h>中的stat结构,看来字段的大小取决于平台。所以在 64 位 Linux 上,这些可能是 2 字节和 4 字节,而不是您上面定义的 1 和 2 字节。也许这就是问题所在? -
不过,它与 gcc 配合得很好。
-
在 64 位 Linux 系统调用通常使用“syscall”指令而不是“int 80h”来完成。在这种情况下,寄存器的含义是不同的。如果您使用 GCC 编译程序,所有地址通常低于 2GB,但在 MEX 文件中,地址可能高于 2GB。 “int 80h”可能仅适用于 2GB 以下的地址。要测试此行为,您应该创建一个动态库 (.so),其中包含您的汇编代码和使用此动态库的测试 C 程序。
-
这是一个有关在各种平台上进行系统调用的相关问题:stackoverflow.com/q/2535989/97160。这个问题谈到
stat结构布局:stackoverflow.com/q/14355466/97160 -
谢谢。如果没有你的帮助,我可能不会弄明白。
标签: matlab assembly nasm system-calls mex