【问题标题】:sys_newstat doesn't work with MATLAB and mexsys_newstat 不适用于 MATLAB 和 mex
【发布时间】: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

我们将不胜感激所有帮助。 谢谢你

【问题讨论】:

  • 谷歌搜索驻留在&lt;sys/stat.h&gt; 中的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


【解决方案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 获得了我的结构统计信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-21
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多