🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.asm
8 messages
8 total messages Started by Johnny Wed, 31 May 2006 08:35
DW
#293
Author: Johnny
Date: Wed, 31 May 2006 08:35
66 lines
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
#294
Author: Bernard
Date: Wed, 31 May 2006 09:16
48 lines
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
#299
Author: Wiktor S.
Date: Wed, 31 May 2006 09:34
45 lines
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
#295
Author: Johnny
Date: Wed, 31 May 2006 09:38
30 lines
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
#296
Author: Bernard
Date: Wed, 31 May 2006 11:15
17 lines
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
#297
Author: Johnny
Date: Wed, 31 May 2006 11:30
22 lines
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
#298
Author: Wiktor S.
Date: Wed, 31 May 2006 16:12
23 lines
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
#300
Author: Remek
Date: Fri, 02 Jun 2006 02:42
29 lines
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