-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
私はそれが幾分clunkyのように感じるように、配列を使用せずにこれを書く方法を理解しようとしています。この全体をより効率的にするための一般的な方法もありますか?アレイの代わりにx86アセンブリ
は、x86 NASMに働かなければならない
=====
だからもっとMOVSなしプッシュに移動しようとした、とするときI入力数セグメンテーションフォールト(コアダンプ)を取得しています...
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'があります。ここでそれを減らす前に初期化しましたか? –
ループの反復ごとに1回だけ10を掛ける必要があります。スタックを使用するたびにスタック上のレジスタをプッシュする必要はありません。他のもので上書きする前に、レジスタを0で初期化する必要はありません。 –
ゼロ初期化は何もしないので削除できます。プッシュを必要としないようにコードを書き直す必要があります。 EAX、EBX、ECX、EDX、EDI、ESI、EBPを扱うための7つのレジスタがあります。 –