mov bl 在汇编中有什么作用

Ima*_*dis 4 c++ x86 assembly

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

xor ebx, ebx;
mov bl, byte ptr[ecx];
cmp ebx, 0;
Run Code Online (Sandbox Code Playgroud)

我不明白为什么你将字节移动到bl然后比较ebx而不是bl

Mat*_*son 5

blebx寄存器中低 8 位(位 7-0)的名称。还有bh哪个是 的第 15-8 位ebxbx是低 16 位(第 15-0 位)。高 16 位没有名称。

这适用于所有的寄存器eaxebxecxedx

鉴于它ebx首先被归零,结果代码可能是编译器进行编译的结果,例如:

char ch;
const char str;
int i;
...
ch = str[i];
if (ch == 0) ... 
Run Code Online (Sandbox Code Playgroud)

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

到 32 位的扩展可能是由于“节省空间”或“运行速度更快”,或者在右侧if (ch == 0)有一个int并且需要将值比较为int而不是作为char= 字节的事实- 我不能在没有看到原始源代码的情况下说出哪个 - 即便如此,编译器中的实际代码生成还是相当复杂的一组决定,基于“什么在哪个处理器上运行速度快”和“根据语言的正确性”。

  • @Imantas 是的,如果你使用 `cmp bl, 0` 你会得到相同的效果,但只比较最低的 8 位 (2认同)