Autor Wiadomość
eewkaa
PostWysłany: Nie 16:35, 25 Lis 2007    Temat postu:

Kilka osób prosiło o rozwiązanie zadań z klasówki.


Zadanie 2
Napisz procedurę, która dostaje przez stos 2 parametry (x,y,z) i wylicza wyraz (z-x)+5-y; wynik zwraca do zmiennej globalnej W.
Pokaż przykładowe wywołanie procedury.


Kod:
.MODEL small
.STACK 100h
.DATA
   W dw 0
   x dw 3
   y dw 4
   z dw 8
.CODE

procedura PROC NEAR         
   push bp               ;w tym momencie tworzymy ramke
   mov bp,sp            ;stosu wykorzystywana przez procedure
   
   ;dostep do elementu na szczycie stosu: [bp+4]
   ;dostep do kolejnych elementow: [bp+i], gdzie i = 6,8,...
   
   mov bx,[bp+4]         ;do bx przesuwamy z
   sub bx,[bp+8]         ;od bx odejmujemy x, wynik w bx
   add bx,5            ;do bx dodajemy 5, wynik w bx
   sub bx,[bp+6]         ;do bx odejmujemy y, wynik w bx
   
   mov W,bx            ;kopiujemy zawartosc bx do zmiennej globalnej W
   
   pop bp               ;niszczymy utworzona ramke stosu
   ret                  ;powracamy do programu glownego
procedura ENDP



start:
   mov ax,@data         ;ustawienie segmentu danych na
   mov ds,ax            ;dane naszego programu
   
   push x               ;ladujemy na stos kolejno:
   push y               ;x, y, z
   push z
   
   call procedura         ;wywolujemy nasza procedure
   
   pop z               ;zdejmujemy ze stosu wczesniej polozone dane
   pop y
   pop x

   mov ah,4ch            ;konczymy program
   int 21h

END start



Zadanie 3
Napisz program, który sumuje elementy tablic D1 i D2, a wyniki wpisuje do D2. Tablice D1 i D2 mają po 90 elementów.


Kod:
.MODEL small
.STACK 100h
.DATA   
      D1 db 90 dup (1)   ;tablica 90 elementow o wartosciach 1
      D2 db 90 dup (3)   ;tablica 90 elementow o wartosciach 3
.CODE
   mov ax,@data         ;ustawienie segmentu danych na
   mov ds,ax            ;dane naszego programu

   mov cx,90            ;inicjalizacja licznika, po kazdym przejsciu petli
                     ;licznik automatycznie jest zmniejszany o 1
   petla:
      mov si,cx      ;do rejestru indeksowego (si) przenosimy wartosc,
                      ;ktora obecnie znajduje sie w liczniku
      sub si,1         ;pomniejszamy ,si o 1, gdyz indeksy tablic numerowane sa od 0

      mov al,D1+si      ;wykonujemy dodawanie 2 elementow tablic D1 i D2, ktore znajduja sie pod tym
      add D2+si,al      ;samym indeksem, wynik zapisujemy do D2

   loop petla   
   
   mov ah,4ch            ;zakonczenie programu
   int 21h

END



Zadanie 3
Skopiuj pod adres fizyczny D1A53h zawartość pamięci o adresie logicznym AC12:C32Bh

Od razu zaznaczam, że nie mam pojęcia czy to zadanie jest poprawnie zrobione...


Kod:
mov bx,C32Bh
mov ax,AC12h
mov ds,ax

mov dx,[bx]

mov bx,3
mov ax,D1A5h
mov ds,ax

mov [bx],dx
fala (aka tomek)
PostWysłany: Pią 1:26, 16 Lis 2007    Temat postu:


Cytat:
procedura PROC NEAR

nagłówek procedury, near chyba oznacza ze procedura i wywolanie znajduje sie w tym samym segmencie kodu (cokolwiek by to nie znaczylo Razz bo sam nie wiem co to dokladnie znaczy, w zrodlach takie cos widzialem Razz)


Cytat:
push bp <<< o to

