1
Posted on the 2009-12-30 at 12:39am Member since 2001-06-18, 32732 posts
yop,

Sous AMS 2.09, le dernier PreOS, un programme compilé avec la denière version de GCC4TI :
build :

tigcc -v -O2 -Wall -W --cut-ranges --optimize-code --remove-unused --optimize-relocs --merge-constants --reorder-section \
truc.c \
machin.c \
-o bidule 2>> log

truc.c

#include "kernel.h"
#include "funcs.h"

void main(void)
{
clrscr();
ESI ArgPtr = top_estack;

if (*ArgPtr == END_TAG)
{
CommandHelp();
return;
}
}

machin.c

#include "kernel.h"
#include "funcs.h"
void CommandHelp(void)
{
printf("abc");
ngetchx();
}


Dans ce cas là, tout marche bien.
Maintenant, si je rajoute "const char* HelpText" dans machin.c, j'ai un Corrupted program au runtime. Le binaire fait 4 octets de plus, et je ne sais pas ce qui merde.

Mon but étant de passer évidemment HelpText à printf et non "abc", c'est mal emmanché pour le moment. sad

Une idée ?
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
2
Posted on the 2009-12-30 at 12:42am Member since 2001-06-30, 35678 posts
Tu peux mettre la source que ça donne après la modification qui casse tout ?
avatar Que cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
3
Posted on the 2009-12-30 at 12:49am Member since 2001-06-18, 32732 posts
machin.c 

#include "kernel.h"
#include "funcs.h"

+ const char* HelpText;

void CommandHelp(void)
{
printf("abc");
ngetchx();
}

Sans le '+' évidemment.
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
4
Posted on the 2009-12-30 at 12:52am Member since 2001-06-30, 35678 posts
C'est marrant ça grin
avatar Que cache le pays des Dieux ? - Ximoon's Box - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.
5
Posted on the 2009-12-30 at 01:58am Member since 2001-06-16, 61586 posts
bon je sais pas si c'est ça mais si tu dis "const char *" c'est qu'on attend que tu mettes des données.

ok ça devrait pas faire planter mais bon.

essaye ça:

machin.c 

#include "kernel.h"
#include "funcs.h"

const char* HelpText="turlututu";

void CommandHelp(void)
{
printf("%s",HelpText);
ngetchx();
}

Sans printf(UneVariable) évidemment oui
6
Posted on the 2009-12-30 at 02:04am Member since 2001-06-18, 32732 posts
Merci, je vais essayer.

Tiens, question : pourquoi mets-tu :

printf("%s",HelpText)
et non
printf(HelpText) ?

printf attend un const char*, et HelpText en est un.

Par contre, quand je regarde le code assembleur, si j'écris
printf(HelpText);
il me sort ça :
move.l HelpText,(sp)

Ce qui est évidemment faux, il faut pousser l'adresse et non le contenu de la chaine.

Je mets donc un
printf(&HelpText);
Là ok, il me sort ça :
pea HelpText

Et c'est bien ce que j'attends !

Par contre, il me balance un warning : "Passing argument 1 of printf from incompatible pointer type". Ca peut se comprendre, HelpText est du bon type et donc pas &HelpText, mais c'est pourtant avec ça que le code généré est bon !

Là je coince, je demande une explication hypno
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
7
Posted on the 2009-12-30 at 02:11am Member since 2006-04-27, 46190 posts
Folco (./6) :
printf("%s",HelpText)
et non
printf(HelpText) ?
Exercice : que se passe-t-il dans le second cas si la chaîne HelpTest contient un backslash (ou pire, un signe pourcentage) ? smile
avatarZeroblog

« Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau
« Moi je cherche plus de logique non plus. C'est surement pour cela que j'apprécie les Ataris, ils sont aussi logiques que moi ! » — GT Turbo
8
Posted on the 2009-12-30 at 02:31am Member since 2003-02-06, 7215 posts
En effet printf(HelpText) représente une belle faille de sécurité. ^^
avatar la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.
9
Posted on the 2009-12-30 at 02:34am Member since 2001-06-18, 32732 posts
Sauf si HelpText est codé par moi en dur tongue
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
10
Posted on the 2009-12-30 at 02:59am Member since 2001-06-16, 61586 posts
ça change rien, suffit de changer l'adresse de ta variable embarrassed

