Compiller un programme assembleur pour windows

Résolu/Fermé
thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020 - Modifié le 26 mars 2017 à 19:58
thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020 - 2 avril 2017 à 20:01
Bonjour je programme sur assembleur depuis quelque temps, et j'ai fait un programme qui affiche des lignes de pixels
je l'ai appeler ligne.exe et il marche sur dosbox et j'ai fait une autre version ou on peut booter dessus, ça marche aussi sur virtual box. maintenant j'aimerai faire marcher mon programme sur windows alors j'ai suivis ce tuto :
https://www.commentcamarche.net/faq/9836-compiler-un-programme-assembleur-avec-nasm
mais quand j'ouvre mon programme il crash
code : [code]
section .text
global _WinMain@16

_WinMain@616:

MOV AX, 13h
INT 10h

mov ax, 90
mov bx, 1
mov cx, 20
mov dx, 30

call ligne

mov ax, 90
mov bx, 1
mov cx, 20
mov dx, 60

call ligne

mov ax, 1
mov bx, 30
mov cx, 20
mov dx, 30

call ligne

mov ax, 1
mov bx, 30
mov cx, 50
mov dx, 30

call ligne

mov ax, 30
mov bx, 30
mov cx, 20
mov dx, 30

call ligne

mov ax, -30
mov bx, 29
mov cx, 50
mov dx, 30

call ligne

mov ax, 1
mov bx, 30
mov cx, 80
mov dx, 30

call ligne

mov ax, 1
mov bx, 30
mov cx, 110
mov dx, 30

call ligne

mov ax, 30
mov bx, 30
mov cx, 80
mov dx, 30

call ligne

mov ax, -30
mov bx, 29
mov cx, 110
mov dx, 30

call ligne

mov ax, 30
mov bx, 30
mov cx, 10
mov dx, 10

call ligne

mov ax, -30
mov bx, 30
mov cx, 10
mov dx, 10

call ligne

ret

ligne:
cmp ax, 0
jle ligne_axinf0; si ax<0
cmp ax, bx
jle ligne_bxsupax ;si bx>ax
jmp ligne_axsupbx ;si ax>bx
ret

ligne_axsupbx:
mov bp, dx
mov dx, 0; je fait ça parce que pour diviser un truc faut que dx soit = à zero
div bx
mov dx, bp
mov bp, ax
mov si, bp
add bp, cx
add bx, dx; donc mtn on a le coéficient dans ax et la limite dans bx

boucle_ligne_axsupbx_a:
MOV AH, 0Ch ;Numero de l'interruption
mov al, 30h ; couleur
INT 10h; affiche le pixel
cmp cx, bp
je boucle_ligne_axsupbx_b
inc cx
jmp boucle_ligne_axsupbx_a
boucle_ligne_axsupbx_b:
inc dx
add bp, si
cmp dx, bx
je fin
jmp boucle_ligne_axsupbx_a

ligne_bxsupax:; ici c'est la même que axsupbx sauf que c'est plus x nombre pixel sur l'axe x pour 1 pixel sur l'axe y mais x nombre pixel sur l'axe y pour 1 pixel sur l'axe x
mov bp, bx
mov bx, ax
mov ax, bp
mov bp, dx
mov dx, 0
div bx
mov dx, bp
mov bp, ax
mov si, bp
add bp, dx
add bx, cx

boucle_ligne_bxsupax_a:
MOV AH, 0Ch
mov al, 30h
INT 10h
cmp dx, bp
je boucle_ligne_bxsupax_b
inc dx
jmp boucle_ligne_bxsupax_a
boucle_ligne_bxsupax_b:
inc cx
add bp, si
cmp cx, bx
je fin
jmp boucle_ligne_bxsupax_a

ligne_axinf0:
neg ax
cmp ax, bx
jle ligne_bxsupax_axinf0 ;si bx>ax
jmp ligne_axsupbx_axinf0 ;si ax>bx

ligne_axsupbx_axinf0:
mov bp, dx
mov dx, 0; je fait ça parce que pour diviser un truc faut que dx soit = à zero
div bx
mov dx, bp
neg ax
mov bp, ax
mov si, bp
add bp, cx
add bx, dx; donc mtn on a le coéficient dans ax et la limite dans bx

boucle_ligne_axsupbx_axinf0_a:
MOV AH, 0Ch ;Numero de l'interruption
mov al, 30h ; couleur
INT 10h; affiche le pixel
cmp cx, bp
je boucle_ligne_axsupbx_axinf0_b
dec cx
jmp boucle_ligne_axsupbx_axinf0_a
boucle_ligne_axsupbx_axinf0_b:
inc dx
add bp, si
cmp dx, bx
je fin
jmp boucle_ligne_axsupbx_axinf0_a

ligne_bxsupax_axinf0:
mov bp, bx
mov bx, ax
mov ax, bp
mov bp, dx
mov dx, 0; je fait ça parce que pour diviser un truc faut que dx soit = à zero
div bx
mov dx, bp
neg bx
mov bp, ax
mov si, bp
add bp, cx
add bx, dx; donc mtn on a le coéficient dans ax et la limite dans bx

