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 ./myprogram
。 read()
系统调用不会在换行符处结束 如果该文件描述符上有更多可用数据,重定向时就是这种情况。
交互式地按 return "submits" 行,使 read()
到 return 成为可能(在读取完整的 20
字节之前传递为尺寸)。
因此您当前的程序取决于 POSIX TTY 行为。
修复:解析字符串而不是依赖于单独的写入。您可以查找分隔输入行的 '\n'
个字符。
我是一名学生,我在组装方面遇到了一些困难。
我必须制作一个基本的计算器,它可以接受 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 ./myprogram
。 read()
系统调用不会在换行符处结束 如果该文件描述符上有更多可用数据,重定向时就是这种情况。
交互式地按 return "submits" 行,使 read()
到 return 成为可能(在读取完整的 20
字节之前传递为尺寸)。
因此您当前的程序取决于 POSIX TTY 行为。
修复:解析字符串而不是依赖于单独的写入。您可以查找分隔输入行的 '\n'
个字符。