Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : ASM old-style / ASM ancienne méthode [ Archives / Autres asm ] (TehWan)

samedi 25 octobre 2003 à 01:49:13 | ASM old-style / ASM ancienne méthode

TehWan

Salut, j'aimerais bien coder en assembly de l'ancienne façon, c'est-à-dire sans aucune procédures, simplement des "labels". (excusez mes anglicismes, je suis Québécois)

Voici un exemple que j'ai trouvé sur ce site... (il fait planter Windows 2000)


call fac_vga
call fin

fac_vga:
mov ax,111
int 10h
ret

fin:
mov ax,0x4c
int 0x21


C'est un exemple d'un code sans procédures, seulement des "labels". Si vous pouvez me donner des références de codes comme celui-ci, mais pour Win32 (pas DOS), ce serait bien apprécié. (je me sens téteux à parler comme ça!

Je vais essayer de chercher partout des exemples de code et si je trouve comment faire, je l'écrit ici, c'est assuré!

-- Wolf --

samedi 25 octobre 2003 à 11:15:43 | Re : ASM old-style / ASM ancienne méthode

TangiX

Le probleme c que le but de ce prog n'est pa de planter windows
(ou si i plante c que la fct 6ah n'existe pa dan l'int 10h (en mode dos emulé bien sur))
il y a deux appel d'int dans ce prog donc il ne peut pa tourner sou win
faire un prog sans les api sou win c du suicide mais : Liberté toujours !
TangiX

samedi 25 octobre 2003 à 11:20:19 | Re : ASM old-style / ASM ancienne méthode

BruNews

Administrateur CodeS-SourceS
pour Win32 il y aura par force des procedures car le systeme a besoin d'adresses de fonctions pour communiquer. L'exemple que tu as mis est un prog a deroulement lineaire, un prog win32 fonctionne sur le principe des messages.
BruNews, ciao...

samedi 25 octobre 2003 à 19:15:48 | Re : ASM old-style / ASM ancienne méthode

TehWan

Tous les deux vous n'avez rien compris.
Je sais ce que le programme fait et pourquopi il plante windows 2000, ce n'est pas ça que je veux savoir.

Et puis, si vous déassemblez un programme, vous remarquerez qu'il n'y a aucune procédure, que des "labels". Si il y a un ret, c'est une procédure.
ret renvois à l'addresse qui a appelé la procédure. Win32 fonctionne avec des messages, mais seulement si une fenêtre est crée. Les messages sont envoyés à la fenêtre. D'ou le nom WndProc (Window Processing). Je n'ai pas besoin de fenêtre, j'écris sur le DC du bureau.

Les addresses de fonctions sont en fait des addresses de labels. call quelquechose va aller à l'addresse de quelquechose. Le ret à la fin de la "procédure" va retourner à l'addresse qui l'a appellée.

Bon, j'ai lu beaucoup sur la syntaxe assembly 80x86 et tout ce qu'il me reste à comprendre c'est, comment avoir les arguments pour une procédure.

Voici un exemple de code que j'ai fait qui fonctionne presque... (Ancienne syntaxe compilée avec MASM)


.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc

includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib

.data?
msg MSG <?>
wc WNDCLASS <?>

.data
hWnd dd 0
hInstance dd 0

hInst dd 0
hPrevInst dd 0
CmdLine dd 0
CmdShow dd 0

hWin dd 0
uMsg dd 0
lParam dd 0
wParam dd 0

szDisplayName db "Wolf Rules", 0
szClassName db "Wolf", 0

.const

.code
start:

WinMain:
pop hInst
pop hPrevInst
pop CmdLine
pop CmdShow

push hInst
pop hInstance

mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, offset WndProc
mov wc.cbClsExtra, 0
mov wc.cbWndExtra, 0
mov wc.lpszMenuName, 0
mov wc.lpszClassName, offset szClassName
push hInstance
pop wc.hInstance

push 255
call CreateSolidBrush
mov wc.hbrBackground, eax

push IDI_APPLICATION
push hInstance
call LoadIcon
mov wc.hIcon, eax

push IDC_ARROW
push 0
call LoadCursor
mov wc.hCursor, eax

lea eax, wc
push eax
call RegisterClass

push 0
push hInstance
push 0
push 0
push 600
push 800
push 2147483648
push 2147483648
push WS_OVERLAPPED
push offset szDisplayName
push offset szClassName
push WS_EX_WINDOWEDGE
call CreateWindowEx
mov hWnd, eax

push SW_SHOW
push hWnd
call ShowWindow

push hWnd
call UpdateWindow

StartLoop:
lea eax, msg
push 0
push 0
push 0
push eax
call GetMessage

cmp eax, 0
je ExitLoop

lea eax, msg
push eax
call TranslateMessage

lea eax, msg
push eax
call DispatchMessage

jmp StartLoop

ExitLoop:
mov eax, msg.wParam
ret

WndProc:
pop hWnd
pop uMsg
pop wParam
pop lParam

cmp uMsg, WM_CREATE
je _CREATE

cmp uMsg, WM_DESTROY
je _DESTROY

cmp uMsg, WM_COMMAND
je _COMMAND

jmp _END

_CREATE:
push hWin
pop hWnd
jmp _END

_DESTROY:
push 0
call PostQuitMessage
jmp _END

_COMMAND:
mov eax, wParam
jmp _END

_END:
push lParam
push wParam
push uMsg
push hWin
call DefWindowProc
ret

end start


L'erreur que le code génère est lorsque je "pop" dans WndProc. C'est tout ce qu'il me manque pour l'instant. Pour les sceptiques, enlevez un paramètre au WndProc (pop) et l'erreur change de place.

-- Wolf --

samedi 25 octobre 2003 à 19:34:29 | Re : ASM old-style / ASM ancienne méthode

BruNews

Administrateur CodeS-SourceS
Voila le proto en C:
int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hprev, PSTR cmdline, int nshow)
en ASM WinMain n'existe pas a moins de creer ce bloc expres, ce qui m'a toujours semble inutile.
Tu n'a donc rien a POPer. Qui plus est on ne fait jamais un POP sur les params, on les lit en offset de ESP
Exemple lecture de hinst:
mov eax, [esp+4]
Dans une procedure, la stack se presente ainsi:
[esp] contient IP, ne pas modifier sans raison valable.
[esp+4] est 1er param
[esp+8] est 2eme param (hprev)
etc...
Prenons le cas d'une proc a 4 params, doit sortir par:
ret 16

