Assembly x86汇编,打印4个字符串。奇怪的输出
所以,我正在用C编写一个程序,将类似于typescript的语法转换为x86汇编语言。 以下代码:Assembly x86汇编,打印4个字符串。奇怪的输出,assembly,x86,Assembly,X86,所以,我正在用C编写一个程序,将类似于typescript的语法转换为x86汇编语言。 以下代码: hello = (x: string, y: string, z: string, a: string) => { print(x); print(y); print(z); print(a); return 1; }; main = (argc: int, argv: Array<string>):int => { hello("fir
hello = (x: string, y: string, z: string, a: string) => {
print(x);
print(y);
print(z);
print(a);
return 1;
};
main = (argc: int, argv: Array<string>):int => {
hello("first\n", "second\n", "third\n", "fourth\n");
return 0;
};
然后我使用
as --32 a.s -o main.o -g -W
ld main.o -o main -m elf_i386
当我执行我的程序时:
./main
我得到一个奇怪的输出:
firsȁÔÿ܁ÔÿðÔÿÔÿ Ôsecond
third
fourth
如果我只打印3个字符串,一切看起来都很好
我做错了什么?
我花了好几个小时想弄明白这一点。
在这一点上,我几乎把胡子都刮掉了
我真的很感谢你的帮助
谢谢。我解决了这个问题
在把我所有的弦都推到堆栈上之前,
我需要将堆栈的大小调整为(字符串数*4)才能适应
所有字符串地址
所以在这种情况下,解决办法是
subl $24, %esp
在推动所有弦之前
6*4
其中6
是本例中的字符串数
现在,当我将地址写入堆栈时,它们不会覆盖前面的字符串。好吧,
movl%esp,-16(%ebp)
不会覆盖第一个字符串的部分吗?在调试器中逐步执行main
函数,观察寄存器值和堆栈内容。我看不到C程序…@AnttiHaapala它在这里不相关,因为它在程序集中,错误在那里,C标记也不存在。@Michael我通过添加(字符串数*4)来解决它在我移动所有字符串之前,移动到%esp
。我不确定它为什么会起作用,尽管它可能会起作用,但肯定是不正确的。这会将ESP置于返回地址之上,使其容易被信号处理程序、调试器或其他程序破坏。堆栈向下增长,您可以使用sub
(或添加负数)分配新空间。确保sub
有足够的空间将ESP指向下面要存储字符串的位置。@PeterCordes这是一个打字错误,我的意思是使用subl
subl $24, %esp