mov bl在装配中做什么

What does mov bl do in assembly

本文关键字:什么 bl mov      更新时间:2023-10-16

你能解释一下下面的汇编代码是如何工作的吗?

xor ebx, ebx;
mov bl, byte ptr[ecx];
cmp ebx, 0;

我不明白为什么把字节移到bl,然后比较ebx而不是bl

blebx寄存器中低8位(位7-0)的名称。还有作为ebx的比特15-8的bh,并且bx是低16比特(比特15-0)。较高的16位没有名称。

这适用于所有寄存器eaxebxecxedx

假设ebx首先为零,则生成的代码可能是编译器编译以下内容的结果:

char ch;
const char str;
int i;
...
ch = str[i];
if (ch == 0) ... 

[或者可能只是if (ch)]。

扩展到32位可能是由于"节省空间"或"运行速度更快",或者if (ch == 0)右侧有一个int,需要将值比较为int,而不是char=字节-如果没有看到原始源代码,我无法说出是哪一个-即使这样,编译器中的实际代码生成也是一组相当复杂的决策,基于"什么在哪个处理器上运行得快"answers"根据语言的正确性"。

此指令在EBX的所有32位和EBX的全部32位之间形成异或,将结果留在EBX中。你可以很容易地证明这与将0的值移动到EBX中是一样的(但它比这样做更快,因为这样就不需要内存提取)

xor ebx, ebx;

此指令将ECX指向的地址处的BYTE(8位)移动到EBX的LOW 8位,使其他24位保持不变(它们是零-还记得吗?)

mov bl, byte ptr[ecx];

此指令将EBX中的整个32位值与0进行比较-在这种情况下,它在逻辑上与将BL中的字节与0进行对比相同,因为我们知道高24位将为0

cmp ebx, 0;

(预期)为什么会这样?

因为这是一个32位处理器。它适合于对32位值进行操作,比对8位值进行更有效的操作。编译器知道这一点,并且在允许的情况下,总是试图将较小的值提升为较大的值。

BLEBX寄存器的低字节,因此,由于您之前是xorEBX,因此您将0与EBX进行比较,其低字节等于BL

从纯末端效应的角度来看,之间没有区别

CMP ebx,0

CMP bl,0

在给定的情况下,因为在这组指令之前已经存在XOR EBX、EBX。第一个命令是在对imm8值进行符号扩展之后执行的,因此在这种情况下,通过在临时寄存器中执行减法来执行的有效比较总是32位。操作码长度也相同:80/7/ib和83/7/id。

然而,从数据总线流的角度来看,数据总线经过优化,可以更快地读取32位数据流,因为它不必使用内部掩码执行AND来隔离寄存器的8位数据内容,因此,建议汇编程序编写器使用尽可能好的总线宽度,通常是32的倍数。因此,您会看到cmp-ebx,0是相对于cmp-bl,0的首选代码转换。

有乐趣的编程。。。