在x86程序集中紧凑实现逻辑AND

时间:2015-06-10 15:53:56

标签: assembly x86 machine-code x86-16

您好 x86汇编程序极客!

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

您的任务是在x86程序集中实现逻辑AND 并满足以下5个条件:

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

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

条件#2
操作"逻辑AND"对于16位值,如下所示:

  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字节长代码非常出乎意料,具有非常显着的特性。

请不要蛮力。用你的大脑。

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

1 个答案:

答案 0 :(得分:3)

 MUL BX 
 OR  AX, DX

在较旧的机器上,与较长的答案相比,这可能不会非常快。