1

我正在尝试将一个 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 程序的命令:

    mex main.c getSize.o

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

4

1 回答 1

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

于 2013-08-28T21:27:52.447 回答