Ubuntu 16.04给出了AT&T错误:“分段错误(核心已转储)”(AT​​&T 64位)

时间:2018-09-26 21:16:56

标签: linux ubuntu assembly segmentation-fault virtualbox

因此,当我尝试对汇编语言进行编程时,偶然发现了一个问题。我试图使用scanf子例程扫描两个变量,然后使用printf子例程将它们都打印在一个句子中。 现在,这似乎可以在我正在使用的virtualbox实例(linux)上使用,但是由于我对我的virtualbox的输入延迟不满意,因此我在最初的操作系统Windows 10旁边安装了ubuntu 16.04。

因此,我对Linux的工作方式非常满意,没有任何输入延迟。然后,我尝试编译并运行与virtualbox中相同的代码(在那里工作了!),由于某种原因,出现了“分段错误(内核已转储)”错误。

如果我只执行一次scanf子例程并打印输入,那么它将正常工作。但是当我两次使用scanf子例程时,在终端中输入1值后,它将停止工作。

有人可以通过使用Ubuntu而不是virtualbox告诉我什么地方出了问题,或者什么地方有问题/不同吗?

我的代码示例(注释无法正确对齐)

.text
scanner: .asciz "%ld"                                                                               #format string for scanning
output: .asciz "%ld%ld\n"                                                                   #format string for second printing

.global main main: movq %rsp, %rbp #initialize basepointer call thing #call inout subroutine jmp end #jump to end thing: pushq %rbp #basepointer value to stack movq %rsp, %rbp #basepointer set to stackpointer subq $8, %rsp #move rsp up by 8 leaq -8(%rbp), %rsi #allocate memory input movq $scanner, %rdi #put scanner in rdi movq $0, %rax #no vector register in use for scanf call scanf #call scanf routine subq $8, %rsp #move rsp up by 8 leaq -16(%rbp), %rsi #allocate memory input (under previous one) movq $scanner, %rdi #put scanner in rdi movq $0, %rax #no vector register in use for scanf call scanf #call scanf routine movq $output, %rdi #put output in rdi movq -8(%rbp), %rsi #set input value in rsi movq -16(%rbp), %rdx #set second input value in rdx movq $0, %rax #no vector register in use for printf call printf #call the printf routine movq %rbp, %rsp #clean the stack popq %rbp #reset basepointer ret #return to main end: movq $0, %rdi #load program exit code call exit #exit the program

谢谢!

0 个答案:

没有答案