Sobota 26 Kwiecień 2025r. Godz 00:00:00      
Postów: 251      

Assembler - Przykład Loop


;Program demonstrujacy petle przy uzyciu loop
;
;Wprowadza: loop
;
;Linie zaczynajace sie znakiem ; sa ignorowane przy kompilacji.
;
cseg segment
assume cs:cseg, ds:cseg, es:cseg
org 100h
start:
  jmp pocz
    ;Skorzystamy z procedur z poprzedniej petli - zob. ptldemo.asm
                  ;Dane i procedury
crlf db 13,10,'$'
  ;Skorzystamy z procedur, ktore napisalismy wczesniej
  ;w celu wypisania wartosci CX na ekran
  ;Jesli nie znasz wczesniejszego programu, obejrzyj go - dataczas.asm
pznak:
    push ax
    push bx
    mov ah,0eh
    xor bx,bx
    int 10h
    pop bx
    pop ax
  ret

piszCX:         ;OK, do naszych celow przerobimy tak, aby
                ;wypisywac na ekran mlodszy bajt rejestru CX
    push ax
    push bx
    mov ax,cx
    mov bh,10
    div bh
    add al,'0'
    call pznak
    mov al,ah
    add al,'0'
    call pznak
    pop bx
    pop ax
  ret

pocz:           ;petla typu
                ;for cx=10 downto 1
                ;lub w basicu
                ;for cx=10 to 1 step -1
  mov cx,10
ptl:
  call piszcx   ;pokaz aktualna wartosc cx na ekranie
                ;wykonaj inne dzialania "w petli"
                ;na przyklad - przejdz do nowej linii
  mov ah,09h
  mov dx,offset(crlf)
  int 21h
  loop ptl      ;zrobi za nas cale porownanie i zmniejszanie
                ;i sama zakonczy sie powtarzac, gdy CX osiagnie 0

  mov ax,4c00h  ;koniec programu
  int 21h
cseg ends
end start

;Po uruchomieniu tego programu zobaczysz, ze komputer wyswietla cyfry -
;od 10 do.... 1 a nie do 0 - zastanow sie, dlaczego?
;
;
;
;