Я получил эту ошибку при попытке скомпилировать простую функцию 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
@Sunspawn: вы можете использовать C-подобные выражения в ассемблере: 'CMPB $«а», (% EAX)' будет более компактным символическим способом, чтобы написать ее, а не определение символ с символом '.equ' и ссылаясь на него. –
Кроме того, мне потребовалось некоторое время, чтобы выяснить, о чем жалуется компоновщик: 'cmpB' просил его использовать младший байт адреса как немедленный, и нет никакого способа попросить компоновщика создать перемещение для просто младший байт адреса. –