2016-10-25 13 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 

だから私は、私のクラスのいずれかのVigenere暗号を実行するために、このプログラムを使用していると私はNASMを実行しようとすると、それは最初の部分に正常に動作しますUbuntu上でアセンブリ言語x86上で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' 

を与え続けるためには、私はそれは私がにexternのポイントだと思った私は、このを与える理由を知りません。また、私が64ビット版のUbuntuを使っているのはどういうことでしょうか。 Iveはこれを修正する方法の読書を試みましたが、私はそれを助けるものを見つけることができません。

編集:今私はリンクする代わりに、LDの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

私は2つの問題を参照してください。あなたはputchar & printfgetchar Cライブラリ関数を呼び出しているが、あなたはldコマンドラインでCライブラリにリンクしていないように見えます

  1. を。

  2. コンパイラはシンボル名の前にアンダースコアを付ける傾向があります。ほとんどのアセンブラはそれをしないので、おそらく_getchar_putchar & _printfと呼ぶ必要があります。

+0

私は_getchar、_putchar、&_printfを使用して試してみましたが、それはまだ私に同じことを伝えますが、ちょうど_エラーで –

+0

もどのように私は「LD」コマンドラインにCライブラリにリンクするなど、 –

+0

LinuxのELFシステムでは、先頭に '_'を付けて名前をマングルしません。あなたは欠けている '-lc'についておそらく正しいでしょう。 –

関連する問題