首页 > 解决方案 > 从文件重定向输入时,yasm多个任意输入不起作用

问题描述

我是一名学生,我在组装方面有点挣扎。

我必须制作一个基本的计算器,它可以接受 2 个 64 位任意整数作为输入和一个 8 位字符。

从这些输入中,我需要使用 char 来确定应该进行什么操作。加法、乘法、减法或除法。

大学使用一个程序来测试我们的程序,该程序通过重定向来自预定文件的输入来运行我们的程序;将我们的输出与预期输出进行比较。我们没有从这个程序中得到任何反馈,只是一个标记。

我的代码在控制台中实现时有效,但在像他们的程序那样从文件重定向输入时无效。

这是我的代码的“错误部分”:

_start:
mov rax, 1          ;Write
mov rdi, 1          ;Std out
mov rsi, request1   ;Address of message.    Asks for first input
mov rdx, 24         ;Length of message
syscall             ;Calls kernel

mov rax, 0          ;Read
mov rdi, 0          ;Std in
mov rsi, input1     ;Address of variable.   Largest 64-bit int is 19
mov rdx, 20         ;Max length of input.   digits long + newline
syscall             ;Calls kernel

mov rax, 1          ; Another Write. Asks for operand
mov rdi, 1
mov rsi, input1
mov rdx, 20
syscall

mov rax, 0          ;Another Read. Gets operand + newline
mov rdi, 0
mov rsi, operand
mov rdx, 2
syscall

mov rax, 1          ;Another Write., Asks for second input
mov rdi, 1
mov rsi, request3
mov rdx, 25
syscall

mov rax, 0          ;Another Read. Caters for a 64-bit number
mov rdi, 0
mov rsi, input2
mov rdx, 20
syscall

例如,假设我的输入文件具有以下内容:

10000000000
+
101010101

我使用以下命令重定向程序的输入:

./program < inputfile

然后我的程序将数据读取到变量中,如下所示:

Input1 : 10000000000\n+\n101010
operand: 10
Input2 : 1

如何让程序停止读取换行符?或者我该如何解决这个问题?

我尝试逐位读取输入数字,但在卡住之前我并没有得到很大的变化。

标签: fileredirectassemblyinputyasm

解决方案


运行strace ./myprogram。如果该文件描述符上有更多可用数据,则read()系统调用不会以换行符结束,当您重定向时就是这种情况。

以交互方式按下返回“提交”该行并可以read()提前返回(在读取20作为大小传递的完整字节之前)。

因此,您当前的程序取决于 POSIX TTY 行为。


修复:解析字符串而不是依赖于单独的写入。您可以查找'\n'分隔输入行的字符。


推荐阅读