我正在学习32位8086程序集(用于课程),而且我正在查看其中一个示例程序。将寄存器括在括号中是什么意思?
mov ebx, [ebx + 4]
另外,4是字面意思吗? (我们正在移动" ebx的价值加上4"进入ebx?)
答案 0 :(得分:2)
它等同于以下C代码(假设32位int
):
ebx = // whatever puts a value into ebx
ebx = *(int *)((char *)ebx + 4)
或者,如果您愿意,
ebx = *((int *)ebx + 1) // with C's type-aware pointer arithmetic
所以我们最终得到以下结论:
unsigned char *memory; // byte-addressable machine memory
EBX = [memory[ebx + 7] | memory[ebx + 6] | memory[ebx + 5] | memory[ebx + 4]]
most significant byte least significant byte
请注意,如果x86是big-endian而不是little-endian,则此结果会有所不同。
您可能认为将ebx
用作指针和值都很奇怪,但事实并非如此。指针不再需要,所以我们重新使用它的寄存器来保存一个值。汇编语言没有类型。
答案 1 :(得分:0)
存储在ebx
加上四个字节的地址的内存中的值。
答案 2 :(得分:0)
mov ebx, [ebx + 4]
意味着我们从ebx寄存器中的值加4指定的地址中取4个字节。
例如,如果ebx = 040404040h,我们将从内存位置040404044h(040404040h + 04h)开始占用4个字节,并将其放入寄存器ebx。