-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
'dec ebx'在頂部。你是否在遞減之前初始化它? –
對於循環的每次迭代,您只需要乘以10。每次使用時,您都不需要在堆棧上推寄存器。在用其他東西覆蓋之前,您不需要用0初始化寄存器。 –
您可以刪除零初始化,因爲它們不會執行任何操作。你需要重寫你的代碼,所以它不需要推送。記住你有7個寄存器可以與EAX,EBX,ECX,EDX,EDI,ESI和EBP一起工作,大多數指令都可以讓你使用其中的任何一個。 –