boucle_ligne_bxsupax_axinf0_a:
MOV AH, 0Ch ;Numero de l'interruption
mov al, 80h ; couleur
INT 10h; affiche le pixel
cmp dx, bp
je boucle_ligne_bxsupax_axinf0_b
inc dx
jmp boucle_ligne_bxsupax_axinf0_a
boucle_ligne_bxsupax_axinf0_b:
dec cx
add bp, si
cmp cx, bx
je fin
jmp boucle_ligne_bxsupax_axinf0_a


fin:
ret 16
[/code]

ET JE PIGE PAS POURQUOI
ça me tue j'ai pleins de théories mais aucunes certitudes

ps je suis sous windows 10, 64 bits avec un processeur intel pentium 3558V
A voir également:

3 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié le 27 mars 2017 à 01:58
'lut,

ça crash pour la simple raison que tu utilises des interruptions BIOS directement, et que là où DOSBOX (émulant DOS, qui n'est pas un "vrai" OS dans le sens où il n'a pas de noyau) ou VirtualBox émulent un BIOS et du matériel indépendant, Windows ne te laissera absolument jamais faire ça avec un simple programme tournant en espace utilisateur.

Dans l'état tu es obligé de faire de l'émulation ou de booter réellement dessus, la manipulation graphique étant toute autre sur Windows.
from human import idiocy
del idiocy
1
thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020 2
27 mars 2017 à 18:19
merci de ta réponse.
mais du coup peut tu m'envoyer un tuto qui me donne la syntaxe assembleur autoriser par windows parce que bon si je dois rebooter mon ordie sur ma clef pour lancer mes programmes c'est pas top ^^
j’espère que la syntaxe windows ne complique pas bon au bout de 2 semaines à tous mettre en place j'arrive enfin à m'y retrouver ^^
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225 > thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020
29 mars 2017 à 00:32
Malheureusement, si, elle est immensément plus complexe, quelque soit celle que tu choisisses. Il y parmi elles GDI(+), qui nécessite d'utiliser l'API Windows pour créer une fenêtre, au minimum. Cependant très peu de personnes utilisent ça avec de l'assembleur. DirectDraw est aussi utilisable mais est obsolète depuis DirectX 7.
Il y a sans doute d'autre solutions mais tu vas devoir coder beaucoup toi-même.
0
thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020 2 > thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020
30 mars 2017 à 20:19
C'est vrai que la syntaxe qu'autorise windows est très complexe, je suis même pas arriver à comprendre un hello world alors le temps de mieux comprendre l'assembleur j'ai décider de changer de baisser l'ambition et rester sur des programmes bootable
mais j'ai un autre problème pourrais tu m'aider stp
enfaite j'ai décider de crée un mini os (pas un vrai genre windows hein juste deux trois programmes) et je me dit que je peut pas le coder en une fois cette os alors pour me faciliter je vais le fragmenter en pleins de fonctions (genre la fonction ligne que j'ai améliorer depuis) et que quelques programmes principaux vont appeler ces fonctions.
mais je n'arrive pas a ouvrir un programme à partir d'un autre
je m'explique
j'aimerai faire ceci:
[code]
ORG 0x7C00

;ceci est mon noyau ici j'aimerai charger un programme du nom de clavier.exe comment je fait ?

times 510 - ($ - $$) db 0
dw 0xAA55
[/code]
0
thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020 2
Modifié le 31 mars 2017 à 19:04
EDIT c'était pas claire je réexplique

comment à partir de mon noyau je lance un autre programme ?

je compile mes programmes comme ça (code batch) :
nasm -o test.o test.asm
nasm test.asm -f bin -o test.exe
copy test.exe disk.img /Y (ça c'est la création du disque pour virtual box mais malheureusement la commande ne marche que si il n'y a qu'un seul exe exactement ce que je ne veut pas)

vraiment je suis débutant en asm ne pas trop me bousculer merci ^^ la preuve je me suis limité au mode graphique 13h parce que j'arrivais pas à lancer ceux au dessus^^
0
up ?
0
thyma2 Messages postés 20 Date d'inscription dimanche 26 mars 2017 Statut Membre Dernière intervention 7 janvier 2020 2
2 avril 2017 à 20:01
EDIT j'y suis enfin arriver, j'ai trouver comme un grand et dans mon extrême générosité je poste la solution pour ceux qui comme moi galères :
bon de base l'objectif était de crée un noyau qui charge un kernel le tout dans un .img qu'on met dans une clef usb ou sur virtual box puis on se la pète devant les copains qui vous prennent pour un gros taré

bon alors le noyau il est ici : http://a.michelizza.free.fr/pmwiki.php?n=TutoOS.Bootloader
et vous pouvez virez tout ce qui est en rapport avec l'affichage de texte parce qu'en vrai ça sert à rien ^^

ensuite le kernel vous le faites vous même hein ^^ (sinon quel intérêt?) mais vous pouvez toujours prendre un scripte en ligne pour tester)

et enfin vous avez vos deux fichiers sources en .asm
ce qu'il faut faire :
bon ban en premier (j’espère que vous savez déjà) vous compilez en .exe le kernel et le noyau :
nasm noyau.asm -f bin -o noyau.exe
nasm kernel.asm -f bin -o kernel.exe
puis TOUT CON MAIS J'AI GALÉRER 3 HEURS: vous crée le .img :
copy noyau.exe/B+kernel.exe/B disk.img /Y
et enfin deux chois :
vous testez sur une vm comme bosh, quému, ou virutalbox
ou alors avec rawrite vous foutez le .img sur votre clef usb préférer pour booter réellement sur votre os
0