nic co mogłoby być niezrozumiałe po prostu: wrzuca bp na stos
(akurat w procedurach parametry sa przekazywane przez rejestry, dlatego aby przekazac parametr do funkcji trzeba zachowac wykorzystywane w niej rejestry na stosie, a przed wyjsciem z procedury przywrocic ich zawartosc pobierajac je spowrotem ze stosu "pop bp" (zeby mozna bylo te rejestry wykorzystac i nie stracic ich wartosci po zakonczeniu procedury


Cytat:
mov bp,sp <<< i to

jak dla mnie to kopiuje zawartosc sp do bp Razz tyle tylko ze to jest chyba kwestia tego w jaki sposob mozna adresowac a w jaki nie... 'sp' to jest StackPointer, wlasnie przegladam wyklady pani TurboDebagier i tam coś było odnośnite adresowania, i chyba nie można bezpośrednio przez 'sp' robic adresowania, dlatego skopiowany zostal do 'bp' ktory juz mozna wykorzystac do tego celu (tak mi sie wydaje)


(to tak na mój rozum, ale zastrzegam że moge sie mylić co do prawidłowości mojego rozumowania)
denciaq
PostWysłany: Czw 21:52, 15 Lis 2007    Temat postu:

ktos wie po co to jest ???
procedura PROC NEAR
push bp <<< o to
mov bp,sp <<< i to
czart
PostWysłany: Czw 18:17, 15 Lis 2007    Temat postu:

Faktycznie sie walnalem z tym 0Bh;

smurf Farmer: zadna instrukcja, po prostu napisałem jak to rozwiązywałem krok po kroku. Może ktoś skorzysta na tym.
chodor
PostWysłany: Czw 17:31, 15 Lis 2007    Temat postu:

to np robilismy na laborkach z asemblera zadanie 2 :

.model small
.stack 100h
.data
wynik dw 0
x dw 4
y dw 1
z dw 2

.code
procedura PROC NEAR
push bp
mov bp,sp

mov bx,[bp+8]
sub bx,[bp+6]
add bx,[bp+4]

mov wynik,bx
pop bp
ret
procedura ENDP
start:
mov ax,@data
mov ds,ax
push x
push y
push z
call procedura
pop x
pop y
pop z


mov ah,4ch
int 21h
END start
dziemian_rec
PostWysłany: Czw 17:17, 15 Lis 2007    Temat postu:

ale kombinujecie :/
1) mov al, 0bh
---> 0bh do al (młodszy bajt wyniku)
2) push 1234h
pop dx
---> 12h do dh
3) mov bl,dh
--->12h do bl
4) mov ah,bl
---> 0bh do ah (starszy bajt wyniku)

1. instrukcja wogóle nie potrzebna Very Happy
Linka
PostWysłany: Czw 17:10, 15 Lis 2007    Temat postu:

własnie tez tak myslałam... Smile

Chodor, Ty chyba masz zrobioną tą klasówke:)
jak mozesz to wes zapodaj;)
chodor
PostWysłany: Czw 17:00, 15 Lis 2007    Temat postu:

jest jeden błąd bo 0B to 11 dziesietnie a binarnie 0000 1011 i wtedy
i wtedy ax= 0001 0010 0000 1011
czart
PostWysłany: Śro 22:50, 14 Lis 2007    Temat postu:

NIE WIEM CZY DOBRZE, JAK KTOŚ MA NIECH RZUCI WYNIK DLA PORÓWNANIA.

zad1.

MOV BX, 101011101B
MOV AL,0BH

BX = 00000001|01011101
0B = 16(dziesietny) = 00010000(binarnie)

PUSH 1234H
POP DX

1234H:
4=0100
3=0011
2=0010
1=0001

stąd:
DX=00010010|00110100

MOV BL,DH

BL = 00010010

MOV AH,BL

AH = 00010010

stąd

AX = AH|AL = 00010010|00010000
boro
PostWysłany: Śro 22:10, 14 Lis 2007    Temat postu:

szczerze mowiac to nic nie mam. mam okropne opory jesli chodzi o nauke asemblera :/ na piatek nie przygotowuje sie. pisze program na ASD na poniedzialek wiec zbytnio nie mam czasu zeby od podstaw uczyc sie z asm.
Linka
PostWysłany: Śro 21:19, 14 Lis 2007    Temat postu:

Boro... moze masz cos takiego juz?SmileVery Happy podziel sie;) 3ba sobie pomagac:D
boro
PostWysłany: Śro 21:05, 14 Lis 2007    Temat postu:

mozesz przeciez napisac program ktory bedzie liczyl zadanka :P masz tam kompilator ktory wylapie bledy wiec bedziesz miala wieksza pewnosc ze masz dobrze niz gdybys rozwiazywala zadanie na kartce.
Linka
PostWysłany: Śro 20:56, 14 Lis 2007    Temat postu:

z tego co wiem to klasowka ma byc na kartce Boro;)
boro
PostWysłany: Śro 20:51, 14 Lis 2007    Temat postu:

jak wyswietla prawidlowy wynik to znaczy ze masz dobrze :P
Linka
PostWysłany: Śro 20:22, 14 Lis 2007    Temat postu: Asembler - Klasowka

ma ktos moze dobrze rozwiazaną tą klasowke prof turbodebagier?

..bo niby skad mam wiedziec czy robie dobrze...
Wink

Powered by phpBB © 2001, 2005 phpBB Group