09.12.35 Uppbygging tölva

Forritunarverkefni 4


Í þetta sinn eigið þið að leysa nokkur smærri forritunarverkefni í smalamáli. Dæmin eru flest gömul prófdæmi og eru lýsindi fyrir þá smalamálsforritun sem þið þurfið að geta gert á prófi í þessu námskeiði.

Á prófinu hafið þið ekki aðgang að tölvu, þannig að þið skuluð reyna fyrst að leysa dæmin á blaði, áður en þið sláið þau inn og prófið.

  1. Skoðið eftirfarandi 8086-smalamálsbút:
                    clc
            upp:    mov     ax, [si]
                    adc     [di], ax
                    inc     si
                    inc     si
                    inc     di
                    inc     di
            loop    upp
      
    Svarið eftirfarandi spurningum um forritsbútinn:

    a) Lýsið hvað búturinn gerir (með orðum eða sauðakóda).

    b) Hvers vegna er skipunin inc notuð til að hækka si og di, í stað þess að leggja 2 við með skipuninni add?

  2. [Próf '98]
    1. Hér að neðan er forritsbútur til að afrita CX bæti frá DS:SI til ES:DI. Útskýrið nákvæmlega tilgang hverrar skipunnar
      	shr       cx, 1
      	rep movsw
      	adc       cx, cx
      	rep movsb
         
    2. Útskýrið hvað eftirfarandi forritsbútur gerir. (Vísbending: Heildarstærð skipananna frá L1 niður að enda bútsins er 20 bæti)
      		lea	di, L1
      	L1:	mov	cx, 10
      		mov	bx, di
      	L2:	mov	ax, [cs:di]
      		mov	[cs:di+100], ax
      		add	di, 2
      		loop	L2
      		add	di, 80
      		jmp	bx
         

  3. [Próf 2000] Útskýrið hvað eftirfarandi 8086-forritsbútur gerir. Inntakið er í BX og úttakið í AX.
    		xor	ax, ax
    		mov	cx, 16
    	lyk:	ror	bx, 1
    		rcl	ax, 1
    		loop	lyk
      

  4. [Próf 2000] Skrifið for-lykkjuna í eftirfarandi C++ fall með því að nota "inline" IA-32 smalamál í Visual C++. Ekki þarf að umrita haus fallsins, skilgreiningar, inntaksskipunina eða skilaskipunina.
    	double fall( ) {
    	    double x;
    	
    	    cin >> x; 
    	    for(int i=0; i<100 && x<100.0; i++)
    	        x = 1.3 * x;
    	
    	    return x;
    	} 
      

  5. Skrifið eftirfarandi forritsbút í IA-32 smalamáli með fleytitöluskipunum, þannig að kódinn gæti farið "inline" í C++ forrit. Gerið ráð fyrir að a og b séu skilgreindar double-breytur:
    	if ( a <= 10.0 )
    	    b = 5.0*a;
    	else
    	    b = b - a/2.0;
      

Skilið svörum og útprentunum í hólf Páls í VR-II fimmtudaginn 8. nóvember.

hh (hja) hi.is, 31. október, 2001.