2016-04-07 2 views
0

Я создаю программу сборки для решения квадратного уравнения. Наш профессор дал нам часть кода, но всякий раз, когда я запускаю ее с тем, что я добавил, я получаю сообщение об ошибке с помощью «scanf». это говорит о неопределенной ссылке на printf, а также неопределенной ссылке на scanf. Я не уверен, как просто создать другой код, который был бы эквивалентен scanf и printf вместо их вызова, я считаю, что это будет проще и работать.Квадратичное уравнение-Assembly- using scanf

section .text 

    global start 



    extern printf, scanf 

    print: 
    mov eax,4 
    mov ebx,1 
    int 0x80 
ret 

start: 

mov ecx, a1 
mov edx, la1 
call print 

push a 
push scan 
call scanf 

mov ecx,b1 
mov edx,lb1 
call print 

push b 
push scan 
call scanf 

mov ecx,c1 
mov edx,lc1 
call print 

push c 
push scan 
call scanf 

fld qword[b] 
fmul st0 
fld qword[a] 
fmul qword[c] 
mov word[const],4 
fimul word[const] 
fchs 
fadd st1 
fst qword[disc] 

push dword[disc+4] 
push dword[disc] 
push dis 
call printf 

ftst 
fstsw ax 
sahf 
ja real_roots 
sahf 
je one_root 

imag_roots: 
fchs 
fsqrt 
fld qword[b] 
fchs 
fadd st1 
fdiv st1 
fstp qword[x1] 
fld qword[disc] 
fchs 
fsqrt 
fld qword[b] 
fadd st1 
fchs 
fld qword[a] 
mov word[const],2 
fimul word[const] 
fxch st1 
fdiv st1 
fstp qword[x2] 

push dword[x2+4] 
push dword[x2] 
push dword[x1+4] 
push dword[x1] 
push imagroot 
call printf 
jmp over 

real_roots: 
fsqrt 
fld qword[b] 
fchs 
fadd st1 
fld qword[a] 
mov word[const],2 
fimul word[const] 
fxch st1 
fdiv st1 
fstp qword[x1] 
fld qword[disc] 
fsqrt 
fld qword[b] 
fadd st1 
fchs 
fld qword[a] 
mov word[const],2 
fimul word[const] 
fxch st1 
fdiv st1 
fstp qword[x2] 

push dword[x2+4] 
push dword[x2] 
push dword[x1+4] 
push dword[x1] 
push realroot 
call printf 

jmp over 

one_root: 
fsqrt 
fld qword[b] 
fchs 
fadd st1 
fld qword[a] 
mov word[const],2 
fimul word[const] 
fxch st1 
fdiv st1 
fstp qword[x1] 


push dword[x1+4] 
push dword[x1] 
push oneroot 
call printf 

over: 
mov eax, 1 
mov ebx, 0 
int 0x80 

section .bss 
x1 resq 1 
x2 resq 1 
const resw 1 
a resq 1 
b resq 1 
c resq 1 
disc resq 1 

section .data 
scan db "%lf",0 
oneroot db "Root = %f",10,0 
realroot db "Root 1 = %f & Root 2 = %f",10,0 
imagroot db "Root 1 = %fi & Root 2 = %fi",10,0 
dis db "Discriminant = %f",10,0 

a1 db 3 
la1 equ $-a1 
b1 db 3 
lb1 equ $-b1 
c1 db 3 
lc1 equ $-c1 
+0

вы связывающую его против стандартной библиотеки? Кроме того, я не смотрю на эту массу кода сборки без каких-либо приложений и комментариев. –

+0

-Я супер новый на сборке. что значит связать его со стандартной библиотекой? В верхней части кода я добавляю extern scanf ... это то, что вы имеете в виду? – Elizabeth

+1

Какие команды вы используете для сборки и соединения? И на какой платформе? –

ответ

1

вопрос вы имеете с printf не нашли предполагает, что вы не правильно ссылки на библиотеки C. Самый простой способ сделать эту работу - изменить код, чтобы использовать точку входа main вместо start. Изменить этот код:

section .text 

    global start 

    extern printf, scanf 

    print: 
    mov eax,4 
    mov ebx,1 
    int 0x80 
ret 

start: 

к:

section .text 

    global main 

    extern printf, scanf 

    print: 
    mov eax,4 
    mov ebx,1 
    int 0x80 
ret 

main: 

В Linux, при использовании GCC связать против C среды выполнения, среда выполнения C обеспечит _start ярлык, который выполняет инициализации, а затем вызывает вашу функцию main.

Ваш код 32-разрядный. Если вы находитесь на 64-битном Linux эти команды должны быть в состоянии собрать и связать свой код (замените program с именем вашей программы):

nasm -felf32 program.asm -o program.o 
gcc -m32 program.o -o program 

Если вы находитесь на 32-битном Linux эти команды должны работать :

nasm program.asm -o program.o 
gcc program.o -o program 

Для запуска программы в обоих случаях это делается так:

./program