assembly 在汇编语言中,“and”指令对操作数做什么?

t1rydlwq  于 2023-01-13  发布在  其他
关注(0)|答案(4)|浏览(268)

汇编语言中的“and”指令是做什么的?我被告知它检查操作数的位序,并将1设置为true,将其他任何值设置为false,但我不知道它实际上做了什么,也不知道它对代码有什么影响。

fgw7neuy

fgw7neuy1#

AND指令按以下方式比较2个操作数中的位:

Bit position 1234 5678
Operand A -- 1101 1001
Operand B -- 1001 0111
             _________
Result ----- 1001 0001

在位置1、4和8的位在两个字节中为真,因此结果字节的位置1、4和8将为真。结果将存储在第一个操作数中。

ia2d9nvy

ia2d9nvy2#

对于32位寄存器,它执行32个单独/独立的布尔and运算,每个位位置一个(如果两个输入都为真,则为真,否则为假)。
output[4] = a[4] & b[4],其中此伪码语法将输入/输出描述为位数组。
它与C的按位&&=运算符完全相同。
(Not C的&&逻辑与运算符,用于检查!=0)。

euoag5mw

euoag5mw3#

指令and对其操作数执行逐位AND运算。例如,指令and al, bl应计算寄存器albl的AND运算(如@Serkratos121所示),并将结果存储在al寄存器中。
它可以用来清除寄存器中的位。一个常见的例子是将小写字符转换为大写。要将m转换为M,可以写为:

mov al, 'm' ; this moves the ascii code of m i.e. 109 to al register

现在,要转换为大写形式,从al中减去32,但不使用sub al, 32d,可以写成:

and al, 11011111b ; this clears the 5th bit (LSB is 0th bit)

因此,al现在包含M的ascii代码77。

qmelpv7a

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来完成,但也会影响大写字母。

mov dx, ‘a’
and dx, 11011111b

dx寄存器现在将包含A,其工作方式如下:

Bit Position - 1234 5678
Operand 1 ———- 0110 0001
Operand 2 ———- 1101 1111
               ————————-
Output ——————- 0100 0001

相关问题