2016-10-21 64 views
-1

我在NASM中編碼時遇到了問題(我是這種語言的初學者)。我正在使用通過引用。當[ebp-2](用作計數器)中的值等於[ebp + 4](用戶的編號)中的值時,代碼應該終止。我期待'檢查'打印5次,但輸出是無限循環或打印n次'檢查'。NASM通過引用

這是我的代碼的一部分,其中存在類似的情況:

find_prime: 
     mov ebp, esp 
     sub esp, 2 

     mov ecx, [ebp+4]  ;ecx contains address of ebp+4  
     mov word [ebp-2], 1 ;[ebp-2] as counter 

     while1_begin: 
      mov bx, [ebp-2] 
      cmp bx, [ecx]  ;check if bx < [ecx] 
      je terminate  ;if bx = [ecx] terminate 

      mov eax, 4 
      mov ebx, 1 
      mov ecx, pri  ;pri contains 'checked' 
      mov edx, priLen 
       int 80h 

      inc word [ebp-2] 
      jmp while1_begin 

     while1_end: 
      jmp terminate 

     add esp, 2 
     ret 4 
+1

'mov ecx,[ebp + 4]'將ebp + 4的值移動到ecx。如果你想要這個地址,你的意思是'lea ecx,[ebp + 4]'?很難說,因爲這不是一個簡單的例子。您對該行的評論有點模棱兩可。 –

+0

你說這是通過引用傳遞的,但你的文字和代碼似乎表明它是按價值傳遞的。 –

+0

'add/sub esp,2' ...我會至少將它填充到4(訪問單詞[ebp-2]可能與單詞[ebp-4]一樣好,我會保留'esp' 4個字節邊界對齊)。雖然如果現在使用未對齊堆棧的「int 80h」,那麼它可能是好的(或者它只會影響性能)。 – Ped7g

回答

0
  1. 您的代碼甚至不會因爲組裝哪裏是終止
  2. 你的算法是因爲它過於複雜可以像這樣構造。
  3. 不,這是必需的,但它是一個好主意,保存EBP

    push ebp 
        mov  ebp, esp 
        mov  ecx, [ebp+8] 
    
    L1: jcxz done 
        dec  ecx 
        push ecx 
        .... Do printing here 
        pop  ecx 
        jmp  L1 
    
    done: 
        leave 
        ret  4 
    

注:本示例甚至可以被壓縮後的大小明智的,如果你知道傳遞的值總是會大於零或至少爲非零。

否則,唯一真正的問題是不保留ECX循環。

+0

*你的代碼甚至不會組裝,因爲終止在哪裏*這是什麼意思? – fuz

+0

@FUZxxl有一個條件和絕對jmp到一個叫'terminate'的地方。標籤「終止:」在哪裏? –

+0

OP在他的問題中寫道_這是我code_ –