您好, 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位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字节长代码非常出乎意料,具有非常显着的特性。
请不要蛮力。用你的大脑。
主持人:
这不是代码高尔夫。第一个正确的答案将被接受。
答案 0 :(得分:3)
MUL BX
OR AX, DX
在较旧的机器上,与较长的答案相比,这可能不会非常快。