;; nasm -g -f elf cour7.asm ;; gcc cours7.o asm_io.o -o cours7 %include "asm_io.inc" SECTION .data msg1: db "nb bandes?",10,0 msg2: db "nb lignes?",10,0 msg3: db "caractere?",10,0 blanc: db " ",0 SECTION .bss nbb: resd 1 ; 1 mot pour stocker le nombre de bandes nbl: resd 1 ; 1 mot pour stocker le nombre de lignes SECTION .text global main main: mov eax, msg1 call print_string call read_int mov [nbb], eax ; [nbb] <- nombre de bandes mov eax, msg2 call print_string call read_int mov [nbl], eax ; [nbl] <- nombre de lignes mov eax, msg3 call print_string call read_char call read_char ; bug: normalement, 1 seul appel ˆ read_char suffit mov ecx, [nbl] ; compteur de boucle <- nombre de lignes push eax ; 1er argument de la fonction ligne: le caractere qui est encore dans eax push dword [nbb] ; 2eme argument de la fonction ligne: le nombre de bandes ; (dword: il faut dire au processeur de prendre 32 bits en mŽmoire) nxt: call ligne loop nxt ; refaire la meme chose tant que ecx <> 0 ; (possible parce qu'ecx n'est pas modifie dans la fonction ligne) add esp, 4 ; depiler le nombre de bandes pop eax ; depiler le caractere dans eax (il est possible qu'il n'y soit plus apres la fonction ligne) fin: mov ebx, 0 mov eax, 1 int 0x80 ;; fonction ligne: affiche une ligne ;; arguments: ;; - code ascii du caractere a afficher [ebp+12] ;; - nombre de fois que l'on affiche ce caractere sur une ligne [ebp+8] ;; registres modifies: eax ligne: push ebp ; sauvegarde de l'ancienne base de la pile mov ebp, esp ; mise a jour de la base de la pile push ecx ; sauvegarde de ecx pour que la fonction ligne ne le modifie pas mov ecx, [ebp+8] ; ecx <- [nbb] sv: mov eax, [ebp+12] ; eax <- caractere a afficher call print_char mov eax, blanc call print_string loop sv call print_nl ; pour terminer la ligne pop ecx ; retablissement de ecx pop ebp ; retablissement de l'ancienne base de la pile ret