为什么要替换
movl $84, 3(%rsi)
与
movl $3, %ecx
leal (%esi, %ecx, 1), %r11d
movl $84, (%r11d)
结果为Segmentation fault (core dumped)
,我该如何解决?
(稍后我将使用%ecx
作为计数器来循环遍历数组)
据我了解,movl $84, 3(%rsi)
将字面值84(ASCII' T')移动到result[2]
(根据打印输出正常工作和更正:{{1} }})
另一方面,
24 = 02aTa
第1行将整数值3移动到movl $3, %ecx
leal (%esi, %ecx, 1), %r11d
movl $84, (%r11d)
第2行计算的%ecx
= %esi + 1 * %ecx
与%esi + %ecx
相同(不正确,因为它不起作用)
第3行将整数值84(' T')移动到上面的地址(应该与3(%esi)
相同)
使用movl $84, 3(%rsi)
替换%esi
等等(包括使用%rsi
,leaq
)在非工作部分,我得
movq
所以我的问题是:如何实现*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)
的效果?
使用movl $84, %ecx(%esi)
的main.c
gcc main.c helper.s
helper.s
#include <stdio.h>
void helper(unsigned int value, char * result);
int main() {
char result[6];
helper(24, result);
printf("%5u = %s\n", 24, result);
return 0;
}
用 .globl helper
helper:
# 0
movl $48, 0(%rsi)
# 2
movl $50, 1(%rsi)
# a
movl $97, 2(%rsi)
#ifdef DEBUG
# T
movl $84, 3(%rsi)
#ELSE
/*
movl $3, %ecx
leal (%esi, %ecx, 1), %r11d
# T
movl $84, (%r11d)
*/
#ENDIF
# a
movl $97, 4(%rsi)
movl $0x0000000000000000, 5(%rsi)
ret
替换所有%rsi
(以及32位寄存器的所有64位寄存器),我得到%esi
。这是为什么?