Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Assembly Beep

timok16 [09.12.2005 19:55:50]

#

moi,
Missäpäin on joku törmäys koodissani, kun tulee DOS beep ajaessa sitä. Ohjelma kyllä toimii, mut kun tulee ylimääräinen beep.

.MODEL small
.STACK 200h
.DATA
rivi   dw 00
pituus dw 00
vari   db 0
sarake dw 00

alkaa DB "paina valilyontia, tulee kolmio",13,10,'$'
et DB "et painannut valilyontia!, paina uudestaan",13,10,'$'
poistu   DB "lopetus!!!  paina 'alt+enter'",13,10,'$'
lopetus   DB "ohjelma loppui!!!  paina jotain nappia",13,10,'$'

.CODE
start:
mov ax,@data
mov ds,ax

; tähän ohjelma
                CALL KYSELY     ;kutsutaan kysely aliohjelmaa
;*************************************************************************
; Haetaan vanha tila al:ään
                mov ah,0fh
                int 10h

; Nollataan ah tilanvaihtokutsua varten
                xor ah, ah

; Säilötään alkutilan palautukseen tarvittava ax
                ;push ax

; Siirrytään tilaan 13h
                mov al,13h
                int 10h

; es-rekisteriin näyttömuistin alku
                ;mov ax, 0A000h
                ;mov es, ax
;***********************************************************
;EKA KOLMIO
                mov rivi,100
                mov pituus,25
                mov vari,3
                mov sarake,125
                CALL SIVU       ;kutsutaan aliohjelmaa, joka piirtää kolmion vasemman sivun
;************************************************************
                mov rivi,125
                mov pituus,25
                mov vari,3
                mov sarake,150
                CALL SIVU2      ;kutsutaan aliohjelmaa, joka piirtää kolmion oikean sivun
 ;************************************************************
                mov rivi,125
                mov pituus,49
                mov vari,3
                mov sarake,125
                CALL SIVU3      ;kutsutaan aliohjelmaa, joka piirtää kolmion vaakasuoran osan
;**************************************************************
                ;CALL KYSELY
KYSY2:          mov ah,9
                mov dx,OFFSET alkaa ;tekstiä näytölle
                int 21h

                mov ah,2        ;tulostetaan teksi näytölle
                int 21h

                mov ah,7        ;odotetaan merkkiä
                int 21h

                mov dl,al       ;tulostetaan näytölle
                cmp dl,' '
                je JATKA2        ;jos välilyönti-->JATKA
                mov ah,2
                int 21h

                mov ah,9
                mov dx,OFFSET et ;tekstiä näytölle
                int 21h

                mov ah,2         ;tulostetaan teksi näytölle
                int 21h
                jmp KYSY2         ;väärä merkki-->KYSY uudestaan
                JATKA2:
;**************************************************************
;TOKA KOLMIO
                mov rivi,50
                mov pituus,25
                mov vari,2
                mov sarake,50
                CALL SIVU
;**************************************************************
                mov rivi,75
                mov pituus,25
                mov vari,2
                mov sarake,75
                CALL SIVU2
;**************************************************************
                mov rivi,75
                mov pituus,49
                mov vari,2
                mov sarake,50
                CALL SIVU3
;**************************************************************
                ;Odotetaan nappia
                xor ax, ax
                int 16h
;**************************************************************
;KOLMAS KOLMIO
 JATKA3:        mov rivi,50
                mov pituus,25
                mov vari,4
                mov sarake,190
                CALL SIVU
;**************************************************************
                mov rivi,75
                mov pituus,25
                mov vari,4
                mov sarake,215
                CALL SIVU2
;**************************************************************
                mov rivi,75
                mov pituus,49
                mov vari,4
                mov sarake,190
                CALL SIVU3
;***************************************************************
                ;Odotetaan nappia
                xor ax, ax
                int 16h
;***************************************************************************
                mov ah,9
                mov dx,OFFSET lopetus ;tekstiä näytölle
                int 21h

                mov ah,2        ;tulostetaan teksi näytölle
                int 21h
 ;********************************************************************
 ;PIIRRETÄÄN NELIÖ KOLMIOIDEN YMPÄRILLE
 ;PIIRRETÄÄN NELIÖ(VASEN REUNA)
                mov dx,180		; "loppu"rivi
                mov cx,121		; pituus
	          mov al,5
   alku24:
	          push cx     ; cx talteen pinoon
	          mov ah,12	; piirrä
	          mov cx,45	; mov cx,sarake
	          int 10h
                dec dx
                inc al
                pop cx		; cx pinosta
                loop alku24
