这些是问题:
我有这个,但我只懂基础知识。如果有人能给我一些关于如何完成这些问题的提示,那将是一个很大的帮助。我知道这可能是一个绝望的举动,但至少我会学习如何回答这些问题。
答案 0 :(得分:1)
"和"如果两个输入位均为1,则仅返回1
0和0是0
1和0是0
0和1是0
1和1是1
所以"清算"有点可以通过" anding"无论位(b)是什么,b和0都是0
"或"如果任一输入位为1,则返回1
0或0是0
1或0是1
0或1是1
1或1是1
"设置"有点可以通过" ORing"无论位(b)是什么,b或1是1
AX是16位
如果和AX与0000.1111.1111.1111b(= 0x0FFF),最顶部的半字节(4位)将被清除
(AND与1不会改变位,如果它被设置则保持为1,并保持如果它为0则取消设置,所以不应更改的所有半字节都与1进行AND运算
如果OR AX与0000.0000.0000.1111b(= 0x000F),则低位半字节将全部设定。
(OR为0时不会改变,如果设置为0则保持为1,如果为0则保持未设置,所以其他所有半字节都与0进行“或”运算)
答案 1 :(得分:0)
您可以使用位逻辑设置和清除积分值的一部分 - 在这种情况下,逻辑AND和OR。
肤浅的例子:我的位值为0101;我想设置最低的两位。所以我和0011一起使用。现在我要清除两个最低位。所以我和1100。
答案 2 :(得分:0)
理解这些操作的最佳方法是逐步完成它们。我会尽力解释这个过程。每个步骤我都会包含两个寄存器的状态,以便您可以跟随。为了保持EAX的上限值,我们必须先将其内容移到另一个寄存器中进行操作。
开始:
EAX:0011 1100 1001 1111 1011 1100 1001 1111
mov ebx,eax;将eax的内容复制到ebx
EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0011 1100 1001 1111 1011 1100 1001 1111
shl ebx,24;这清除了我们不关心的ebx shr ebx,24;转回初始位置
EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0000 0000 0000 0000 0000 0000 1100 1001
shl ebx,4;向左移4位。 bx是下一步我们想要的地方。
EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0000 0000 0000 0000 0000 1100 1001 0000
添加bl,0Fh;向bl添加0xF。或者,在二进制中,1111。最不重要的半字节集。
EAX:0011 1100 1001 1111 1011 1100 1001 1111
EBX:0000 0000 0000 0000 0000 1100 1001 1111
EAX:0011 1100 1001 1111 0000 0000 0000 0000
EBX:0000 0000 0000 0000 0000 1100 1001 1111
添加ax,bx;将bx的结果合并回eax以获得最终结果
EAX:0011 1100 1001 1111 0000 1100 1001 1111
你有它!既然您熟悉轮班操作,我会将最后一部分留给您。
干杯!
答案 3 :(得分:0)
要清除最有效的半字节并设置AX的最小有效位半字节,您可以写:
and ax, 0FFFh ;Clears the top nibble
or ax, 000Fh ;Sets the bottom nibble
不使用and
/ or
,使用轮班:
shl ax, 4 ;Moves the middle part into AH
mov al, 0F0h ;Prepares for a set low nibble
shr ax, 4 ;Puts everything in place
使用班次计算10 * AX:
shl ax, 1 ;Calculate 2*AX
mov dx, ax ;Store in DX
shl ax, 2 ;Continue calculating 8*AX
add ax, dx ;Makes AX = 8*AX + 2*AX