2014-02-10 58 views
0

我正在小NASM功能,使存儲在與佈置等BGRBGRBGR顏色的字節一個維向量像素表的垂直反射鏡產生段錯誤...NASM MOV取決於地方

我製成的原型,其做它首先(最後,它是BMP)線。現在我有一個問題,爲什麼是那個版本正確,並沒有產生段錯誤:

global asm_vert 

section  .text 

asm_vert: 
      push ebp 
      mov ebp, esp 
      push ecx 
      push esi 
      push ebx 
      push edx 
      push edi 

      mov edx, [ebp+8]  ; table width 
      mov ecx, [ebp+12]  ; table height 
      mov esi, [ebp+16]  ; input table adress 
      mov edi, [ebp+20]  ; output table adress 

      mov eax, edx 
      mov ecx, edx 
      mov ebx, 3 
      mul ebx 
      add edi, eax 
      sub edi, 3 

x_loop: 
      mov bl, byte[esi] 
      mov byte[edi], bl 
      inc esi 
      inc edi 
      mov bl, byte[esi] 
      mov byte[edi], bl 
      inc esi 
      inc edi 
      mov bl, byte[esi] 
      mov byte[edi], bl 
      inc esi 
      sub edi, 5 
      loop x_loop 

      pop edi 
      pop edx 
      pop ebx 
      pop esi 
      pop ecx 
      pop ebp 

      ret 

如果我只是編輯該節:

  mov eax, edx 
      mov ecx, edx 
      mov ebx, 3 
      mul ebx 
      add edi, eax 
      sub edi, 3 

要的是:

  mov eax, edx 
      mov ebx, 3 
      mul ebx 
      mov ecx, edx 
      add edi, eax 
      sub edi, 3 

這是無效。我認爲這在邏輯上是一回事,但如果第一個版本是正確的,而第二個版本是不正確的話。你會爲此推薦哪種具有圖形界面(Linux)的調試器?

我會感謝任何意見。

回答

0

MUL EBX存儲產品在EDX:EAX,所以當你把MOV ECX,EDXMUL你得到了產品的高32位ECX,而不是後寬。