【问题标题】:Why we have to clear the ax register when we are going to use a user input?当我们要使用用户输入时,为什么我们必须清除 ax 寄存器?
【发布时间】:2013-02-23 15:59:32
【问题描述】:

我的问题是,为什么我们必须用xor ax,ax 清除ax 寄存器?我以为当用户为变量A输入一个字符时,当用户再次为变量B输入一个字符时,这可能会覆盖ax中的内容值,但似乎有所不同。

这是在 x86 汇编中。

使用 DOS,一个 16 位的汇编器。 DOS 中断按任意字符:

mov ah, 01h

【问题讨论】:

  • 我们在这里说的是什么“字符输入”?从键盘数据缓冲区直接读取?操作系统 API?
  • 如果没有更多上下文,这没有任何意义。什么操作系统?怎么读键盘?您使用 OS API(哪个 API 调用?)、BIOS 调用(哪个?)或自定义键盘处理程序或其他什么?
  • 很抱歉,我说的是 DOS,一个 16 位汇编器,键盘上的任何字符。使用 DOS 中断:mov ah, 01h

标签: assembly keyboard x86 dos xor


【解决方案1】:

因为在 AH 中您发送的是 INT 16 的参数,

如果 AH == 0 则读取键盘输入

如果 AH == 1 则查询键盘状态/预览键 等等。

阅读this

【讨论】:

  • 为了补充 ladan 的回答,“xor”被(是?)经常使用,因为与“mov ax, 0”相比,它节省了几个时钟周期。
  • @Luis 在 16 位 x86 代码中,xor ax,ax 被编码为 31 C0(2 个字节),而 mov ax,0 被编码为 B8 00 00(3 个字节)。因此,您可以使用xor ax,ax 节省一个字节。在 808x 中 xorax,axmovax,0 快 1 个时钟(3 个时钟
  • @nrz 我同意,过去的优化和经验法则不再适用。大多数优化最好留给编译器,除非您确切知道自己在做什么以及正在使用什么硬件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
  • 2011-01-22
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 2015-07-11
相关资源
最近更新 更多