;********************************************************************
 ;PIIRRETÄÄN NELIÖ(OIKEA REUNA)
                mov dx,180		; "loppu"rivi
                mov cx,121		; pituus
	          mov al,5
   alku25:
	          push cx     ; cx talteen pinoon
	          mov ah,12	; piirrä
	          mov cx,250	; mov cx,sarake
	          int 10h
                dec dx
                inc al
                pop cx		; cx pinosta
                loop alku25
;********************************************************************
 ;PIIRRETÄÄN NELIÖ(YLIN VIIVA)
                mov dx,40       ;rivi
                mov cx,205       ;pituus
                mov al,5 ;väri
 alku22:
                mov ah,12       ;piirrä piste
                mov dx,40       ;rivi
                push cx         ;talteen
                add cx,45       ;summaa vakio cx:ään
                int 10h
                pop cx
                dec dx
                inc al
                loop alku22      ;käyttää cx:ää (cx--, lopetus jos cx=0)
 ;*********************************************************************
 ;PIIRRETÄÄN NELIÖ(ALIN VIIVA)
                mov dx,180       ;rivi
                mov cx,205       ;pituus
                mov al,5 ;väri
 alku23:
                mov ah,12       ;piirrä piste
                mov dx,180       ;rivi
                push cx         ;talteen
                add cx,45       ;summaa vakio cx:ään
                int 10h
                pop cx
                dec dx
                inc al
                loop alku23      ;käyttää cx:ää (cx--, lopetus jos cx=0)
;****************************************************************************
                ;Odotetaan nappia
                xor ax, ax
                int 16h

                ;Palautetaan alkutila
                mov ah,0
                mov al,3
                int 10h

                mov ah,9
                mov dx,OFFSET poistu ;tekstiä näytölle
                int 21h

                mov ah,2        ;tulostetaan teksi näytölle
                int 21h

                ; Lopetetaan
                mov ah,4ch
                int 21h
 ;*************************************************************
 ; PIIRRETÄÄN KOLMION VASEN SIVU
SIVU            PROC near
                mov dx,rivi      ;rivi
                mov cx,pituus       ;pituus

alku2:          mov ah,12       ;piirrä piste
                mov al,vari        ;väri
                push cx         ;pinoon talteen cx:ään
                add cx,sarake      ;sarake, lisää cx:ään arvon
                int 10h
                pop cx          ;pinosta
                inc dx        ;vähennä dx riviä yhdellä
                loop alku2
                ret
 SIVU           ENDP
;*****************************************************************
 ; PIIRRETÄÄN KOLMION OIKEA SIVU
 SIVU2          PROC near
                mov dx,rivi      ;rivi
                mov cx,pituus       ;pituus

 alku3:         mov ah,12       ;piirrä piste
                mov al,vari        ;väri
                push cx         ;pinoon talteen cx:ään
                add cx,sarake      ;sarake, lisää cx:ään arvon
                int 10h
                pop cx          ;pinosta
                dec dx        ;vähennä dx riviä yhdellä
                loop alku3
                ret
 SIVU2          ENDP
 ;*******************************************************************
 ; PIIRRETÄÄN KOLMION 3. SIVU (VAAKASUORA) OIKEALTA VASEMMALLE
   SIVU3        PROC near
                mov dx,rivi       ;rivi
                mov cx,pituus       ;pituus

alku4:
                mov ah,12       ;piirrä piste
                mov dx,rivi       ;rivi
                push cx         ;talteen
                add cx,sarake      ;summaa vakio cx:ään
                mov al,vari        ;väri (xxxxhRGBb)
                int 10h
                pop cx
                dec dx
                loop alku4      ;käyttää cx:ää (cx--, lopetus jos cx=0)
                ret
 SIVU3         ENDP
;************************************************************************
KYSELY          PROC near
 KYSY:          mov ah,9
                mov dx,OFFSET alkaa ;tekstiä näytölle
                int 21h

                mov ah,2        ;tulostetaan teksi näytölle
                int 21h

                mov ah,7        ;odotetaan merkkiä
                int 21h

                mov dl,al       ;tulostetaan näytölle
                cmp dl,' '
                je JATKA        ;jos välilyönti-->JATKA
                mov ah,2
                int 21h

                mov ah,9
                mov dx,OFFSET et ;tekstiä näytölle
                int 21h

                mov ah,2         ;tulostetaan teksi näytölle
                int 21h
                jmp KYSY         ;väärä merkki-->KYSY uudestaan
                JATKA:
                ret
 KYSELY         ENDP
                end start

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta