2016-12-02 5 views
-4
section .data 
    array:  dd 100000000,10000000,1000000,100000,10000,1000,100,10,1 

start:   
    dec ebx         
    mov ecx,9        

_loopFunction:        
    dec ecx         
    dec ebx         
    mov dl, byte [eax + ebx]     
    sub dl, '0'        
    push eax         
    mov eax, 0        
    push ebx         
    mov ebx, 0        
    mov ebx, dword [array + ecx*4]   
    mov eax, edx        
    mul ebx         
    push ecx         
    mov ecx, esi        
    add ecx, eax        
    mov esi, ecx        
    pop ecx         
    pop ebx         
    pop eax         
    cmp ebx, 0        
    jne _loopFunction      
    mov eax, esi        
    ret 

私はそれが幾分clunkyのように感じるように、配列を使用せずにこれを書く方法を理解しようとしています。この全体をより効率的にするための一般的な方法もありますか?アレイの代わりにx86アセンブリ

は、x86 NASMに働かなければならない

=====

だからもっとMOVSなしプッシュに移動しようとした、とするときI入力数セグメンテーションフォールト(コアダンプ)を取得しています...

start:    
    dec ebx        
    mov ecx,9       

_loopFunction:       
    dec ecx        
    dec ebx        
    mov dl, byte [eax + ebx]    
    sub dl, '0'       

    mov edi, eax 
    mov ebp, ebx 



; push eax        
; mov eax, 0       
; push ebx        
; mov ebx, 0       



    mov ebx, dword [array + ecx*4]  
    mov eax, edx       
    mul ebx        
    mov esp, ecx 

; push ecx        

    mov ecx, esi       
    add ecx, eax       
    mov esi, ecx       

    mov ecx, esp 
    mov ebx, ebp 
    mov eax, edi 

; pop ecx        
; pop ebx        
; pop eax   

    cmp ebx, 0       
    jne _loopFunction     
    mov eax, esi       
    ret 
+1

上部に 'dec ebx'があります。ここでそれを減らす前に初期化しましたか? –

+0

ループの反復ごとに1回だけ10を掛ける必要があります。スタックを使用するたびにスタック上のレジスタをプッシュする必要はありません。他のもので上書きする前に、レジスタを0で初期化する必要はありません。 –

+0

ゼロ初期化は何もしないので削除できます。プッシュを必要としないようにコードを書き直す必要があります。 EAX、EBX、ECX、EDX、EDI、ESI、EBPを扱うための7つのレジスタがあります。 –

答えて

0
array1: times 10 dd 1 

times 10を使用してこの定義はequaですそれらに含まれる数字は、異なる順序で定義されているので、L

array1: dd 1,1,1,1,1,1,1,1,1,1  ;10 times 

array2: dd 100000000,10000000,1000000,100000,10000,1000,100,10,1 
array3: dd 1,10,100,1000,10000,100000,1000000,10000000,100000000 

に配列配列2ARRAY3は全く異なっています。


また、どのようにそれは私のプログラムの終了時に返す番号の面でアレイ2と3違うのでしょうか?

プログラムがこれらの配列を同じ方法で処理する場合は、明らかにプログラムの最後に返される数値が異なります。 array2(前に向かって作業しています)を処理し、末尾で始まるarray3を処理すると、プログラムの最後に返される数値は同じになります。

関連する問題