yasm 多个任意输入在从文件重定向输入时不起作用

yasm multiple arbitrary inputs not working when redirecing inputs from a file

我是一名学生,我在组装方面遇到了一些困难。

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

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

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

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

这是我的代码 "faulty part":

_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

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

我试着逐个读取输入的数字,但在我卡住之前我并没有得到太多变化。

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

交互式地按 return "submits" 行,使 read() 到 return 成为可能(在读取完整的 20 字节之前传递为尺寸)。

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


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