[英]Problem when reversing a string, it does not output the full reversed string
我一直在尝试反转 x86 64 位汇编代码中的字符串,代码的重点是返回反转字符串的长度,同时还反转字符串
我的代码是:
reverse_string_asm:
#rdi ->str
#rsi -> i
#rdx -> start index
#r8 -> end index
#rcx ->temp
#rax -> count
test %rdi, %rdi #check if str is null
jz ret_null
xor %rsi, %rsi
xor %r8, %r8
xor %r9, %r9
count_length:
mov (%rdi, %rsi, 1), %r9 # str[i] -> r9
cmp $0, %r9 #check if str[i] != 0
je pre_while
inc %rsi # i++
jmp count_length
pre_while:
subq $1, %rsi #i - 1
mov %rsi, %r8 # end index = i - 1
addq $1, %rsi #restore i
mov $0, %rdx
mov $0, %r9
xor %rcx, %rcx
jmp while
while:
cmp %r8, %rdx # start index < end index
jge done
mov (%rdi, %rdx, 1), %rcx #temp = str[start index]
mov (%rdi, %r8, 1), %r9
mov %r9, (%rdi, %rdx, 1) #str[start index] = str[end index]
mov %rcx, (%rdi, %r8, 1) #str[end index] = temp
inc %rdx #start++
dec %r8 #end--
jmp while
done:
movq %rsi, %rax #want to return the length of the reversed str which is equal to the length of original, count = i
ret
ret_null:
xor %rax, %rax
ret
我用来测试的代码是:
printf("Testing reverse_string_asm\n");
char *s = (char *) malloc (100);
memset(s, 0, 100);
strcpy(s, "Hello World!");
puts(s);
unsigned long l = reverse_string_asm(s);
printf("Size of rev str: %lu\n", l);
puts(s);
printf("\n");
虽然当我运行我的代码时,我得到了正确的长度输出,但输出的反转字是:!dl
什么时候应该是:!dlroW elloH
我找不到代码在哪里产生了这个问题,或者我在做什么是不正确的。 我是汇编语言的新手,对于解决这个问题的任何帮助,我将不胜感激。 谢谢你。
问题是您一次读取和写入 8 个字节,但您的行为就像一次只有 1 个字节。 例如,给定char *str
,相当于 C 的str[end_index] = temp;
是mov %cl, (%rdi, %r8, 1)
,但你写mov %rcx, (%rdi, %r8, 1)
,在 C 中将是*(long *)(str + end_index) = temp;
. 要修复它,当您移入和移出mov
时,请使用 1 字节寄存器而不是 8 字节寄存器。 将所有出现的%rcx
替换为%cl
并将%r9
替换为%r9b
应该可以修复您的程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.