2016-12-02 106 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 

我想弄清楚如何編寫這個沒有使用數組,因爲我覺得它有點笨重。通常還有什麼方法可以使整個事情更有效率?x86彙編替代陣列

必須在86 NASM工作

=====

所以試圖轉向更MOVS和沒有推動,並且我得到一個分段錯誤(核心轉儲)當我輸入一個數...

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

對於循環的每次迭代,您只需要乘以10。每次使用時,您都不需要在堆棧上推寄存器。在用其他東西覆蓋之前,您不需要用0初始化寄存器。 –

+0

您可以刪除零初始化,因爲它們不會執行任何操作。你需要重寫你的代碼,所以它不需要推送。記住你有7個寄存器可以與EAX,EBX,ECX,EDX,EDI,ESI和EBP一起工作,大多數指令都可以讓你使用其中的任何一個。 –

回答

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從結束處開始(向前處理),那麼程序結束時返回的數字將是相同的。