2015-02-09 8 views
0

Понятно, что я пытаюсь вытолкнуть значения в стек и выскочить их в «противоположном» порядке. На практике я думаю, что я это делаю, но я не уверен. Массив, который я передаю, определен в 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% уверен, что это не проблема при печати. Заранее спасибо!

+1

Используйте отладчик, чтобы узнать, где ваш код идет не так. Кроме того, прокомментируйте свой код, особенно если вы ожидаете, что другие помогут вам. Кроме того, тривиальный алгоритм для обращения к массиву - это просто идти с обоих концов и менять элементы, пока вы не встретитесь посередине. Никакой расчет-halfway-point не нужен, и не нужно возиться со стеком. – Jester

+0

Мне не нужно вычислять наполовину точку, как это, просто нажмите все значения, затем введите все значения. Могут быть другие способы сделать это, но мне больше всего любопытно, почему это не работает. У меня нет отладчика прямо сейчас, любые предложения будут замечательными. – dlkulp

+0

писать код ассемблера без отладчика - удачи с этим – pm100

ответ

1

Сначала прочитайте this для получения информации о инструкции mul. После того, как вы исправите инструкцию mul и используете результат в своем коде, все работает хорошо. Я исправлю ваш код следующим образом:

section .data 
    array: dd 1, 2, 3 
    arrayLen: dd 3 

section .text 
global main 

main: 
    push dword array 
    push dword [arrayLen] 
    call reverse 
    add esp, 8 


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 edi, [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 + eax] 
    inc ecx 
    cmp ecx, edi 
    jl .loopPush 
    mov ecx, 0 

; pop all the values from the stack 
.loopPop: 
    mov eax, 4 
    mul ecx 
    pop dword [ebx + eax] 
    inc ecx 
    cmp ecx, edi 
    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 

Извините, я должен прокомментировать часть вашего кода.

+1

Благодарим вас за ссылку на документацию. Я искал все это и не мог найти его нигде! – dlkulp

Смежные вопросы