Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86汇编,打印4个字符串。奇怪的输出_Assembly_X86 - Fatal编程技术网

Assembly x86汇编,打印4个字符串。奇怪的输出

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

所以,我正在用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("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