Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Wykres funkcji w assembler

rexio1988 19 Jan 2009 01:51 3513 7
  • #1
    rexio1988
    Level 10  
    Mam taki oto program


    ;program graficzny rysunek funkcji
    
    .MODEL	SMALL
    
    .STACK	100h
    
    .386
    
    .DATA
    Wynik	dd 0
    Liczba	dd 1.0
    Liczba2	dd 100	;opcjonalnie 100
    Liczba3	dd 0.01
    temp	dd ?
    
    .CODE
    Start	PROC
    mov	ax, @Data
    mov	ds, ax
    
    ;		Inicjalizacja trybu graficznego
    mov	ax, 0012h
    mov	bh, 0h
    int	10h
    
    FINIT
    mov	bp, offset Wynik
    call	Rysuj_funkcje		;y=sin(tg(x))*cos(x)
    
    mov	ah, 00h
    int	16h
    call	Koniec
    Start	ENDP
    
    
    Koniec	PROC
    mov	ah, 00h
    mov	al, 03h
    int	10h
    mov	ah, 4Ch
    int	21h
    Koniec	ENDP
    
    ;;;;;;;;;;;;;;;;;;;;;;;;Procedura rysowania wybranej funkcji
    ;;;;;;;;;;;;;;;;;;;;;;;;w cx wsp.X, w dx wsp.Y
    ;;;;;;;;;;;;;;;;;;;;;;;;a al kolor, bh numer strony, funkcja 0Ch w ah
    Rysuj_funkcje	PROC
    mov	cx, 639
    mov	bh, 0
    mov	al, 0011b
    mov	ah, 0Ch
    mov	cx, 0
    Rysuj_petla:
    FLD	Liczba			;odluz liczbe 1 na stos
    FLD	Liczba3			;      liczbe 0.1
    FADD
    FST	Liczba			;pobierz ze stosu bez usuwania
    FCOS
    FLD	Liczba
    FPTAN
    FSTP	temp			;zdemujemy cos
    FSIN
    FMUL
    FILD	Liczba2
    FMUL
    FRNDINT				;konwersja do liczby calkowitej
    ;FBSTP	Wynik			
    FISTP	Wynik
    
    mov	dx, 240
    adc	dx, WORD PTR Wynik
    int	10h
    inc	cx
    cmp	cx, 639
    jb	Rysuj_petla
    
    ret
    Rysuj_funkcje	ENDP
    
    
    END	Start


    musze go przerobic zeby otrzymac wykres funkcji: y=[a*sin(b*x)]^2 +c

    Bardzo prosze o pomoc albo wskazowki ktore funkcje koprocesora zmienic i ewentualnie jakie zmienne dodac.
    pozdrawiam;)

    ============

    Wynik   dd 0
    X   dd 1.0
    B   dd 100 
    A   dd 0.01
    C   dd 5.0
    
    fld B
    fmul X
    fsin
    fmul A
    fmul st(0), st(0)
    fadd C
    fistp Wynik

    tylko nie wiem jak zrobic zeby sie wartosc X zmieniala.
    prosze o pomoc

    Proszę nie pisać postu pod postem tylko używać przycisku ZMIEŃ.
    Posty scaliłem.
    [Dr.Vee]
  • #2
    Remeknapr
    Level 33  
    Przepraszam z góry za niekompetentne pytanie. Spróbuję skonstruować procedurę.

    We wzorze "wykres funkcji: y=[a*sin(b*x)]^2 +c "


    1. x i y oznaczają wartości współrzędnych?
    2. Pozostałe dane są stałe?

    Jeśli tak, z jakim krokiem ma się zmieniać x? Podejrzewam, że to będzie wynikało z rozdzielczości ekranu monitora.
  • #3
    rexio1988
    Level 10  
    sam dokladnie nie wiem ale skoro x jest w radianach to chyba wystarczy go zwiekszac co 1. x i y to sa wspolrzedne. a,b,c sa stalymi.

    ten program calkiem u gory to jest program ktory dostalem od prowadzacego zajecia i kazal nam to przerobic zeby otrzymac zadana funkcje. Z .asm jest poczatkujacy i nie za bardzo wiem co i jak pozmieniac;/ bede bardzo wdzieczny za pomoc;)

    Edit1: rozdzielczosc w programie jest ustawiona domyslnie na 640x480



    Edit2: juz nieaktualne, poradzilem sobie :)
  • #4
    Remeknapr
    Level 33  
    rexio1988 wrote:

    juz nieaktualne, poradzilem sobie :)


    1. W takim razie wypada podać rozwiązanie.
    2. Wypada dokładnie przepisać podany przez wykładowcę program

    "odluz"

    "w cx wsp.X, w dx wsp.Y"

    To jest nieprawda. Współrzędne są w rejestrze dx.

    dl - wpółrzędna y
    dh - współrzędna x

    cx to w tym programie tylko licznik pętli. Gdyby nie te błędy, może wcześniej by Ci ktoś podpowiedział rozwiązanie.
  • #5
    rexio1988
    Level 10  
    Moj juz przerobiony rysujacy funkcje: y=[a*sin(b*x)]^2 +c
    od wykladowcy zostal podany wyzej;P

    ;program graficzny rysunek funkcji
    ;y=[a*sin(b*x)]^2 +c
    .MODEL   SMALL
    .STACK   100h
    .386
    .DATA
    Wynik   dd 0.0
    X   dd -320.0
    A   dd 7.0   ;opcjonalnie 100
    B   dd 3.375
    C   dd 100.0
    ;temp dd 0
    ;temp   dd ?
    .CODE
    Start   PROC
    mov   ax, @Data
    mov   ds, ax
    ;      Inicjalizacja trybu graficznego
    mov   ax, 12h
    mov   bh, 0h
    int   10h
    mov dx,480  	     		;wysokosc  max wysokosc 480			
    mov cx,320					;szerokosc  max szerokosc 640
    
    ;--> RYSUJE OS PIONOWA <--
    
    wysokosc:
    
    	mov al, 10				;rysowanie pojedynczego pixela 
    	mov ah, 0ch		
    	int 10h			
    
    				
    	cmp dx,0
    	dec dx
    	jne wysokosc
    
    
    mov dx, 240
    mov cx, 640
    
    
    ;--> RYSUJE OS POZIOMA <--
    
    szerokosc:
    	mov al, 10
    	mov ah, 0ch
    	int 10h
    
    
    	cmp cx,2
    	dec cx
    	jne szerokosc
    
    ;--> RYSUJE GROTY <--
    
    mov cx,630
    mov dx,235
    
    grot1:
    
    	mov al,10
    	mov ah,0ch
    	int 10h
    	inc cx
    
    	mov al,10
    	mov ah,0ch
    	int 10h
    	inc cx
    	
    	inc dx
    	cmp cx,640
    	jne grot1
    	
    mov cx,630
    mov dx,245
    dol:
    	mov al,10
    	mov ah,0ch
    	int 10h
    	inc cx
    
    	mov al,10
    	mov ah,0ch
    	int 10h
    	inc cx
    
    	dec dx
    	cmp cx,640
    	jne dol
    
    mov cx,315
    mov dx,10
    
    grot2:
    	mov al,10
    	mov ah,0ch
    	int 10h
    	dec dx
    
    	mov al,10
    	mov ah,0ch
    	int 10h
    	dec dx
    	
    	inc cx
    	cmp dx,0
    	jne grot2
    
    mov cx,325
    mov dx,10
    
    gora:
    	mov al,10
    	mov ah,0ch
    	int 10h
    	dec dx
    
    	mov al,10
    	mov ah,0ch
    	int 10h
    	dec dx
    
    	dec cx
    	cmp dx,0
    	jne gora	
    	
    ;--> X <--
    mov dx, 250
    mov cx, 630
    X1:
    	mov al,12
    	mov ah,0ch
    	int 10h
    	inc cx
    	inc dx
    	cmp cx,636
    	jne X1
    
    mov dx, 255
    mov cx, 630
    
    X2:
    	mov al,12
    	mov ah,0ch
    	int 10h
    	inc cx
    	dec dx
    	cmp cx,636
    	jne X2
    	
    	
    ;--> Y <--
    mov dx, 5
    mov cx, 310
    Y1:
    	mov al,12
    	mov ah,0ch
    	int 10h
    	dec cx
    	inc dx
    	cmp cx,302
    	jne Y1
    
    mov dx, 8
    mov cx, 305
    
    Y2:
    	mov al,12
    	mov ah,0ch
    	int 10h
    	dec cx
    	dec dx
    	cmp dx,4
    	jne Y2
    
    	
    FINIT
    mov   bp, offset Wynik
    call   Rysuj_funkcje      ;y=sin(tg(x))*cos(x)
    mov   ah, 00h
    int   16h
    call   Koniec
    Start   ENDP
    Koniec   PROC
    mov   ah, 00h
    mov   al, 03h
    int   10h
    mov   ah, 4Ch
    int   21h
    Koniec   ENDP
    ;;;;;;;;;;;;;;;;;;;;;;;;Procedura rysowania wybranej funkcji
    ;;;;;;;;;;;;;;;;;;;;;;;;w cx wsp.X, w dx wsp.Y
    ;;;;;;;;;;;;;;;;;;;;;;;;a al kolor, bh numer strony, funkcja 0Ch w ah
    Rysuj_funkcje   PROC
            mov   cx, 639
            mov   bh, 0
            mov   al, 20
            mov   ah, 0Ch
            mov   cx, 0
    Rysuj_petla:
            fld     B
            fmul    X
            fsin
            fmul    A
            fmul    st(0), st(0)
            fadd    C
            FRNDINT
            fistp   Wynik   ;FBSTP   Wynik         
            fld1        ;<--- X będzie zwiększany o 1
            fld          X
            faddp   st(1),st(0)
            fstp    X
    
            mov   dx, 240
            sub   dx, WORD PTR Wynik
            int   10h
            add   cx, 5			;inc cx
            cmp   cx, 635
            jne   Rysuj_petla	
            ret
    Rysuj_funkcje   ENDP
    END   Start         
    
  • #6
    Remeknapr
    Level 33  
    Proponuję w takim razie wyjaśnić z wykładowcą poniższy nieprawdziwy komentarz:

    ; w cx wsp.X, w dx wsp.Y

    I nie idzie tu bynajmniej o jakiś jałowy spór. Na Forum zagląda wielu ludzi poszukujących rozwiązania i znajduje wiedzę często fałszywą.

    PS Gratuluję rozwiązania. Może być prostsze, takie jak podałeś wcześniej.
  • #7
    rexio1988
    Level 10  
    w ostatecznym programie dodalem tylko os X i os Y z grotami i podpisane:)
    nie wiem dokladnie i nie chce sie klocic ale ostatnio jak robilem wykres kartezjanski to do rysowania wspolrzednych uzywalem cx i dx, uklad sie udal wiec nie jestem pewien czy masz racje z tym ze wspolrzedne znajduja sie w rejestrze dx...
  • #8
    Remeknapr
    Level 33  
    rexio1988 wrote:
    nie jestem pewien czy masz racje z tym ze wspolrzedne znajduja sie w rejestrze dx...


    A ja jestem pewien, że w przypadku zastosowania przerwania BIOS nr 10h, współrzędne znajdują sie tam, gdzie napisałem tzn. w połówkach rejestru dx. Zajrzyj do spisu przerwań "Ralf Brown's Interrupt List" i wszystko będzie jasne. Ewentualnie poeksperymentuj z wartościami rejestrów w programie i wyciągnij wnioski. To nie jest materia sporna. To jest wiedza.