汇编程序中的重定位截断错误
Relocation truncated error in assembler
我对汇编语言完全陌生。我试图制作简单的程序来破译凯撒密码。问题是链接后出现这些错误:
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
如果需要我的代码:
.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 [=11=], %rdi
movb key(, %rdi, 1), %bl #load first char to bl
cmp $'-', %bl #check if it's -
jne error
movq , %rdi #counter
movb key(, %rdi, 1), %bl
cmp $'0', %bl
jl error
cmp $'9', %bl
jg error
mov $key_len, %rdi
mov , %r11 #powers of 10
mov [=11=], %r8 #calculated key goes to r8
sub , %rdi #because I want numbers only, "-" doesn't interest me now
ascii_to_num:
cmp , %rdi #at rdi=0 jump out of loop
jl load_text
mov [=11=], %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 , %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 [=11=], %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
错误指的是你写的两行:
add $key, %bh
这会尝试将 key
的值(即字符串 -128
的地址)添加到 bh
。由于地址大于 255,它不适合像 bh
这样的字节寄存器。因此,您会收到链接器指示的错误。
我没有分析过你想把key
的地址载入bh
的目的是什么,但是这样做是行不通的。如果要加载key
处数据的第一个字节,写
add key(%rip), %bh
如果你想加载key
的地址,你需要像这样使用lea
将它加载到一个64位寄存器中:
lea key(%rip), %rbx
我对汇编语言完全陌生。我试图制作简单的程序来破译凯撒密码。问题是链接后出现这些错误:
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
如果需要我的代码:
.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 [=11=], %rdi
movb key(, %rdi, 1), %bl #load first char to bl
cmp $'-', %bl #check if it's -
jne error
movq , %rdi #counter
movb key(, %rdi, 1), %bl
cmp $'0', %bl
jl error
cmp $'9', %bl
jg error
mov $key_len, %rdi
mov , %r11 #powers of 10
mov [=11=], %r8 #calculated key goes to r8
sub , %rdi #because I want numbers only, "-" doesn't interest me now
ascii_to_num:
cmp , %rdi #at rdi=0 jump out of loop
jl load_text
mov [=11=], %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 , %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 [=11=], %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
错误指的是你写的两行:
add $key, %bh
这会尝试将 key
的值(即字符串 -128
的地址)添加到 bh
。由于地址大于 255,它不适合像 bh
这样的字节寄存器。因此,您会收到链接器指示的错误。
我没有分析过你想把key
的地址载入bh
的目的是什么,但是这样做是行不通的。如果要加载key
处数据的第一个字节,写
add key(%rip), %bh
如果你想加载key
的地址,你需要像这样使用lea
将它加载到一个64位寄存器中:
lea key(%rip), %rbx