2016-10-25 4 views
0
extern putchar, getchar, printf 
global main 
SECTION .data 
fmt: db “characters = %d", 10,0 
SECTION .bss 
SECTION .text 
global main 
main: 
xor eax, eax 
xor ebx, ebx 
start: 
call getchar 
cmp eax, -1 
jle exit 
inc ebx; 
cmp eax, "A" 
jl print 
cmp eax, "z" 
jg print 
cmp eax, "Z" 
jle rotup 
cmp eax, "a" 
jge rotlow 
jmp print 
rotup: 
cmp eax, "M" 
jle add13 
sub eax, 13 
jmp print 
rotlow: 
cmp eax, "m" 
jle add13 
sub eax, 13 
jmp print 
add13: 
add eax,13 
jmp print 
print: 
push eax; 
call putchar 
add esp,4 
jmp start 
exit: 
push ebx 
push fmt 
call printf 
add esp,8 
ret 

Ok. Таким образом, я использую эту программу для того, чтобы запустить Vigenere Cipher для одного из моих классов, и когда я попробуйте запустить NASM это отлично работает первая частьЯ продолжаю получать сообщение об ошибке при использовании nasm на ассемблере x86 на Ubuntu

nasm -f elf cipher.asm 

но потом, когда я пытаюсь

ld -o cipher cipher.o 

продолжать это дает мне

ciper.o: In function 'start': 
cipher.asm:(.text+0x5): undefined reference to 'getchar' 
cipher.o: In function 'print': 
cipher.asm:(.text+0x40): undefined reference to 'putchar' 
cipher.o: IN function 'exit': 
cipher.asm:(.text+0x50):undefined reference to 'printf' 

Я не знаю, почему это дает мне это, я думал, что это точка экстерном. Также, если вам интересно, что им использовать im работает Ubuntu на 64-битной. Ive попробовал прочитать, как исправить это, но я не могу найти тот, который помогает мне.

редактировать: Теперь я пытаюсь использовать GCC вместо л.д. чтобы связать, но когда я использую

gcc -o output cipher.o 

или что-то подобное он дает мне

/usr/bin/ld: i386 architecture of input file 'cipher.o' is incompatible with i386:x86-64 
output 

Его по-прежнему дает мне неопределенную ссылку и я не знаю, что делать или как связать его, поэтому я могу использовать функции C в коде.

ответ

0

Я вижу две проблемы:

  1. Похоже, вы вызываете функции библиотеки C getchar, putchar & printf но вы не связывая в библиотеке C на ld командной строке.

  2. Компиляторы C имеют тенденцию добавлять символы с символом подчеркивания. Большинство ассемблеров этого не делают, поэтому вам, вероятно, нужно позвонить _getchar, _putchar & _printf.

+0

Я попытался с помощью _getchar, _putchar, и _printf, но он все еще говорит мне то же самое, но только в том числе _ с ошибкой –

+0

также как бы связать в библиотеке C к «LD» в командной строке –

+0

Linux ELF-системы не управляют именами с ведущим '_'. Вероятно, вы, вероятно, прав насчет недостающего '-lc'. –

Смежные вопросы