我对程序集代码有一些问题。我试图调用C函数print。
编译文件时使用:

gcc helloC.s -o hello

我犯了这样的错误:
 /tmp/cc0SwfB8.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o:(.text+0x0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.4.3/../../../../lib/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status

这是我们教授的一个课程。我在大学电脑上用油灰编译。Linux功能:lscpu说它是x86_64架构。
我们教授给出的代码:
#PURPOSE: This program writes the message "hello world" and
# exits
#
.section .data
helloworld:
.ascii "hello world\n\0"
.section .text
.globl _start
_start:
main:
pushq $helloworld
call printf
pushq $0

call exit

我在这段代码中唯一改变的是push->pushq,因为它是64位体系结构。
编辑:
就像福兹说的,我变了。地球仪开始。地球仪主。Olso i changed label\u start:到main:
我编译没有错误。
当我和./hello共进午餐时,它会说:“内存保护违规”(从我的母语翻译过来)。(Naruszenie ochrony pamięci)
#PURPOSE: This program writes the message "hello world" and
# exits
#
.section .data
helloworld:
.ascii "hello world\n\0"
.section .text
.globl main
main:
pushq $helloworld
call printf
pushq $0

call exit

最佳答案

不能像那样机械地将x86程序集代码转换为x64程序集代码。
选择:
为x86编译并运行。
学习调用约定并重写
用C重写
内存保护冲突的原因是使用任意参数调用printf。printf的第一个参数在x64的rdi寄存器中,而不是堆栈中。

关于linux - 带有printf的x86汇编错误并退出C表格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49819589/

10-13 07:25