et dans ce cas tu l'écris directement en plusembarrassed
11
Posted on the 2009-12-30 at 03:11am Member since 2001-06-18, 32732 posts
Et ça change rien à mon problème de type et de warnings du ./6 que je comprends toujours pas sad
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
12
Posted on the 2009-12-30 at 03:15am Edited by squalyl On the 2009-12-30 at 03:20am Member since 2001-06-16, 61586 posts
bah si, printf attend const char* en premier arg, si tu lui files &(Hello) et que hello est un const char*, le résultat est un const char ** donc warning mauvais type.

pour faire mieux faudrait écrire printf( (const char*)(&Hello) ) ce qui forcerait le type et éviterait le ouarningue, mais explique pas pkoi l'asm est mauvais.


mais en fait ça c'est juste:

printf(HelpText);
il me sort ça :
move.l HelpText,(sp)


oublie pas que HelpText est une variable pointeur, donc le contenu de la mémoire à l'adresse HelpText contient l'adresse de la chaine trioui

quand tu fais de l'asm et que t'écris:

Helptext: .ascii "prout"

en fait c'est comme si tu déclarais un tableau de char:

const char Helptext[]="prout";

et quand tu fais lea Helptext, ça fait &(HelpText[0]), parce que lea <ea> est equivalent à &(<ea>)

et que si tu fais move Helptext,%d0, %d0 va contenir *(HelpText)


enfin bref toujours la même magouille et le pb des variables C et des symboles ASM qui correspondent à des adresses en asm, mais a des vraies variables en C, parce que justement le move direct,ea fait un dereferencement de direct.
13
Posted on the 2009-12-30 at 03:19am Member since 2001-06-18, 32732 posts
han, HelpText doit donc être un const char** alors ?
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
14
Posted on the 2009-12-30 at 03:20am Edited by squalyl On the 2009-12-30 at 03:29am Member since 2001-06-16, 61586 posts
non non relis moi j'ai crossédité.

la magouille c'est que toutes les variables en C sont en RAM, donc elles sont toutes en accès move direct, ... ou move ..., direct

int a = 3;
int *b = &a;

ça fera en asm
a: .long 3
b: .long a

l'opération int a = 3 ça fait pour un assembleux 3 ->mem[a] (move a,3) et pas 3->a
par contre int *a = 3, ça fait pour un assembleux 3->a, ce qui est pas possible "tel quel" en asm car a est un label/symbole, donc pas changeable
et int b=*a ça fait mem[mem[a]]->mem[b ] (move a, (b) )

du coup on a été obligé d'inventer les variables pointeurs qui puissent contenir l'adresse d'autres variables
15
Posted on the 2009-12-30 at 03:28am Member since 2001-06-18, 32732 posts
Ouep, c'est bien beau tout ça, tu as raison c'est chiant.

Mai j'ai toujours pas trouvé la solution académique pour virer ces warnings grin
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
16
Posted on the 2009-12-30 at 03:30am Member since 2003-02-06, 7215 posts
Tu supprimes le flag -W. ^^
avatar la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.
17
Posted on the 2009-12-30 at 03:31am Member since 2001-06-16, 61586 posts
mais il était bon ton code. T'as essayé de l'exécuter? ^^

char *plop = "pwet";
void func() {
printf("%s",plop);
}

void foobarbaz() {
printf(plop); // sale mais bon on s'en accomodera
}


geo²: c'est cela, oui trioui
18
Posted on the 2009-12-30 at 03:35am Member since 2003-02-06, 7215 posts
En effet le
printf("%s", plop) est la meilleure solution mais un
printf((const char*)plop); fonctionne tout aussi bien (malgré que cela soit moins propre).
avatar la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.
19
Posted on the 2009-12-30 at 03:37am Member since 2001-06-16, 61586 posts
c'est pas le pb.

Folco: regarde bien ce qui est généré par tigcc
#include <stdio.h>

char *plop = "pwet";

.LC0:
.ascii "pwet\0"
.even
plop:
.long .LC0
.LC1:
.ascii "%s\0"
.text
.even
.globl boo

void boo() {
printf("%s",plop);
}

boo:
link.w %fp,#0
move.l plop,%d0
move.l %d0,-(%sp)
pea .LC1
jbsr printf
addq.l #8,%sp
unlk %fp
rts
.even
.globl far

void far() {
printf(plop);
}

far:
link.w %fp,#0
move.l plop,%d0
move.l %d0,-(%sp)
jbsr printf
addq.l #4,%sp
unlk %fp
rts


