Понятно, что я пытаюсь вытолкнуть значения в стек и выскочить их в «противоположном» порядке. На практике я думаю, что я это делаю, но я не уверен. Массив, который я передаю, определен в section .data
как array: dd 1, 2, 3, 4, 5, 6
, и размер передается как значение int (3 = 3 элемента). Когда я запускаю приложение, он связывает и собирает, но массив не обращается вспять.NASM Обратный целочисленный массив
push dword array
push dword [arrayLen]
call reverse
add esp, 8
; other stuff
reverse:
push ebp ; setup stack
mov ebp,esp
sub esp,0x40 ; 64 bytes of local stack space
; put parameters into registers
mov ebx, [ebp+12] ; array
mov edx, [ebp+8] ; len
; set up loop
mov ecx, 0
; push all the values onto the stack
.loopPush:
mov eax, 4
mul ecx
push dword [ebx]
add ecx, 1
cmp ecx, edx
jl .loopPush
mov ecx, 0
; pop all the values from the stack
.loopPop:
mov eax, 4
mul edx
pop dword [ebx+edx]
add ecx, 1
cmp ecx, edx
jl .loopPop
; print the array
push dword [ebp+12]
push dword [ebp+8]
call printArray
add esp, 8
.end:
mov esp,ebp ; undo "sub esp,0x40" above
pop ebp
mov eax, ebx ; return the reversed array
ret
Функция печати точно печатает все, что я даю его, так что я около 90% уверен, что это не проблема при печати. Заранее спасибо!
Используйте отладчик, чтобы узнать, где ваш код идет не так. Кроме того, прокомментируйте свой код, особенно если вы ожидаете, что другие помогут вам. Кроме того, тривиальный алгоритм для обращения к массиву - это просто идти с обоих концов и менять элементы, пока вы не встретитесь посередине. Никакой расчет-halfway-point не нужен, и не нужно возиться со стеком. – Jester
Мне не нужно вычислять наполовину точку, как это, просто нажмите все значения, затем введите все значения. Могут быть другие способы сделать это, но мне больше всего любопытно, почему это не работает. У меня нет отладчика прямо сейчас, любые предложения будут замечательными. – dlkulp
писать код ассемблера без отладчика - удачи с этим – pm100