Итак, когда я пытался что-то запрограммировать на ассемблере, я наткнулся на проблему.Я пытаюсь отсканировать две переменные, используя подпрограмму 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>
Заранее спасибо!