汇编 x86 MASM 循环分析

Assembly x86 MASM loop analysis

下面是一段循环代码,我正在尝试分析和理解循环是如何工作的:

;the ecx register is the loop counter

  mov ecx,6
  mov edx, offset space 
myloop:
  mov eax,ecx
  dec eax
  call writedec 
  call writestring 
loop myloop 
  call crlf 

  mov ecx,6
  mov edx, offset space 
myloop2:
  mov eax,6
  sub eax, ecx 
  call writedec
  call writestring 
loop myloop2

我的问题是:

  1. offset space是什么意思?
  2. mov edx, offset space 是什么意思?
  3. 我不明白 offset space 是怎么来的?
  4. 如何将寄存器 ecx 移动到寄存器 eax
  5. 为什么 offset space 是源而寄存器 edx 是目的地?

非常感谢您的帮助。

offset 运算符 returns 内存位置相对于该位置所属的段(在 MOV 的情况下为 DS)开头的偏移量(请参阅here)。 space 可能是代码中较早位置定义的变量,因此 offset space 将 return 相对于段开头的字节数(通常是 DS 数据段)到该变量。

换句话说,mov edx, offset space将复制指向space变量(类型DWORD,32位)的指针,放置在edx寄存器中.它被放置在 edx 中的原因必须在 writedecwritestring 例程中找到。

至于你问的循环,这就是 ecx 寄存器的用武之地。只要 [=22] 指令 loop 指令就会使代码指针移动到它的目的地=] 不为零,在检查之前立即将其减 1。循环值也被您的代码在某处使用,这就是将其复制到 eax 的原因,这样其他代码就不会更改 ecx 的值并弄乱您的循环。