Thread View: pl.comp.lang.asm
8 messages
8 total messages
Started by Johnny
Wed, 31 May 2006 08:35
DW
Author: Johnny
Date: Wed, 31 May 2006 08:35
Date: Wed, 31 May 2006 08:35
66 lines
2595 bytes
2595 bytes
Zaczynam z asm i rozłożyłem się na ćwiczeniu z książki Irvina. Treść zadania jest trywialna: Utwórz program dodający trzy 16-bitowe wartości i zapisujący sumę w pamięci pod adresem 0206. Użyj następującej deklaracji danych w Debugu A 200 dw 0102,0304,0506,0 Problem polega na tym, że autor nie wprowadził pojęcia dw a już zadaje to w ćwiczeniu. Przygotowałem sobie skrypt dla debuga i otrzymałem wyniki: -a 200 0EFC:0200 dw 0102,0304,0506,0 0EFC:0208 int 20 0EFC:020A -r IP IP 0100 :200 -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0EFC ES=0EFC SS=0EFC CS=0EFC IP=0200 NV UP EI PL NZ NA PO NC 0EFC:0200 0201 ADD AL,[BX+DI] DS:0000=CD -t AX=00CD BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0EFC ES=0EFC SS=0EFC CS=0EFC IP=0202 NV UP EI NG NZ NA PO NC 0EFC:0202 0403 ADD AL,03 -t AX=00D0 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0EFC ES=0EFC SS=0EFC CS=0EFC IP=0204 NV UP EI NG NZ AC PO NC 0EFC:0204 06 PUSH ES -t AX=00D0 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000 DS=0EFC ES=0EFC SS=0EFC CS=0EFC IP=0205 NV UP EI NG NZ AC PO NC 0EFC:0205 050000 ADD AX,0000 -t AX=00D0 BX=0000 CX=0000 DX=0000 SP=FFEC BP=0000 SI=0000 DI=0000 DS=0EFC ES=0EFC SS=0EFC CS=0EFC IP=0208 NV UP EI PL NZ NA PO NC 0EFC:0208 CD20 INT 20 -g Program zakoäczony normalnie -q Nie rozumiem dlaczego po wykonaniu ADD AL,[BX+DI] rejestr AX ma wartość 00CD skoro BX i DI są zerowe. No i wydaje mi się, że autorowi chodziło o zsumowanie liczb 0102, 0304 i 0506 a to co zrobiłem rozmija się z tym celem. Proszę o pomoc w zrozumieniu tego zadania. -- Johnny
Re: DW
Author: Bernard
Date: Wed, 31 May 2006 09:16
Date: Wed, 31 May 2006 09:16
48 lines
2235 bytes
2235 bytes
Johnny wrote: > Zaczynam z asm i rozłożyłem się na ćwiczeniu z książki Irvina. Treść > zadania jest trywialna: Utwórz program dodający trzy 16-bitowe wartości > i zapisujący sumę w pamięci pod adresem 0206. Użyj następującej > deklaracji danych w Debugu > A 200 > dw 0102,0304,0506,0 > > Problem polega na tym, że autor nie wprowadził pojęcia dw a już zadaje > to w ćwiczeniu. Przygotowałem sobie skrypt dla debuga i otrzymałem wyniki: > -a 200 > > 0EFC:0200 dw 0102,0304,0506,0 > > 0EFC:0208 int 20 > > 0EFC:020A > > -r IP > > IP 0100 > :200 > > -r > > AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 > DS=0EFC ES=0EFC SS=0EFC CS=0EFC IP=0200 NV UP EI PL NZ NA PO NC > 0EFC:0200 0201 ADD AL,[BX+DI] DS:0000=CD > -t .... > Program zakoäczony normalnie > -q > > Nie rozumiem dlaczego po wykonaniu ADD AL,[BX+DI] rejestr AX ma wartość Najpierw zrozum, skąd wzięła się ta instrukcja - próbujesz "wykonać" dane spod adresu 0x200. Może spróbowałbyć napisać instrukcje i je wykonywać? > 00CD skoro BX i DI są zerowe. No i wydaje mi się, że autorowi chodziło o Dlatego, że adres 0 (będący sumą BX i DI) zawiera daną o wartości 0xCD. > zsumowanie liczb 0102, 0304 i 0506 a to co zrobiłem rozmija się z tym > celem. A gdzie Ty masz to sumowanie? Przecież nie napisałeś żadnej instrukcji, która sumowałaby Twoje dane.
Re: DW
Author: Wiktor S.
Date: Wed, 31 May 2006 09:34
Date: Wed, 31 May 2006 09:34
45 lines
2367 bytes
2367 bytes
> Zaczynam z asm i rozłożyłem się na ćwiczeniu z książki Irvina. Treść > zadania jest trywialna: Utwórz program dodający trzy 16-bitowe > wartości > i zapisujący sumę w pamięci pod adresem 0206. Użyj następującej > deklaracji danych w Debugu > A 200 > dw 0102,0304,0506,0 > Problem polega na tym, że autor nie wprowadził pojęcia dw a już zadaje > to w ćwiczeniu. Define Word. Umieszczasz dwubajtową wartość 102 pod adresem 200; 304 pod adresem 202 i 506 pod adresem 204, oraz 0 pod adresem 206. Liczby wyglądają na szesnastkowe. Słowem - definiujesz dane, które będziesz dodawał. Próba wykonania DANYCH da ci jakieś bzdury, których nie ma co roztrząsać. Program dodający dopiero powinieneś napisać. > Nie rozumiem dlaczego po wykonaniu ADD AL,[BX+DI] rejestr AX ma > wartość 00CD skoro BX i DI są zerowe. instrukcja "ADD AL,[BX+DI]" choć formalnie prawidłowa, powinna być czerwonym światłem, że prawdopodobnie wykonujesz jakieś śmieci. Szczególnie jeśli widzisz cały ciąg add al,[bx+di] add al,[bx+di] add al,[bx+di] itd., oznacza to, że widzisz nie program, ale same zera (instrukcja ta ma kod 00). > No i wydaje mi się, że autorowi > chodziło o zsumowanie liczb 0102, 0304 i 0506 a to co zrobiłem > rozmija się z tym celem. To co zrobiłeś, to "wykonałeś" liczby 0102, 0304, 0506, 0. :-) Trochę dziwi mnie, że naukę asemblera zaczyna się od obsługi debuga, ale cóż. -- Azarien
Re: DW
Author: Johnny
Date: Wed, 31 May 2006 09:38
Date: Wed, 31 May 2006 09:38
30 lines
1947 bytes
1947 bytes
Bernard napisał(a): > Najpierw zrozum, skąd wzięła się ta instrukcja - próbujesz "wykonać" > dane spod adresu 0x200. Może spróbowałbyć napisać instrukcje i je > wykonywać? > Dlatego, że adres 0 (będący sumą BX i DI) zawiera daną o wartości 0xCD. W zadaniu jest by umieścić to pod adresem 200. OK, nie zwróciłem uwagi na [] i stąd myślałem, że do al trafi suma bx i di. > >> zsumowanie liczb 0102, 0304 i 0506 a to co zrobiłem rozmija się z tym >> celem. > > A gdzie Ty masz to sumowanie? Przecież nie napisałeś żadnej instrukcji, > która sumowałaby Twoje dane. > No właśnie nie mam tego sumowania. Potrafię sobie zsumować takie liczby ale staram się zrozumieć dlaczego autor do wykonania sumy każe mi wpisać w debug: a 200 dw 0102,0304,0506,0 O co tu może chodzić? A może niepotrzebnie szukam drugiego dna i chodzi to o wykonanie instrukcji: ADD AL,[BX+DI]; ADD AL,03; PUSH ES; ADD AX,0000, którym odpowiadają poszczególne bajty? Ale po co wówczas to PUSH ES? -- Johnny
Re: DW
Author: Bernard
Date: Wed, 31 May 2006 11:15
Date: Wed, 31 May 2006 11:15
17 lines
1508 bytes
1508 bytes
Johnny wrote: > No właśnie nie mam tego sumowania. Potrafię sobie zsumować takie liczby > ale staram się zrozumieć dlaczego autor do wykonania sumy każe mi wpisać > w debug: > a 200 > dw 0102,0304,0506,0 Autor każe napisać liczby, kóre będziesz sumował. Potem trzeba napisać program, który je zsumuje, a o tym mało istotnym kroku zapomniałeś. ;) > O co tu może chodzić? A może niepotrzebnie szukam drugiego dna i chodzi > to o wykonanie instrukcji: ADD AL,[BX+DI]; ADD AL,03; PUSH ES; ADD > AX,0000, którym odpowiadają poszczególne bajty? Ale po co wówczas to > PUSH ES? Te instrukcje to śmieci, będące wynikiem interpretacji danych jako instrukcji.
Re: DW
Author: Johnny
Date: Wed, 31 May 2006 11:30
Date: Wed, 31 May 2006 11:30
22 lines
1751 bytes
1751 bytes
Bernard napisał(a): > Johnny wrote: >> No właśnie nie mam tego sumowania. Potrafię sobie zsumować takie liczby >> ale staram się zrozumieć dlaczego autor do wykonania sumy każe mi wpisać >> w debug: >> a 200 >> dw 0102,0304,0506,0 > > Autor każe napisać liczby, kóre będziesz sumował. Potem trzeba napisać > program, który je zsumuje, a o tym mało istotnym kroku zapomniałeś. ;) > >> O co tu może chodzić? A może niepotrzebnie szukam drugiego dna i chodzi >> to o wykonanie instrukcji: ADD AL,[BX+DI]; ADD AL,03; PUSH ES; ADD >> AX,0000, którym odpowiadają poszczególne bajty? Ale po co wówczas to >> PUSH ES? > > Te instrukcje to śmieci, będące wynikiem interpretacji danych jako > instrukcji. OK. Dzięki. -- Johnny
Re: DW
Author: Wiktor S.
Date: Wed, 31 May 2006 16:12
Date: Wed, 31 May 2006 16:12
23 lines
1508 bytes
1508 bytes
> No właśnie nie mam tego sumowania. Potrafię sobie zsumować takie > liczby ale staram się zrozumieć dlaczego autor do wykonania sumy każe > mi wpisać w debug: > a 200 > dw 0102,0304,0506,0 > > O co tu może chodzić? W powyższym chodzi o umieszczenie czterech podanych liczb pod adresem 200 (po 2 bajty na liczbę). program sumujący to będzie coś w stylu mov ax,[0200] add ax,[0202] add ax,[0204] mov [0206],ax składnia debuga może być inna, ale mniej więcej o to chodzi. Należy go umieścić _pod innym adresem_ niż dane (choćby od razu za nimi). -- Azarien
Re: DW
Author: Remek
Date: Fri, 02 Jun 2006 02:42
Date: Fri, 02 Jun 2006 02:42
29 lines
1586 bytes
1586 bytes
Witam nowego adepta w sztuce pisania w asemblerze! > -a 200 0EFC:0200 dw 0102,0304,0506,0 Powyższe wpisze Ci we wskazane miejsca pamięci dane. Następnie musisz wpisac instrukcje programu: xor ax,ax ;jeśli dodawanie chcesz wykonać w rejestrze ax mov bx,200 ;podajesz adres pierwszej zmiennej do bx mov ax,[bx] ;kopiujesz zmienną do ax mov bx,202 ;podajesz adres drugiej zmiennej do bx add ax,[bx] ;dodajesz do ax drugą zmienną mov bx,204 ;adres trzeciej zmiennej add ax,[bx] ;dodajesz do ax trzecią zmienną -r IP IP 0100 :200 ; wpisałeś do licznika instrukcji adres swojego programu -t Enter ;wykonujesz kolejne instrukcje -t Enter I tak dalej. Po wykonaniu wszystkich instrukcji w ax powinien być wynik. -- Remek
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads