2016-10-25 9 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 암호를 실행하기 위해이 프로그램을 사용하고 내가 NASM을 실행하려고 할 때 그것은 첫 번째 부분을 잘 작동어셈블리 언어에 nasm을 사용할 때 계속 우분투에서 x86을 사용합니다.

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 비트에서 우분투를 실행. 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

나는 두 가지 문제를 참조하십시오

당신이 C 라이브러리 함수 getchar를 호출처럼 보이는
  1. , putchar & printf 있지만 ld 명령 줄에서 C 라이브러리에 연결 아닙니다.

  2. 컴파일러는 기호 이름 앞에 밑줄을 붙이는 경향이 있습니다. 대부분의 어셈블러는 그렇게하지 않으므로 _getchar, _putchar & _printf으로 전화해야합니다.

+0

내가 _putchar하는 _getchar를 사용하여 시도, _printf하지만 여전히 나에게 같은 일을 이야기하지만, 단지를 포함 한 또한 오류 –

+0

와 _ 내가 어떻게 'LD'명령 줄 –

+0

에 C 라이브러리에 링크 것 리눅스 ELF 시스템은 유명한'_'을 사용하여 이름을 변경하지 않습니다. 아마도'-lc'가 빠진 것에 대해 당신은 맞을 것이다. –