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 位 value1
和 value2
给出正确的结果。
请注意,您可以为 "True" 结果自由选择任何非零值,而不仅仅是 0x0001
或 0xFFFF
.
例如,允许有 logical_AND(0xDEAD,0xBEEF) == 42
条件#3
您应该为 x86 实模式编写 16 位代码。
输入参数在AX
和BX
,结果在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=1
和 BX=2
时,结果必须是非零的。
条件#4
允许任何 x86 指令(甚至 SSE)。
您可以使用堆栈。
不允许使用外部代码(call ExternalProc
、int 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
在较旧的机器上,与更长的答案相比,这可能不是很快。
嗨, 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 位 value1
和 value2
给出正确的结果。
请注意,您可以为 "True" 结果自由选择任何非零值,而不仅仅是 0x0001
或 0xFFFF
.
例如,允许有 logical_AND(0xDEAD,0xBEEF) == 42
条件#3
您应该为 x86 实模式编写 16 位代码。
输入参数在AX
和BX
,结果在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=1
和 BX=2
时,结果必须是非零的。
条件#4
允许任何 x86 指令(甚至 SSE)。
您可以使用堆栈。
不允许使用外部代码(call ExternalProc
、int 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
在较旧的机器上,与更长的答案相比,这可能不是很快。