汇编:从标准输入中读取整数,将其递增并打印到标准输出

我为IA32编写了以下汇编脚本。应该从stdin读取一个数字,将其递增并打印到stdout,但是它的行为不符合预期,它不会打印任何内容(也许从stdin的读取不会终止,或者打印有问题吗?)

.section .text

.globl _start

_start:

movl $3, %eax # use syscall 3 (read) to read from stdin

movl $0, %ebx # reads from stdin (FD 0)

movl %edi, %ecx # store input in register %edi

movl $4, %edx # read one byte

int $0x80 # invoke system call to read from stdin

incl %edi # increment the value we got from stdin

movl $4, %eax # use syscall 4 (write) to print to screen

movl $1, %ebx # print to stdout (FD 1)

movl %edi, %ecx # pointer to text to write out

movl $4, %edx # length of text to write out (1 byte)

int $0x80 # invoke system call to write to stdout

movl $1, %eax # use syscall 1 (exit) to exit

movl $0, %ebx # error code = 0

int $0x80 # invoke system call

看到错误了吗?对于任何帮助,我要先感谢您,

祝一切顺利,西蒙

回答:

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通常处理文本,因此您正在阅读的内容可能是字符串而不是数字,要将其用作数字,则必须将其转换为然后将其转换回原先的状态。

以上是 汇编:从标准输入中读取整数,将其递增并打印到标准输出 的全部内容, 来源链接: utcz.com/qa/419829.html

回到顶部