ASM old-style / ASM ancienne méthode

TehWan Messages postés 8 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 26 octobre 2003 - 25 oct. 2003 à 01:49
TehWan Messages postés 8 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 26 octobre 2003 - 25 oct. 2003 à 21:00
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! :-p

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

-- Wolf --

5 réponses

TangiX Messages postés 59 Date d'inscription dimanche 15 décembre 2002 Statut Membre Dernière intervention 2 juin 2004
25 oct. 2003 à 11:15
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 !
%-6 TangiX %-6
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 oct. 2003 à 11:20
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...
0
TehWan Messages postés 8 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 26 octobre 2003
25 oct. 2003 à 19:15
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 --
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
25 oct. 2003 à 19:34
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TehWan Messages postés 8 Date d'inscription vendredi 24 octobre 2003 Statut Membre Dernière intervention 26 octobre 2003
25 oct. 2003 à 21:00
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 --
0
Rejoignez-nous