Salve a tutti
il programmino sotto stante dovrebbe prendere una riga dalla matrice e stamparla a video.
ma purtroppo nonlo fà!
stampa valori inappropiati e ne stampa solamente la metà dei valori che dovrebbe stampare.
parte c++
// nuvola.cpp : definisce il punto di ingresso dell'applicazione console.
//
#include "stdafx.h"
#include <iostream>
#include <windows.h>
#define size 77
using namespace std;
extern "C" void __stdcall cielo(int*,int array [],int*,int*);
int _tmain(int argc, _TCHAR* argv[])
{
int linea,i,offi,dime;
i=0; offi=0; linea=0; dime=77;
int vedi[size];
for (i=0;i<77;i++ )
{ vedi[i]=0; }
while ( linea != 9 )
{
cout << "inserisci numero riga da vedere [0-7] o 9 per terminare \n";
cin >> linea;
if ( linea > 7) { goto fine; }
cielo(&linea,vedi,&dime,&offi);
cout << "*******************************************\n";
cout << "* riga chiesta = " << linea << " offset riga = " << offi;
cout << " *\n";
cout << "*******************************************\n";
for (i=0;i<77;i++)
{
cout << "[";
if (i<10) { cout << "0"; }
cout << i << "] = " << vedi[i] << "\n";
}
fine:;
}
return 0;
}
funzione assembler
qui viene definita la matrice le prime 4 righe sono costanti definite in dw
mentre le altre 4 righe sono definite da un doppio ciclo.
.486
.model flat, stdcall
option casemap:none
.data
par1 dd ?
par2 dd ?
par3 dd ?
par4 dd ?
codici Dw 0,27,49,50,51,52,53,54,55,56,57,48,39,214,8,9,113,119,101
Dw 114,116,121,117,105,111,112,233,43,13,97,115,100,102,103
Dw 104,106,107,108,242,224,92,249,122,120,99,118,98,110,109
Dw 44,46,45,42,32,130,131,132,133,134,135,136,137,138,139,126
Dw 220,225,221,223,129,222,226,96,127,140,141,47
Dw 0,166,33,34,156,36,37,38,47,40,41,61,63,94,170,169,81,87,69
Dw 82,84,89,85,73,79,80,232,42,168,65,83,68,70,71,72,74,75,76
Dw 231,176,124,167,90,88,67,86,66,78,77,44,46,45,42,234,182,183
Dw 184,185,186,187,188,189,190,191,174,194,171,195,197,175,196
Dw 180,172,173,192,193,47
Dw 0,157,146,147,148,149,150,151,152,153,154,155,293,294,213,145
Dw 17,23,5,18,20,25,21,29,15,16,295,296,161,1,19,4,6,7,28,10,11
Dw 12,297,298,299,302,26,24,700,22,2,14,30,303,304,305,300,31,200
Dw 201,202,203,204,205,206,207,208,209,158,162,160,163,165,159,164
Dw 230,143,142,210,211,301
Dw 0,215,1,2,3,4,5,6,7,8,9,48,286,287,216,177,276,282,264,277,279
Dw 284,280,268,274,275,91,93,179,260,278,263,265,266,267,269,270
Dw 271,64,35,237,288,285,283,262,281,261,273,272,289,290,229,291
Dw 178,243,244,245,246,247,248,249,250,251,252,217,238,219,239,241
Dw 218,240,228,198,199,253,254,292
dw 308 dup (?)
stati dd 65536,65664,65568,65600,65696,65728,65632,65760,65792,65920
dd 65824,65856,65952,65984,65888,66016
locale db 3 dup (?)
errore dd ?
comodo dd ?
.code
cielo proc Arg1:Dword,Arg2:Dword,Arg3:Dword,Arg4:Dword
mov ebx,Arg4
mov eax,Arg3
mov esi,Arg2
mov edi,Arg1
mov par1,edi
mov par2,esi
mov par3,eax
mov par4,ebx
A0000: mov ecx,4
mov ebx,306
mov edi,offset codici
mov edx,77
mov eax,ecx
mul edx
mov esi,eax
add edi,esi
A0001: cmp ecx,7 ;Ciclo delle righe
jg A0007
mov dword ptr comodo,ecx
push ecx
mov ecx,77
A0002: cmp dword ptr comodo,6
je A0005
A0003: mov word ptr [edi],bx
inc ebx
inc edi
inc edi
A0004: loop A0002
pop ecx
inc ecx
jmp short A0001
A0005: cmp ecx,6
je A0006
jmp short A0003
A0006: mov word ptr [edi],128
inc edi
inc edi
jmp short A0004
A0007: mov ebx,par1
mov eax, [ebx]
mov edi,par2
mov esi,offset codici
xor edx,edx
mov edx,77
mul edx
mov dword ptr [par4],eax
mov dword ptr comodo,0
mov ecx,77
add esi,eax
A0008: xor ebx,ebx
mov bx,[esi]
mov word ptr [comodo],bx
mov ebx,comodo
mov dword ptr [edi],ebx
inc esi
inc esi
inc edi
inc edi
loop A0008
ret 16
cielo endp
end
io sospetto che l'errore stia nel passaggio del vettore extern "C" void __stdcall cielo(int*,int array [],int*,int*);
ma non ne sono certo.
ringrazio anticipatamente chiunque mi sappia dare una mano per capire dove stà l'errore.