2016-12-02 2 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 сборка альтернатива массиву

должны работать в x86 NASM

=====

Так пытался двигаться к более варисторов и без толчков, и я получаю ошибку сегментации (ядро сбрасывали), когда я ввести номер ...

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 л до

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 

Массивы array2 и array3 совершенно различны, так как номера, которые они содержат, определены в другом порядке.


Кроме того, как это массив 2 и 3 отличаются с точки зрения числа он возвращается в конце моей программы?

Если программа обрабатывает эти массивы одинаково, то, очевидно, числа, возвращаемые в конце вашей программы, будут отличаться. Но Если вы обрабатываете array2, начиная с фронта (работающий в конце) и обрабатывая array3, начиная с конца (работая в направлении фронта), тогда числа, возвращаемые в конце вашей программы, будут одинаковыми ,

Смежные вопросы