-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一起工作,大多数指令都可以让你使用其中的任何一个。 –