je fais un zoom:
.LC0:
.ascii "pwet\0"
.even
plop:
.long .LC0

toi tu as l'habitude de faire pea .LC0
mais regarde mieux: plop contient l'ADRESSE de .LC0
Du coup il fait pas faire pea plop, mais bien move plop, %d0

c'est cuefdé! grin

PS: on remarque que comme on l'a explicitement demandé, le compilo pisse une variable supplémentaire "plop" qui contient l'adresse de .LC0
Et tu remarques que le "%s" est une valeur "anonyme en C", et là il fait direct pea .LC1 puisqu'il n'a pas besoin de son adresse!

PPS: pareil avec -O3
	.globl	far
far:
move.l plop,-(%sp)
jbsr printf
addq.l #4,%sp
rts
.section .rodata.__unalignedstr,"dmu"
.LC0:
.ascii "%s\0"
.text
.even
.globl boo
boo:
move.l plop,-(%sp)
pea .LC0
jbsr printf
addq.l #8,%sp
rts
.globl plop
.section .rodata.__unalignedstr,"dmu"
.LC1:
.ascii "pwet\0"
.text
.even
plop:
.long .LC1
20
Posted on the 2009-12-30 at 03:43am Member since 2001-06-18, 32732 posts
Ah ok, c'est cool merci bien.

Pas contre, j'avais auto-zoomé sur ça moi :
	move.l plop,%d0 
move.l %d0,-(%sp)

trifus
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
21
Posted on the 2009-12-30 at 03:43am Member since 2001-06-16, 61586 posts
compilé sans optim, et cross posté la version -O3 ^^
22
Posted on the 2009-12-30 at 03:49am Member since 2001-06-18, 32732 posts
Oué bon, ça génère toujours pas ça chez moi :
const char InvalidCall[] = "Invalid call"

const char* InvalidCall;
if (ArgCount == 2)
{
printf(InvalidCall);
ngetchx();
return;
}

	cmp.w #2,%d0
jbne .L10
move.l InvalidCall,-(%sp)
.L11:
jbsr printf
jsr _ROM_CALL_51:l

	.globl	InvalidCall
.section .rodata.InvalidCall,"d"
InvalidCall:
.ascii "Invalid call.\0"
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
23
Posted on the 2009-12-30 at 07:58am Member since 2001-06-16, 61586 posts
c'est bien pour ça que j'ai écrit

const char * InvalidCall = "invalid call";

et pas

const char InvalidCall[] = "truc";
24
Posted on the 2009-12-30 at 10:00am Member since 2001-06-18, 32732 posts
J'ai changé, c'était écrit const char* avant. Mais je me décourage pas, je réessaye, parce que j'aime me prendre des beignes dans la gueule triouitrifouet

edit -> c'est bien ça, j'ai toujours de l'assembleur invalide à la sortie trioui
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
25
Posted on the 2009-12-30 at 10:47am Member since 2001-06-16, 61586 posts
mais t'as essayé de l'exécuter ou pas trifus

d'après moi il est valide cet asm, j'ai au grand jamais eu de problèmes avec print sur ti68k!!
26
Posted on the 2009-12-30 at 10:53am Member since 2001-06-18, 32732 posts
Pas essayé, non. grin Je vois pas pourquoi ça marcherait si l'assembleur est invalide, à moins que j'ai pas vu le patcheur à chaud fourni par GCC4TI tongue
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
27
Posted on the 2009-12-30 at 10:54am Member since 2001-06-18, 32732 posts
Ben quand j'exécute ça, j'ai un "Corrupted program", pourtant mon code a bien changé depuis hier soir. smile
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
28
Posted on the 2009-12-30 at 11:18am Member since 2001-06-18, 32732 posts
Bon, ben j'ai casté avec un (const char*), j'ai toujours un "corrupted program". J'ai plus qu'à me retrousser les manches direction le code de PedroM pour voir ce qui peut provoquer une telle erreur sad
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
29
Posted on the 2009-12-30 at 11:48am Member since 2001-06-18, 32732 posts
Bon, ras le fion, un e-bisou à qui m'aidera à trouver la solution. Je continue à coder, mais c'est chiant de pas comprendre, j'aime pas ça mad
tromb Fichier joint : asti68k_c.7z
avatar <<< Kernel Extremist©®™ >>>
Saint Qt, priez pour nous.
30
Posted on the 2009-12-30 at 12:24pm Member since 2001-06-16, 61586 posts
essaye sur ams ou vti si possible.