【问题标题】:Swapping bits in assembly x8086在汇编 x8086 中交换位
【发布时间】:2024-12-18 04:00:01
【问题描述】:

我的装配课作业在尝试解决时遇到了问题,问题如下:

" 编写一个程序,在 DS:10H 和 DS:20H 之间交换 D2 (2nd Bit)。"

我尝试使用 Shift Right 来解决它,但似乎不太好。

【问题讨论】:

  • 现在你希望我们为你做功课吗?请提供一些代码。到目前为止,您尝试了什么?
  • 嘿,我不需要你做我的功课,只需要一个方法来解决这个问题,你不必评论。
  • 右移会右移位。虽然我可以想象使用右移(有点人为地令人费解)来解决您的问题,但它不能用作解决问题的唯一方法,需要更多的指令来支持这种构造。从问题中不清楚您的想法是什么,听起来更像是您随机选择了一些指令并希望它会起作用。不,只需从原始值中提取所需的位,然后清除那里的那些位置,然后将另一位放在那里(但保留所有其他位),这将作为“交换的”第二位结束。

标签: assembly x86-16


【解决方案1】:

解决这个问题的可能方法:

(为了便于阅读,我在示例中使用了 4 位。所以字母 a,b.. 是位,每个位的值都是 0 或 1。)

abcd AND 0010 给出位 c: 00c0

pqrs AND 0010 给出 r: 00r0

然后:

abcd AND 1101 清除 c:ab0d

ab0d OR 00r0 将 r 放入:abrd

类似:

pqrs AND 1101 清除 r: pq0s

pq0s OR 00c0 将 c 放入:pqcd

【讨论】:

  • IIRC,您可以使用修改后的 xor-swap 稍微更有效地执行此操作:在前两个 xor 操作或其他操作之后使用 0b0010 进行掩码,因此总共需要 4 个按位操作交换 1 位并保留其余位。如果我没记错的话;我实际上并没有完成它。 >.
最近更新 更多