2016-09-15 39 views
3

下面是一段循環代碼我試圖分析並瞭解如何循環工作:大會86 MASM循環分析

;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

非常感謝你的幫助。

+0

「偏移量空間」看起來像它在代碼中早先定義的變量/常量。 「mov edx,偏移空間」將變量的值複製到edx寄存器 –

+0

我道歉,但我不明白這是一個變量。我很新裝配。謝謝 –

+3

如果你不知道如何將一個寄存器移動到另一個寄存器中,你應該在提問前閱讀一本書或教程。這幾乎是你學習的第一件事。 – interjay

回答

1

offset運算符返回內存位置相對於位置所屬的段(DS的MOV)開頭的偏移量(請參閱here)。 space很可能是代碼中較早定義的變量,因此offset space會將相對於該段開頭(通常爲DS數據段)的字節數返回給該變量。

換句話說,mov edx, offset space將指針拷貝到space變量(DWORD型的,32位),以被放置在edx寄存器。它被放置在edx中的原因必須在writedecwritestring例程中找到。

至於你問的循環,這也正是ecx寄存器用武之地。loop指令將導致代碼指針只要ecx不爲零,降低它由1檢查前應立即到其目的地它。循環值也會在您的代碼中使用,這就是爲什麼它被複制到eax,以便其他代碼不會更改ecx的值並弄亂您的循環。

+0

它只是'DS';不是'EDS'。將保護模式索引中的寄存器分段到段描述符*的全局描述符表中,而不是被移位和添加的普通值。我甚至不會在提出如何將一個寄存器移動到另一個寄存器的答案中提及細分。在普通代碼(不是16位)中,OFFSET只是獲取地址。 –

+0

@PeterCordes:昨天我做了一個「邪惡」契約,將糾正你反對意見的方面納入了答案中。我希望你會贊同這一點:-) – zx485

+0

@ zx485:這通常是一件好事。我很懶,沒有自己做。 (部分原因是因爲我想建議Alex應該刪除第一段的大部分內容以保持簡單(在16位模式之外可以忽略分割),所以這不是一個好的編輯。) –