Ubuntu 16.04 выдает ошибку с AT & T: «Ошибка сегментации (ядро сброшено)» (AT & T 64-bit) - PullRequest
0 голосов
/ 27 сентября 2018

Итак, когда я пытался что-то запрограммировать на ассемблере, я наткнулся на проблему.Я пытаюсь отсканировать две переменные, используя подпрограмму scanf, а затем печатаю их обе в одном предложении, используя подпрограмму printf.Теперь, похоже, это работает на экземпляре virtualbox (linux), который я использую, но так как я не был удовлетворен задержкой ввода, которую я имел с virtualbox, я установил Ubuntu 16.04 вместе с моей исходной ОС, то есть Windows 10.

Так что я был полностью доволен работой моего 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</p>

<code>.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
</code>

Заранее спасибо!

...