Quelques exemples de programmes pour les TP de programmation en assembleur i386 avec nasm sous Linux
(testés sous Debian 2.6, AMD64)


Ces programmes sont donnés sans aucune explication, à vous de les annoter afin de les comprendre et de pouvoir réinvestir leur code .
Observez-vous une différence de comportement entre les programmes n°2 et n°3 ?  Comment expliquez-vous l'affichage produit par le programme n°7 ?  Et celui du programme n°8 si vous saisissez une chaine de 3 caractères ?

; PROGRAMME 1
section .data
  message : db 'bonjour',10
  t_message : equ $-message
section .text
global _start
_start :
  mov eax, 4
  mov ebx, 1
  mov ecx, message
  mov edx, t_message
  int 80h
  ; ---
mov eax, 1
mov ebx, 0
int 80h

; PROGRAMME 2
section .data
  message1 : db 'bonjour',10
  t_message1 : equ $-message1
  message2 : db 'chez vous',10
  t_message2 : equ $-message2
section .text
global _start
_start :
  mov eax, 4
  mov ebx, 1
  mov ecx, message1
  mov edx, t_message1
  int 80h
  ; ---
  mov eax, 4
  mov ebx, 1
  mov ecx, message2
  mov edx, t_message2
  int 80h
  ; ---
mov eax, 1
mov ebx, 0
int 80h

; PROGRAMME 3
section .data
  message1 : db 'bonjour',10
  t_message1 : equ $-message1
  message2 : db 'chez vous',10
  t_message2 : equ $-message2
section .text
global _start
_start :
  mov eax, 4
  mov ebx, 1
  mov ecx, message1
  mov edx, t_message1
  int 80h
  mov eax, 1
  mov ebx, 0
  int 80h
  ; ---
  mov eax, 4
  mov ebx, 1
  mov ecx, message2
  mov edx, t_message2
  int 80h
  ; ---
mov eax, 1
mov ebx, 0
int 80h

; PROGRAMME 4
section .bss
  chaine : resb 10
  t_chaine : equ $-chaine
section .text
global _start
_start :
  mov eax, 3
  mov ebx, 0
  mov ecx, chaine
  mov edx, t_chaine
  int 80h
  ; ---
  mov eax, 4
  mov ebx, 1
  mov ecx, chaine
  mov edx, t_chaine
  int 80h
  ; ---
mov eax, 1
mov ebx, 0
int 80h

; PROGRAMME 5
section .bss
  chaine : resb 10
  t_chaine : equ $-chaine
section .text
global _start
_start :
  call _L
  call _E
  jmp _F
_L :
  mov eax, 3
  mov ebx, 0
  mov ecx, chaine
  mov edx, t_chaine
  int 80h
  ret
_E :
  mov eax, 4
  mov ebx, 1
  mov ecx, chaine
  mov edx, t_chaine
  int 80h
  ret
_F :
mov eax, 1
mov ebx, 0
int 80h

; PROGRAMME 6
section .data
N : equ 5
char : db '#'
nl : db 10
section .txt
global _start
_start :
  mov ecx, 0
  debut :
    cmp ecx, N
    jae fin
    push ecx
    call ecrire
    pop ecx
    inc ecx
    jmp debut
fin :
  mov eax, 4
  mov ebx, 1
  mov ecx, nl
  mov edx, 1
  int 80h
mov eax, 1
mov ebx, 0
int 80h
ecrire :
  mov eax, 4
  mov ebx, 1
  mov ecx, char
  mov edx, 1
  int 80h
  ret
; PROGRAMME 7
section .data
  sans : db 'sans ! '
  t_sans : equ $-sans
  avec : db 'avec ! '
  t_avec : equ $-avec
  fin : db 10,'fin',10
  t_fin : equ $-fin
section .text
global _start
_start :
  call _sans
  call _avec
  call _fin
mov eax, 1
mov ebx, 0
int 80h
_avec :
  mov eax, 4
  mov ebx, 1
  mov ecx, avec
  mov edx, t_avec
  int 80h
_sans :
  mov eax, 4
  mov ebx, 1
  mov ecx, sans
  mov edx, t_sans
  int 80h
  ret
_fin :
  mov eax, 4
  mov ebx, 1
  mov ecx, fin
  mov edx, t_fin
  int 80h
  ret

; PROGRAMME 8
section .bss
  chaine : resb 9
  t_chaine : equ $-chaine
section .data
  nl : db 10
section .text
global _start
_start :
  mov eax, 3
  mov ebx, 0
  mov ecx, chaine
  mov edx, t_chaine
  int 80h
  mov ecx, chaine
  mov edx, t_chaine
_debut :
  cmp edx, 0
  jbe _fin
  push edx
  call _allez
  push ecx
  call _etpuis
  pop ecx
  pop edx
  dec edx
  inc ecx
  jmp _debut
_allez :
  mov eax, 4
  mov ebx, 1
  mov edx, 1
  int 80h
  ret
_etpuis :
  mov eax, 4
  mov ebx, 1
  mov ecx, nl
  mov edx, 1
  int 80h
  ret
_fin:
mov eax, 1
mov ebx, 0
int 80h


© 2012 - A. Sigayret & al. (dernière mise à jour 2013-10-15)