【问题标题】:NASM not reading ctrl-d characterNASM 不读取 ctrl-d 字符
【发布时间】:2013-09-26 03:03:22
【问题描述】:

我正在编写一个简单的 NASM 汇编程序。我已经弄清楚了大约 95%。但是,我遇到了一个我似乎无法弄清楚的问题。点击 ctrl-d 应该显示再见消息,然后终止程序。这是我所拥有的骨架

Section .bss
    Buff resb2
    BuffLen equ $-Buff

loop:
    ; some code
    mov ecx, Buff
    move edx, BuffLen
    ; some code
    cmp ecx, 0x04
    je Exit
    jne loop

根据ASCII图表,ctrl+d是0x04。我一定错过了一些简单的东西。有人有什么想法吗?

【问题讨论】:

  • 1) 您的程序是否适用于其他代码,尤其是可打印代码? 2) 根据您用于与程序交互的终端类型,CTRL-D 可能会被困在那里或被翻译。
  • 除了 Chris 提到的内容之外,您还将ecxBuff 的地址)与0x04 进行比较。不大可能!试试cmp byte [ecx], 0x04
  • 抱歉反应慢,正在写另一个作业。我尝试使用 ctrl_j (0x0A) 并让它正常工作。这让我相信 ctrl+d 出了点问题。弗兰克,我也实施了你的建议。
  • 要检查 Chris Stratton 是否正确,您可以尝试 C 程序并检查 C 程序是否读取 Ctrl+D。
  • 在 Unix/Linux 上的 C 程序中,ctrl-D 将作为标准输入的 EOF 通过。所以操作系统正在解释它,而不仅仅是通过0x04

标签: assembly nasm


【解决方案1】:

您键入的 Ctrl-D 不会成为输入的一部分。相反,它是向您的终端发送标准输入文件流上的 EOF 条件的信号。您的程序应该响应处于 EOF 状态的标准输入。 (例如,在 Posix 上,read(2) 系统调用将返回零。)

【讨论】:

  • ctrl-d 仅在您在空行中键入 EOF 时发送。如果您在ctrl-d 之前键入一些文本,它只会“发送”该文本(即使read 返回)而不使其返回EOF。试试cat
【解决方案2】:

您可以尝试“cmp eax, 0”,而不是比较“cmp ecx, 0x04”。因为在点击 CTRL+D 之后,Linux 中 read 系统调用的返回值为 0 字节,这个“0”将保存在 eax-Register 中。

PS:我不能 100% 确定它是如何工作的,因为我现在也有这个问题。但这样我至少可以在大部分时间退出我的程序。

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2014-07-21
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多