我有一个在 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
我困惑了很久为什么不行,但还是找不到错误
_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