psico88
05-12-2010, 16:45
Mi rendo conto che sto chiedendo cose davvero "vecchie", però mi fanno fare quello all'università quindi ci provo lo stesso. Allora per farla breve:
devo fare una procedura in Assembly che sia richiamabile da un programma C. Questa procedura deve contare i giorni a partire dal 01/01/2000 fino alla data passata come parametro, e restituirli come valore di ritorno. Io ho fatto tutto ma il problema è che quando faccio partire l'eseguibile, alla fine del programma mi scrive "Null pointer assignment". Il codice Assembly è questo (tagliando le parte dell'algoritmo che è corretto):
DEFAULT_YEAR EQU 2000
DEFAULT_MONTH EQU 1
DEFAULT_DAY EQU 1
DAYS_PER_YEAR EQU 365
PUBLIC _countdays
.MODEL small
.STACK
.DATA
DAYS_PER_MONTH DB 31,28,31,30,31,30,31,31,30,31,30,31
DAY DB ?
MONTH DB ?
YEAR DW ?
TOTAL_DAYS DW ?
.CODE
_countdays PROC NEAR
PUSH BP
MOV BP, SP
PUSH SI
; ...
; lettura parametro e calcolo giorni
; ...
MOV AX, TOTAL_DAYS ; valore di ritorno
POP SI
POP BP
RET
_countdays ENDP
END
quindi dovrebbe essere a posto. Il programma C è questo:
#include <stdio.h>
#include <stdlib.h>
/* Assembly procedure */
extern unsigned int countdays (char *date) ;
int main (void)
{
char date[10+1];
unsigned int total_days;
/* Code to set the italian keyboard, for Windows Vista and Windows 7 */
system("kb16 it");
/* Read the date */
printf ("Insert the date (dd/mm/yyyy): ");
scanf ("%s", date);
/* The date is assumed to be correct, so count days with the assembly procedure */
total_days = countdays (date) ;
/* Print the number of days */
printf ("\nTotal days from 01/01/2000 to %s: %u\n\n", date, total_days);
system("pause");
return 0;
}
e anche qua non mi sembra ci siano errori... poi non uso puntatori, quindi non capisco perchè mi scriva "Null pointer assignment". I programmi usati sono: MASM 6.1 per compilare la parte Assembly, TURBOC 2.1 per compilare la parte C e linkare i due file obj e creare l'eseguibile. Mi rendo conto che siano cose "ancestrali", però se qualcuno sapesse come posso risolvere la cosa ne sarei grato... nel programma C ho provato a commentare tutto il codice dentro il main, ma l'errore lo fa comunque :muro:
Screen errore:
http://img593.imageshack.us/img593/6363/immaginebl.th.png (http://img593.imageshack.us/i/immaginebl.png/)
devo fare una procedura in Assembly che sia richiamabile da un programma C. Questa procedura deve contare i giorni a partire dal 01/01/2000 fino alla data passata come parametro, e restituirli come valore di ritorno. Io ho fatto tutto ma il problema è che quando faccio partire l'eseguibile, alla fine del programma mi scrive "Null pointer assignment". Il codice Assembly è questo (tagliando le parte dell'algoritmo che è corretto):
DEFAULT_YEAR EQU 2000
DEFAULT_MONTH EQU 1
DEFAULT_DAY EQU 1
DAYS_PER_YEAR EQU 365
PUBLIC _countdays
.MODEL small
.STACK
.DATA
DAYS_PER_MONTH DB 31,28,31,30,31,30,31,31,30,31,30,31
DAY DB ?
MONTH DB ?
YEAR DW ?
TOTAL_DAYS DW ?
.CODE
_countdays PROC NEAR
PUSH BP
MOV BP, SP
PUSH SI
; ...
; lettura parametro e calcolo giorni
; ...
MOV AX, TOTAL_DAYS ; valore di ritorno
POP SI
POP BP
RET
_countdays ENDP
END
quindi dovrebbe essere a posto. Il programma C è questo:
#include <stdio.h>
#include <stdlib.h>
/* Assembly procedure */
extern unsigned int countdays (char *date) ;
int main (void)
{
char date[10+1];
unsigned int total_days;
/* Code to set the italian keyboard, for Windows Vista and Windows 7 */
system("kb16 it");
/* Read the date */
printf ("Insert the date (dd/mm/yyyy): ");
scanf ("%s", date);
/* The date is assumed to be correct, so count days with the assembly procedure */
total_days = countdays (date) ;
/* Print the number of days */
printf ("\nTotal days from 01/01/2000 to %s: %u\n\n", date, total_days);
system("pause");
return 0;
}
e anche qua non mi sembra ci siano errori... poi non uso puntatori, quindi non capisco perchè mi scriva "Null pointer assignment". I programmi usati sono: MASM 6.1 per compilare la parte Assembly, TURBOC 2.1 per compilare la parte C e linkare i due file obj e creare l'eseguibile. Mi rendo conto che siano cose "ancestrali", però se qualcuno sapesse come posso risolvere la cosa ne sarei grato... nel programma C ho provato a commentare tutto il codice dentro il main, ma l'errore lo fa comunque :muro:
Screen errore:
http://img593.imageshack.us/img593/6363/immaginebl.th.png (http://img593.imageshack.us/i/immaginebl.png/)