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
'dec ebx' наверху. здесь вы инициализировали его, прежде чем уменьшать его? –
Вам нужно только умножить на 10 раз для каждой итерации цикла. Вам не нужно нажимать регистр в стеке каждый раз, когда вы его используете. Вам не нужно инициализировать регистр 0, прежде чем перезаписать его чем-то другим. –
Вы можете удалить нулевые инициализации, поскольку они ничего не делают. Вам нужно будет переписать свой код, чтобы он не нуждался в толках. Помните, что у вас есть 7 регистров для работы с EAX, EBX, ECX, EDX, EDI, ESI и EBP, большинство инструкций позволят вам использовать любой из них. –