movl %edi, %ecx # store input in register %edi
movl $4, %edx # read one byte
这部分都是错误的。您无法将读取结果存储在寄存器中。这实际上是在将结果存储在%edi中包含的地址中,由于您没有设置它,所以可能是您没有业务存储任何内容的地方。您首先需要在内存中腾出空间来存储字符串。您还将读取四个字节而不是一个字节。
我会用这样的东西代替
subl $4, %esp
movl %esp, %ecx
movl $4, %edx
这将为堆栈上的4个字节腾出空间,然后将堆栈的顶部用作存储字符串的地址。您还必须修改write syscall的参数才能使用此地址。
您还必须处理的另一个问题是stdin和stdout通常处理文本,因此您正在阅读的内容可能是字符串而不是数字,要将其用作数字,则必须将其转换为然后将其转换回原先的状态。