组装 - 输出应该是什么

Assembly - what should be the output

说到组装,我绝对是初学者。我试图弄清楚以下输出应该是什么:

Jan dd 255,256
Feb dw 16, 17, 18, 19
Mar db 8, 9, 10, 11

Sub edi, Mar - Feb
mov ebx, Jan[edi]
add bl, Mar

所以 Sub edi, Mar - Feb 将从 MarFeb 数组中减去第一个元素,在 edi 处给出 -8 的值...但是接下来会发生什么移动到 Jan[edi] ?? Mar 将添加什么?

你能给我一个练习的答案并附上解释吗?请原谅我缺乏基本的装配知识。

Sub edi, Mar - Feb will subtract first elements from Mar and Feb arrays

它不能那样做。 assembler 不允许在 assemble 时计算它(内存中的东西是可变的,所以结果,嗯,变化),并且没有指令可以 "double-subtract"。它实际做的是

  1. 作为assemble时间,计算地址Mar(这是一个地址,不是一堆数字,只是他们开始的地方)和地址 Feb。中间有 4 个字,总共大小为 8,因此 assembler 将发出 sub edi, 8.
  2. 的机器码
  3. 在运行时,edi减去8。

不过 edi 里有什么?谁知道呢。但是现在少了8个。 mov ebx, Jan[edi] 顺便说一下 mov ebx, [edi + Jan],所以希望 edi 是明智的,0 或 4 最有意义。