x86 汇编中逻辑与的紧凑实现

Compact implementation of logical AND in x86 assembly

, x86 汇编极客!

我有一个有趣的问题来测试你的汇编程序编程技能。
我是这个问题的作者,所以我知道正确答案。

你的任务是在x86汇编中实现逻辑与并满足以下5个条件:

条件 #1
布尔值以最标准的方式编码为 16 位字:

0x0000         = False
0x0001..0xFFFF = True

条件 #2
16 位值的操作 "logical AND" 如下所示:

  logical_AND(value1,value2) == 0    if (value1 == 0) or (value2 == 0)
  logical_AND(value1,value2) != 0    if (value1 != 0) and (value2 != 0)

您必须为任何 16 位 value1value2 给出正确的结果。
请注意,您可以为 "True" 结果自由选择任何非零值,而不仅仅是 0x00010xFFFF.
例如,允许有 logical_AND(0xDEAD,0xBEEF) == 42

条件#3
您应该为 x86 实模式编写 16 位代码。
输入参数在AXBX,结果在AX:

  ; Registers on entry:
  ;  AX = value1
  ;  BX = value2
  (your code goes here)
  ; Registers on exit:
  ;  AX = logical_AND(value1,value2)
  ;  BX,CX,DX,SI,DI,BP and their 32-bit extensions may contain garbage on exit

显然,单个指令 and AX,BX 是不够的:当 AX=1BX=2 时,结果必须是非零的。

条件#4
允许任何 x86 指令(甚至 SSE)。
您可以使用堆栈。
不允许使用外部代码(call ExternalProcint XX)和外部查找表。
所有初始化数据都应该在您的代码块中。

示例解决方案(12 字节代码)

   ; **** Entry: AX, BX
   test AX,AX
   setnz AL
   test BX,BX
   setnz BL
   and AX,BX
   ; **** Exit: AX

示例解决方案(6 字节代码)

   ; **** Entry: AX, BX
   neg AX
   sbb AX,AX
   and AX,BX
   ; **** Exit: AX

示例解决方案(5 字节代码)

   ; **** Entry: AX, BX
   cmp AX,BX
   jb @Done
   xchg AX,BX
@Done:
   ; **** Exit: AX

条件 #5
您必须仅使用 4 个字节的代码来执行任务。

可能您已经在 AX 和 CX 中找到输入参数非常短的解决方案。
不错的尝试!
不幸的是,这个解决方案不是正确答案(因为使用 CX 作为输入)。

可能存在不止一个正确答案。
无论如何,第一个正确答案(满足所有 5 个要求)将获得 500 声望奖励。

我自己的4字节长的代码比较出乎意料,非常了不起属性。

请勿暴力破解。动动脑筋。

致版主:
这不是代码高尔夫。第一个正确答案将被接受。

 MUL BX 
 OR  AX, DX

在较旧的机器上,与更长的答案相比,这可能不是很快。