2016-12-02 109 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从结束处开始(向前处理),那么程序结束时返回的数字将是相同的。