0

我从来没有在我的旧 linux 机器上遇到过这个错误(都是 intel 32bit),所以我很茫然。

我正在尝试汇编和链接汇编代码(这非常简单并且应该可以工作)但是ld给出了错误

rs.o: In function `_start':
(.text+0x11): undefined reference to `eax'

有问题的线就是pushl %eax线。我只需要将 0 的单个字节推入堆栈,因此我决定使用 xor'deax寄存器。但是在使用代码进行汇编时pushb给了我一个“无效的后缀或操作数用于推送”错误,如果我尝试使用汇编很好但链接器对我大喊大叫。aspushb %alpushl %eax as

这是代码。

.section .data

.section .text

.global _start

_start:

xorl %eax, %eax

#sys_socketcall(int call, __user *args)
#sys_socket(int domain, int type, int protocol)

pushl %eax          #protocol: 0
pushl $1            #type: SOCK_STREAM
pushl $2            #domain: AF_INET
movL $1, %ebx       #sys_socket
movl $102, %eax    #sys_socketcall
int $0x80

movl $eax, %ebx  #move socket fd to check echo $?
movl $1, %eax    #exit
int $0x80

任何帮助表示赞赏。

4

4 回答 4

5

您的程序集中有一个错误:$eax应该%eax

movl $eax, %ebx  #move socket fd to check echo $?
于 2012-10-06T19:50:59.410 回答
3

我可以想象它是

movl $eax, %ebx  #move socket fd to check echo $?

线。

相反,它应该是

movl %eax, %ebx  #move socket fd to check echo $?

...

于 2012-10-06T19:50:30.190 回答
3
movl $eax, %ebx

是有问题的。它尝试将名为 ebx 的符号的地址加载eax到 ebx 中,这不是您想要的。把那个错字改成

movl %eax, %ebx

告诉它做你真正想做的事。

于 2012-10-06T19:52:45.443 回答
1

除了语法错误之外,问题是您无法将字节推送到堆栈上。看着

http://coding.derkeiler.com/Archive/Assembler/comp.lang.asm.x86/2006-03/msg00253.html

http://www.rz.uni-karlsruhe.de/rz/docs/VTune/reference/vc266.htm

如果可能,我会建议使用 pushw %ax。

于 2012-10-06T19:59:25.093 回答