因此,当我尝试对汇编语言进行编程时,偶然发现了一个问题。我试图使用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
谢谢!