汇编语言中的“and”指令是做什么的?我被告知它检查操作数的位序,并将1设置为true,将其他任何值设置为false,但我不知道它实际上做了什么,也不知道它对代码有什么影响。
fgw7neuy1#
AND指令按以下方式比较2个操作数中的位:
Bit position 1234 5678 Operand A -- 1101 1001 Operand B -- 1001 0111 _________ Result ----- 1001 0001
在位置1、4和8的位在两个字节中为真,因此结果字节的位置1、4和8将为真。结果将存储在第一个操作数中。
ia2d9nvy2#
对于32位寄存器,它执行32个单独/独立的布尔and运算,每个位位置一个(如果两个输入都为真,则为真,否则为假)。如output[4] = a[4] & b[4],其中此伪码语法将输入/输出描述为位数组。它与C的按位&或&=运算符完全相同。(Not C的&&逻辑与运算符,用于检查!=0)。
and
output[4] = a[4] & b[4]
&
&=
&&
!=0
euoag5mw3#
指令and对其操作数执行逐位AND运算。例如,指令and al, bl应计算寄存器al和bl的AND运算(如@Serkratos121所示),并将结果存储在al寄存器中。它可以用来清除寄存器中的位。一个常见的例子是将小写字符转换为大写。要将m转换为M,可以写为:
and al, bl
al
bl
m
M
mov al, 'm' ; this moves the ascii code of m i.e. 109 to al register
现在,要转换为大写形式,从al中减去32,但不使用sub al, 32d,可以写成:
sub al, 32d
and al, 11011111b ; this clears the 5th bit (LSB is 0th bit)
因此,al现在包含M的ascii代码77。
qmelpv7a4#
and指令对数字中的每一位执行按位“与”运算。
按位与
逐位与,不要与C语言的逻辑与混淆,它检查每个位的位置。如果发现两个操作数在相同的位置都有1位,则该位置的输出位为1。如果发现两个位都是0,或者一位是0,另一位是1,则该位置的输出位为0。
Bit Position — 1234 5678 Operand 1 ———— 0111 0101 Operand 2 ———— 1101 1111 ————————- Output ——————- 0101 0101
功能示例
and指令有多种用途。常见的用途是将小写ASCII字符转换为大写字符。这可以通过减去32来完成,但也会影响大写字母。
32
mov dx, ‘a’ and dx, 11011111b
dx寄存器现在将包含A,其工作方式如下:
dx
A
Bit Position - 1234 5678 Operand 1 ———- 0110 0001 Operand 2 ———- 1101 1111 ————————- Output ——————- 0100 0001
4条答案
按热度按时间fgw7neuy1#
AND指令按以下方式比较2个操作数中的位:
在位置1、4和8的位在两个字节中为真,因此结果字节的位置1、4和8将为真。结果将存储在第一个操作数中。
ia2d9nvy2#
对于32位寄存器,它执行32个单独/独立的布尔
and
运算,每个位位置一个(如果两个输入都为真,则为真,否则为假)。如
output[4] = a[4] & b[4]
,其中此伪码语法将输入/输出描述为位数组。它与C的按位
&
或&=
运算符完全相同。(Not C的
&&
逻辑与运算符,用于检查!=0
)。euoag5mw3#
指令
and
对其操作数执行逐位AND运算。例如,指令and al, bl
应计算寄存器al
和bl
的AND运算(如@Serkratos121所示),并将结果存储在al
寄存器中。它可以用来清除寄存器中的位。一个常见的例子是将小写字符转换为大写。要将
m
转换为M
,可以写为:现在,要转换为大写形式,从
al
中减去32,但不使用sub al, 32d
,可以写成:因此,
al
现在包含M
的ascii代码77。qmelpv7a4#
and
指令对数字中的每一位执行按位“与”运算。按位与
逐位与,不要与C语言的逻辑与混淆,它检查每个位的位置。如果发现两个操作数在相同的位置都有1位,则该位置的输出位为1。如果发现两个位都是0,或者一位是0,另一位是1,则该位置的输出位为0。
功能示例
and
指令有多种用途。常见的用途是将小写ASCII字符转换为大写字符。这可以通过减去32
来完成,但也会影响大写字母。dx
寄存器现在将包含A
,其工作方式如下: