Statut : Non résoluEviter les branchements conditionnels
Mistermine, le samedi 6 septembre 2008 à 01:51:16 Bonjour,
je debute en programmation assembleur j'ai trouve dans un document une conseil qui s'agit de "EVITER LES BRANCHEMENTS CONDITIONNELS" par exemple :
un programme qui compare deux entiers et affiche le plus grand normalement on utilise un simple "jmp"apres un "cmp" mais dans une autre version qui est ecrite pour optimiser le code n'apas utiliser un jmp voila le code
segment .data
45
message1 db "Entrez un nombre : ",0
6 message2 db "Entrez un autre nombre : ", 0
7 message3 db "Le plus grand nombre est : ", 0
89
segment .bss
10
11 input1 resd 1 ; premier nombre entre
12
13 segment .text
14 global _asm_main
15 _asm_main:
16 enter 0,0 ; routine d'initialisation
17 pusha
18
19 mov eax, message1 ; affichage du premier message
20 call print_string
21 call read_int ; saisie du premier nombre
22 mov [input1], eax
23
24 mov eax, message2 ; affichage du second message
25 call print_string
26 call read_int ; saisie du second nombre (dans eax)
27
28 xor ebx, ebx ; ebx = 0
29 cmp eax, [input1] ; compare le premier et le second nombre
30 setg bl ; ebx = (input2 > input1) ? 1 : 0
31 neg ebx ; ebx = (input2 > input1) ? 0xFFFFFFFF : 0
32 mov ecx, ebx ; ecx = (input2 > input1) ? 0xFFFFFFFF : 0
33 and ecx, eax ; ecx = (input2 > input1) ? input2 : 0
34 not ebx ; ebx = (input2 > input1) ? 0 : 0xFFFFFFFF
35 and ebx, [input1] ; ebx = (input2 > input1) ? 0 : input1
36 or ecx, ebx ; ecx = (input2 > input1) ? input2 : input1
37
38 mov eax, message3 ; affichage du résultat
39 call print_string
40 mov eax, ecx
41 call print_int
42 call print_nl
43
44 popa
45 mov eax, 0
46 leave
47 ret
merci de m'expliquer comment ca marche