【问题标题】:NASM on linux: Using sys_read adds extra line at the endLinux 上的 NASM:使用 sys_read 在末尾添加额外的行
【发布时间】:2016-07-07 07:51:27
【问题描述】:

我现在正在自学汇编程序,我终于设法从终端读取输入并用它进行计算。

我为此使用 sys_read,它工作得非常好,但是当我使用它时,终端的行为就像我在运行程序后按了 Enter 键(一行与 root@kali:~/ASM$)。使用 scanf 时不会发生这种情况。

这是我的代码:

sys_read equ 3 sys_write equ 4 标准输出 equ 1 标准输入 2 节 .data prompt db "输入两个 1 位数字进行整数除法。", 10, 0 结果 db 10, "%i / %i = %i.", 10, 0 .bss 节 一个 resb 4 b resb 4 回复 4 部分 .text 外部打印 全球主要 主要的: 推送ebp mov ebp, esp 推 ebx 推esi 推送编辑 推送提示 调用 printf mov eax, sys_read mov ebx, 标准输入 mov ecx, 一个 移动 edx, 1 诠释 80 小时 子 dword [a], 0x30 mov eax, sys_read mov ebx, 标准输入 mov ecx, b 移动 edx, 1 诠释 80 小时 mov eax, sys_read mov ebx, 标准输入 mov ecx, b 移动 edx, 1 诠释 80 小时 子 dword [b], 0x30 移动 dx, 0 mov 斧头,[a] div 双字 [b] mov [c], 斧头 推双字 [c] 推双字 [b] 推 dword [a] 推送结果 调用 printf 添加特别是40 流行音乐 流行音乐 流行音乐 mov esp, ebp 流行音乐 ret

这是我得到的输出:

root@kali:~/ASM$ ./div 输入两个 1 位数字进行整数除法。 1 1 1 / 1 = 1。 root@kali:~/ASM$ root@kali:~/ASM$

我不明白为什么会出现这条额外的行。

【问题讨论】:

  • Linux 控制台默认情况下通常设置为行缓冲模式。字符保留在缓冲区中,直到处理完毕。您每次读取 3 次 1 字节,这会消耗 1 1,但这会将实际的新行留在缓冲区中。你不会在你的程序中对它做任何事情,所以它会在之后由 shell 处理。您可以在读取 3 个字符后刷新标准输入,或者将最后一个 sys_read 更改为读取 2 个字符而不是 1 个字符。这会消耗换行符。
  • 没问题。另一个观察结果是 stdin 是文件描述符 0 而 stdout 是文件描述符 1。您似乎使用了错误的值。
  • 等一下,你是running as root?但是您的提示是使用$ 而不是通常的# 来指示UID=0?在特权帐户上尝试 asm 开发并不是一件明智的事情。
  • 很抱歉这么晚才回答,但我今天才看到。迈克尔:我用的很好,我为什么要改变它们?彼得:你知道 Kali Linux 是什么吗?您始终以 root 身份登录。
  • @cmdj13:我听说过它,并且知道它专注于数字取证和渗透测试。所以你可能经常需要root,但是一个好的sudo设置是一种更理智的方法来解决这个问题。难怪我听说过对 Kali Linux 的负面评价,如果这是他们做出的那种选择。我的意见是,以 root 身份运行有缺陷的 asm 代码是不明智的。

标签: linux assembly nasm


【解决方案1】:

您的结果数据在要打印的字符串之前包含一个额外的换行符 (10):

result db 10, "%i / %i = %i.", 10, 0
          ^^

删除它会删除输出中多余的换行符。

您可以通过从 stdin 消耗更多字符、刷新缓冲区或从缓冲区读取三个以上字符来删除额外的 shell 行。您输入数据时按下的换行符也将存储在该行的缓冲区中,如果您的代码没有读取,shell 会将其作为空行读取。 (即,如果您只是在 shell 中按 enter 而不输入任何其他内容,它将表现出与 shell 相同的行为。)

另外,我建议使用扩展的 32 位寄存器而不是 16 位寄存器进行数学运算,因为您的变量是 32 位的。

【讨论】:

  • 唯一改变的是我在输入的行和打印结果的行之间没有换行符。我知道 32 位会更好,但这完全是为了获取和计算输入。
  • @cmdj13 - 这不是您要寻找的行为吗? (顺便说一句,请参阅我的编辑,因为您似乎使用的是 32 位变量而不是 16 位)
  • 不,我不想有多余的 root@kali:~/ASM$ 行。
猜你喜欢
  • 1970-01-01
  • 2013-01-15
  • 2017-02-28
  • 2017-01-21
  • 1970-01-01
  • 2018-05-26
  • 2013-05-25
  • 2022-11-16
  • 1970-01-01
相关资源
最近更新 更多