【发布时间】:2013-05-06 03:20:10
【问题描述】:
我正在学习Linux内核,所以我必须阅读一些汇编代码。这是一个示例代码
SYSWRITE=4
.globl mywrite,myadd
.text
mywrite:
pushl %ebp
movl %esp,%ebp
pushl %ebx
movl 8(%ebp),%ebx
movl 12(%ebp),%ecx
movl 16(%ebp),%edx
movl $SYSWRITE,%eax
int $0x80
popl %ebx
movl %ebp,%esp
popl %ebp
ret
myadd:
pushl %ebp
movl %esp,%ebp
movl 8(%ebp),%eax
movl 12(%ebp),%edx
xorl %ecx,%ecx
addl %eax,%edx
jo 1f
movl 16(%ebp),%eax
movl %edx,(%eax)
incl %ecx
1:
movl %ecx,%eax
movl %ebp,%esp
popl %ebp
ret
我是这样使用as的
"as -o callee.o callee.s"
编译它,但它失败并显示类似这样的消息
“callee.s|5| 错误:'push' 的后缀或操作数无效”
【问题讨论】:
-
近乎重复:stackoverflow.com/questions/36861903/…,其中涉及
gcc和ld,但不涉及as。 (可以使用gcc -m32 foo.S组装链接。)