2017-03-25 19 views
2

저는 어셈블리 언어에서 아주 새로운 언어입니다. 저는 시저 암호를 해독 할 수있는 간단한 프로그램을 만들려고했습니다. 문제는 연결 후 다음과 같은 오류가 발생합니다.어셈블러에서 재배치 된 잘림 오류

cezar.o: In function `loop': 
(.text+0xbf): relocation truncated to fit: R_X86_64_8 against `.data' 
cezar.o: In function `check_letter': 
(.text+0xd5): relocation truncated to fit: R_X86_64_8 against `.data' 

나는 이것이 무엇을 의미하는지 모릅니다. 아무도 나를 도울 수 있습니까? 오히려, # explainMeLikeI'm5; P

내 코드 neded 경우 :

add $key, %bh 

이것은 key의 값을 추가하려고 :

.data 
STDIN = 0 
STDOUT = 1 
SYSWRITE = 0 
SYSREAD = 1 
SYSEXIT = 60 
EXIT_SUCCESS = 0 
BUFLEN = 512 
BASE = 10 
BASE_NUM = 10 
BASE_CHAR = 26 
NUM_BEG = 48 

error_msg: .ascii "Bad characters in key\n" 
error_msg_len = .-error_msg 

key: .ascii "-128" 
key_len = .-key 

.bss 
.comm textin, 512 
#.comm keyin, 512 
.comm textout, 512 

.text 
.globl _start 

_start: 
#check if key is good 
movq $0, %rdi 
movb key(, %rdi, 1), %bl #load first char to bl 
cmp $'-', %bl   #check if it's - 
jne error 
movq $1, %rdi   #counter 
movb key(, %rdi, 1), %bl 
cmp $'0', %bl   
jl error     
cmp $'9', %bl   
jg error 

mov $key_len, %rdi 
mov $1, %r11   #powers of 10 
mov $0, %r8    #calculated key goes to r8 
sub $1, %rdi   #because I want numbers only, "-" doesn't interest me now 

ascii_to_num: 
cmp $1, %rdi   #at rdi=0 jump out of loop 
jl load_text   

mov $0, %rax   #clearing rax 
mov key(, %rdi, 1), %al 
sub $NUM_BEG, %al  
mul %r11    #multiplying al by power of it's position 
add %rax, %r8   

mov %r11, %rax   
mov $10, %r12  
mul %r12     
mov %rax, %r11   

dec %rdi    #decrementation 
jmp ascii_to_num   


load_text: 
movq $SYSREAD, %rax  
movq $STDIN, %rdi  
movq $textin, %rsi  
movq $BUFLEN, %rdx  

dec %rax    #delete '\n' 
movq %rax, %r10   

movq $0, %rdi   #counter 
loop: 
movb textin(, %rdi, 1), %bh 
         #check if number 
movb $'0', %bl   #I'm using bl for comparing 
cmp %bl, %bh    
jl ending_loop   
movb $'9', %bl 
cmp %bl, %bh    
jg check_letter   
add $key, %bh   
cmp $'0', %bh 
jl correct_num 
jmp ending_loop 

check_letter: 
movb $'A', %bl 
cmp %bl, %bh    
jl ending_loop   
movb $'Z', %bl 
cmp %bl, %bh    
jg ending_loop   
add $key, %bh   
cmp $'A', %bh 
jl correct_char 
jmp ending_loop 

correct_num:    
add $BASE_NUM, %bh 
cmp $'0', %bh 
jl correct_num 
jmp ending_loop 

correct_char:  
add $BASE_CHAR, %bh 
cmp $'A', %bh 
jl correct_char 
jmp ending_loop 

ending_loop: 
movb %bh, textout(, %rdi, 1) 
inc %rdi 
cmp %r10, %rdi 
jle loop 
jmp show 

error:     #error message 
mov $SYSWRITE, %rax 
mov $STDOUT, %rdi 
mov $error_msg, %rsi 
mov $error_msg_len, %rdx 
syscall 

show:     #display message and close programm 
add $'\n', textout 
mov $SYSWRITE, %rax 
mov $STDOUT, %rdi 
mov $textout, %rsi 
mov $BUFLEN, %rdx 
syscall 

mov $SYSEXIT, %rax 
mov $EXIT_SUCCESS, %rdi 
syscall 

답변

4

오류는 당신이 쓴 두 줄 참조 (즉, 문자열의 주소 -128)를 bh으로 변경하십시오. 주소가 255보다 크므로 bh과 같은 바이트 레지스터에 맞지 않습니다. 이러한 이유 때문에 링커에서 표시된 오류가 발생합니다.

key의 주소를 bh에로드하여 수행하려고 시도한 내용을 분석하지는 않았지만 그렇게하지 않으면 작동하지 않습니다.

: 당신이 key에서 데이터의 첫 번째 바이트를로드 할 경우 key의 주소를로드 할 경우,

add key(%rip), %bh 

쓰기,이 같은 lea를 사용하여 64 비트 레지스터에로드 할 필요

lea key(%rip), %rbx 
+0

젠장, 물론! 처음에는 열쇠가 intiger (일을 더 쉽게하기 위해)이었고, 이제 ascii로 전환 한 후, 문자열이 아닌 실제로 변환 한 것을 추가하기위한 지시 사항을 추가하는 것을 잊어 버렸습니다. 감사! 편집 : 이제 테스트를 마친 후에도 의도 한대로 작동하지 않습니다 (결과가 없으므로 원하는 작업을 수행 할 수 있는지 알 수 없습니다).하지만 오류가 없으므로 플러스입니다. : D – Wylfryd

+0

@Wylfryd 환상적! 언제나 기꺼이 도와 드리겠습니다. – fuz