2015-12-19 8 views
3

Я получил эту ошибку при попытке скомпилировать простую функцию case-swap в x86 AT & T сборка.Перемещение усечено в соответствии с: R_386_8 против '.rodata'

Я попытался оглянуться на другие вопросы с этой ошибкой, но ни один из них не был достаточно подобен, чтобы помочь в моем случае. Большинство из них занимались вещами в разных библиотеках и файлах, чего здесь нет.

Ошибка:

$ gcc -m32 -g main.c test.s -o Test4 
/tmp/ccQ49nKM.o: In function `scLOOP': 
/home/nikolay/Dropbox/comporg/ex3/solution/test.s:24:(.text+0x14): relocation truncated to fit: R_386_8 against `.rodata' 
collect2: error: ld returned 1 exit status 

Код:

.section .rodata 
.align  4 
error:  .string "invalid input!\n" # error message. 
a:  .byte 97   #a in ascii. 

    .text 

    .global swapCase  #swaps the cases of the string. 
    .type swapCase, @function 
swapCase: 
    pushl %ebp   #save old FP 
    movl %esp, %ebp  #set new FP 

    movl 8(%ebp), %eax  #get pointer to pstring 
    movb (%eax), %cl  #get length of pstring 
    addl $1, %eax  #move pointer to string itself 

    scLTEST:   #loop condition. 
    cmpb $0, %cl   #compare length with 0 
    je scDONE   #if length is zero, goto done 
    jmp scLOOP   #else: goto loop 

    scLOOP: 
    cmpb $a, (%eax)  #compares first byte of string with a='a'. 
    jl scTOLOWER  #byte is uppercase. 
    subb $32, (%eax)  #byte is lowercase, change to uppercase. 
    jmp scINC   #increment pointer. 
    scTOLOWER: 
    addb $32, (%eax)  #change to lowercase. 
    jmp scINC   #increment pointer. 

    scINC: 
    addl $1, %eax  #increment %eax to next byte 
    decb %cl   #decrement counter 
    jmp scLTEST   #end current loop iteration 

    scDONE: 
    movl 8(%ebp), %eax  #set return value to pointer to pstring. 
    movl %ebp, %esp  #restore old stack pointer 
    popl %ebp   #restore old FP 
    ret    #return to caller function 

ответ

2

cmpb $a, (%eax) вызывает ошибку. Я думаю, вы не хотели сравнивать адрес памяти a со значением (eax). BTW: сравнение памяти с памятью в x86 невозможно. Я предполагаю, что вы хотели сравнить байт (eax) с немедленным ASCII символом «а» (cmpb $97, (%eax)) Вы можете заменить

a:  .byte 97   #a in ascii. 

по

.equ a, 97 
+0

@Sunspawn: вы можете использовать C-подобные выражения в ассемблере: 'CMPB $«а», (% EAX)' будет более компактным символическим способом, чтобы написать ее, а не определение символ с символом '.equ' и ссылаясь на него. –

+0

Кроме того, мне потребовалось некоторое время, чтобы выяснить, о чем жалуется компоновщик: 'cmpB' просил его использовать младший байт адреса как немедленный, и нет никакого способа попросить компоновщика создать перемещение для просто младший байт адреса. –

-1

вы не должны знать таблицу ASCII. вы можете сделать

a: .byte 'a'