Compiller un programme assembleur pour windows
Résolu
thyma2
Messages postés
20
Date d'inscription
Statut
Membre
Dernière intervention
-
thyma2 Messages postés 20 Date d'inscription Statut Membre Dernière intervention -
thyma2 Messages postés 20 Date d'inscription Statut Membre Dernière intervention -
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
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:
- Compiller un programme assembleur pour windows
- Programme demarrage windows - Guide
- Clé windows 8 - Guide
- Montage video windows - Guide
- Windows ne démarre pas - Guide
- Windows movie maker - Télécharger - Montage & Édition
3 réponses
'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
ç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
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
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
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 ^^
Il y a sans doute d'autre solutions mais tu vas devoir coder beaucoup toi-même.
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]
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^^