我的汇编语言代码哪里可能有错误

问题描述 投票:0回答:1

我有一个在 C++ Visual Studio 中使用汇编器插入编写的程序。我想将其安排为 Visual Studio 中的汇编程序。我不明白为什么我数错了。我认为问题出在loop_2,但我找不到错误。

这是有效的代码

#include <iostream>
int main() {
    const int N = 5; // количество элементов для подсчета количества значений
    int raznost = N / 2; // рассчитывается смещение для отрицательных чисел
    int arr[] = { 1,2,2 };
    int freq[N] = { 0 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int* result = new int[n];
    _asm {
        xor eax, eax
        xor ebx, ebx
        xor ecx, ecx
        lea eax, arr
        lea ebx, freq
        mov edx, raznost
        //mov edi, n

        imul edx, 4
        add ebx, edx
        loop_1 :
        cmp ecx, n
            je loopend_1
            mov edx, [eax + ecx * 4]
            inc[ebx + edx * 4]
            inc ecx
            jmp loop_1
            loopend_1 :
        lea ebx, freq
            xor edx, edx // для количества элементов в новом массиве
            xor ecx, ecx
            outer_loop :
        cmp ecx, n
            je outer_loopend
            push ecx
            xor ecx, ecx // счетчик
            xor eax, eax // максимальное значение
            xor esi, esi // количество
            mov eax, 0
            loop_2:
        cmp ecx, N
            je loopend_2
            cmp esi, [ebx + ecx * 4]
            jg end_if
            mov esi, [ebx + ecx * 4]
            mov eax, ecx
            end_if :
        inc ecx
            jmp loop_2
            loopend_2 :
        xor ecx, ecx
            push ebx
            mov ebx, eax
            push ebx
            mov ebx, result
            sub eax, raznost
            loop_3 :
        cmp esi, ecx
            je loopend_3
            mov[ebx + edx * 4], eax
            inc edx
            inc ecx
            jmp loop_3
            loopend_3:
        pop ebx
            mov ecx, ebx
            pop ebx

            push eax
            mov eax, 0

            mov[ebx + ecx * 4], eax
            pop eax
            pop ecx
            inc ecx
            jmp outer_loop
            outer_loopend:
    }

    /*
        xor eax, eax
        xor ebx, ebx
        xor ecx, ecx
        lea eax, arr
        lea ebx, freq
        mov edx, raznost
        // mov edi, [ebp + 20]
        push ebx;;;
        imul edx, 4
            add ebx, edx
            loop_1 :
        cmp ecx, n
            je loopend_1
            mov edx, [eax + ecx * 4]
            inc dword ptr[ebx + edx * 4]
            inc ecx
            jmp loop_1
            loopend_1 :
        pop ebx;;;; lea ebx freq
            mov edi, edx
            xor edx, edx; для количества элементов в новом массиве
            xor ecx, ecx
            outer_loop :
        cmp ecx, n
            je outer_loopend
            push ecx
            xor ecx, ecx; счетчик
            xor eax, eax; максимальное значение
            xor esi, esi; количество
            mov eax, 0
            loop_2:
        cmp ecx, N
            je loopend_2
            cmp esi, [ebx + ecx * 4]
            jg end_if
            mov esi, [ebx + ecx * 4]
            mov eax, ecx
            end_if :
        inc ecx
            jmp loop_2
            loopend_2 :
        xor ecx, ecx
            push ebx
            mov ebx, eax
            push ebx
            mov ebx, result
            sub eax, edi//
            loop_3 :
        cmp esi, ecx
            je loopend_3
            mov[ebx + edx * 4], eax
            inc edx
            inc ecx
            jmp loop_3
            loopend_3 :
        pop ebx
            mov edi, ebx
            pop ebx
            push eax
            mov eax, 0
            mov[ebx + edi * 4], eax
            pop eax



            pop ecx
            inc ecx
            jmp outer_loop
            outer_loopend :
    }*/
    for (int i = 0; i < n; i++)
    {
        std::cout << result[i] << " ";
    }
    return 0;
}

这是通过不起作用的程序的代码

#include <iostream>
using namespace std;

extern "C" int __stdcall Proc1(int* arr, int* freq, int raznost, int n, int N, int* result);
int main() {
    const int N = 5;//2000; // количество элементов для подсчета количества значений
    int raznost = N / 2; // рассчитывается смещение для отрицательных чисел
    int arr[] = { 1,1,2};
    int freq[N] = { 0 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int* result = new int[n];
    //int result[N] = { 0 };
    Proc1(arr, freq, raznost, n, N, result);

    for (int i = 0; i < n; i++)
    {
        std::cout << result[i] << " ";
    }
    return 0;
}
.386
PUBLIC _Proc1@24
;PUBLIC _Proc2
;PUBLIC Proc3
;PUBLIC Proc4
;PUBLIC @Proc5@4

.model flat
.data
.code

_Proc1@24 proc
    push ebp
    mov ebp, esp
    
    
    xor eax, eax
        xor ebx, ebx
        xor ecx, ecx
        xor edx, edx
        mov eax, [ebp + 8]
        mov ebx, [ebp + 12]
        mov edx, [ebp + 16]
        ;mov edi, [ebp + 20]
        ;;;
        imul edx, 4
        add ebx, edx
        ;push ebx
        loop_1 :
        cmp ecx, [ebp + 20]
            je loopend_1
            mov edx, [eax + ecx * 4]
            inc dword ptr [ebx + edx * 4]
            inc ecx
            jmp loop_1
            loopend_1 :
        ;pop ebx 
            xor edx, edx ; для количества элементов в новом массиве
            xor ecx, ecx
            outer_loop :
        cmp ecx, [ebp + 20]
            je outer_loopend
            push ecx
            xor ecx, ecx ; счетчик
            xor eax, eax ; максимальное значение
            xor esi, esi ; количество
            mov eax, 0
            loop_2:
        cmp ecx, [ebp + 24]
            je loopend_2
            cmp esi, [ebx + ecx * 4]
            jg end_if
            mov esi, [ebx + ecx * 4]
            mov eax, ecx
            end_if :
            inc ecx
            jmp loop_2
            loopend_2 :
        xor ecx, ecx
            push ebx
            mov ebx, eax
            push ebx
            mov ebx, [ebp + 28]
            sub eax, edx
            loop_3 :
        cmp esi, ecx
            je loopend_3
            mov[ebx + edx * 4], eax
            inc edx
            inc ecx
            jmp loop_3
            loopend_3:
        pop ebx
            mov edi, ebx
            pop ebx
            push eax
            mov eax, 0
            mov [ebx + edi * 4], eax
            pop eax



            pop ecx
            inc ecx
            jmp outer_loop
            outer_loopend:


    mov esp,ebp
    pop ebp
    ret 24
_Proc1@24   endp

end

我困惑了很久为什么不行,但还是找不到错误

assembly x86 masm inline-assembly
1个回答
0
投票
_Proc1@24 proc
push ebp
mov ebp, esp


xor eax, eax
    xor ebx, ebx
    xor ecx, ecx
    xor edx, edx
    mov eax, [ebp + 8]
    mov ebx, [ebp + 12]
    mov edx, [ebp + 16]
    ;mov edi, [ebp + 20]
    ;;;
    push ebx
    imul edx, 4
    add ebx, edx
    
    loop_1 :
    cmp ecx, [ebp + 20]
        je loopend_1
        mov edx, [eax + ecx * 4]
        inc dword ptr [ebx + edx * 4]
        inc ecx
        jmp loop_1
        loopend_1 :
    pop ebx 
        xor edx, edx ; для количества элементов в новом массиве
        xor ecx, ecx
        outer_loop :
    cmp ecx, [ebp + 20]
        je outer_loopend
        push ecx
        xor ecx, ecx ; счетчик
        xor eax, eax ; максимальное значение
        xor esi, esi ; количество
        mov eax, 0
        loop_2:
    cmp ecx, [ebp + 24]
        je loopend_2
        cmp esi, [ebx + ecx * 4]
        jg end_if
        mov esi, [ebx + ecx * 4]
        mov eax, ecx
        end_if :
        inc ecx
        jmp loop_2
        loopend_2 :
    xor ecx, ecx
        push ebx
        mov ebx, eax
        push ebx
        mov ebx, [ebp + 28]
        sub eax, [ebp + 16]
        loop_3 :
    cmp esi, ecx
        je loopend_3
        mov[ebx + edx * 4], eax
        inc edx
        inc ecx
        jmp loop_3
        loopend_3:
    pop ebx
        mov edi, ebx
        pop ebx
        push eax
        mov eax, 0
        mov [ebx + edi * 4], eax
        pop eax
        pop ecx
        inc ecx
        jmp outer_loop
        outer_loopend:


mov esp,ebp
pop ebp
ret 24

_Proc1@24 endp

© www.soinside.com 2019 - 2024. All rights reserved.