【问题标题】:Inline assembly error: unknown register name ‘%%ebx’ in ‘asm’内联汇编错误:“asm”中的未知寄存器名称“%%ebx”
【发布时间】:2012-04-13 07:48:04
【问题描述】:

我正在尝试创建 read() 包装器但收到此错误:

error: unknown register name '%%ebx' in ‘asm’ in line 23 //(粗线)

代码如下:

#include <sys/syscall.h>
typedef unsigned int size_t;
typedef signed ssize_t;

extern int errno;

int main(void) {
    int fd = 0;
    char buf[128];
    size_t count = 128;
    my_read(fd, buf, count);

    return 0;
}

int my_read(int fd, void *buf, size_t count) {
    long ret;

    asm("pushl %%ebx\n\t" // Line 23
        "movl %%esi,%%ebx\n\t"
        "int $0x80\n\t"
        "popl %%ebx"
        : "=a" (ret)/* output */
        : "0"(SYS_read), "S"((long) fd), "c"((long) buf), "d"((long) count)/* input */
        : "%%ebx"/* clobbered register */
        );
    if (ret >= 0) {
        return (int) ret;
    }
    errno = -ret;
    return -1;
}

有人可以帮忙吗?

【问题讨论】:

    标签: c inline-assembly


    【解决方案1】:

    从被破坏的行中删除一个%

    : "%%ebx"/* clobbered register */
       ^
    

    必须将其保留在所有其他行中。

    编辑

    删除extern int errno; 并包含errno.h

    【讨论】:

    • 现在我得到 :collect2: ld 以信号 11 [Segmentation fault] 终止
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-08
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多