在Ubuntu

时间:2016-10-25 22:58:09

标签: ubuntu assembly nasm x86-64 ld

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

确定。所以我一直在使用这个程序,为我的一个类运行Vigenere Cipher,当我尝试运行nasm时,第一部分工作正常

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'

我不知道为什么它给了我这个我认为这是外部的重点。此外,如果你想知道我在64位运行Ubuntu即时通讯。 香港专业教育学院曾尝试阅读如何解决这个问题,但我似乎无法找到一个可以帮助我。

编辑:现在我正在尝试使用gcc而不是ld链接,但是当我使用

gcc -o output cipher.o

或类似的东西给了我

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

它仍然给我未定义的引用,我不知道该怎么做或如何链接它所以我可以在代码中使用C函数。

1 个答案:

答案 0 :(得分:0)

我看到两个问题:

  1. 看起来您正在调用C库函数getcharputchar& printf但您未在ld命令行的C库中进行链接。

  2. C编译器倾向于使用下划线添加符号名称。大多数装配工都不这样做,因此您可能需要致电_getchar_putchar& _printf