BruNews, ciao...

samedi 25 octobre 2003 à 21:00:37 | Re : ASM old-style / ASM ancienne méthode

TehWan

Je suis programmeur C++ mais je me convertis au ASM. WinMain ne me cause aucun problème, c'est WndProc.

En passant, merci beaucoup. C'est ce que je cherchais! En Win32, chaque item dans le stack a 4 bits. En Win16/DOS, seulement 2 bits.

Merci énormément. Je l'ai cherché longtemps. Maintenant je peut coder de l'ancienne façon!

-- Wolf --



Cette discussion est classé dans : code, style, ancienne, asm, old


Répondre à ce message

Sujets en rapport avec ce message

algo pour jeu de shoot en asm [ par cable ] Bonjourje suis un jeune débutant en programmation en assembleur et je cherche l'algo (voir le code source) d'un jeu de shoot 'em up en scroling horizo Variables sour ASM pour 8086 [ par koopje ] Bonjour à tous,Etudiant, je suis en train de m'exercer avec Emu8086, un émulateur (et assembleur, au passage) d'assembleur sour 8086. J'ai tenté de f débutant en asm [ par eax ] salutje débute en asm (avec nasm) et j'arrive pas à assembler mon premier code lolsection .datamsg db 'Hello world$'section .codedebut: lea dx,msg mov appeller du C en asm [ par S2R ] Bonjour, je voudrait savoir comment utiliser un code écrit en C dans un code assembleur. nasm - mémoire read-only [ par Funto66 ] Bonjour,je suis en train d'écrire des tutoriaux pour le site Coder-Studio (http://www.coder-studio.com/?page=tutoriaux) mais pour la création du tutor portabilité du code [ par sajid_morad ] salut tout le monde, je programme avec le visaul c++ , et j ai inserer un code asm dans mon programme, sashant que j ai un micro pricesseur pentium, v (Debutant en ASM) (MASM) pointeur sur une structure [ par Otaku ] Salut, voila mon pb, j'aimerai créer une fonction en asm qui reçoit un pointeur sur un élément de type structure, jusque-là pas de pbmais comment modi Code HUFFMAN en asm 68000 [ par arnaud gasnier ] salut,je voulais savoir si qqun pouvait m'aider pour trouver comment coder en ASM 68000 l'algo de huffman pour compresser un petit texte. le tout débu W32Dasm et code ASM [ par bundyboss ] Salut a vous tous!!Presque tout est dans le titre..En fait j'aimerai savoir si le code ASM que ressort W32Dasm ou autre programme du genre et directem traduire du asm en vb [ par matlow ] Mon boss m'a demandé de récupérer le code source vb d'un éxécutable.    Pour le moment, j'arrive à récupérer uniquement le code assembleur, donc j'aim


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,218 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.