Czy program, który napisałem jest poprawny? Proszę o wszelkie wskazówki.

0

Witam. Męczę się od kilku dni z jednym programem, który muszę napisać/zrozumieć w asembly. Zaznaczyć muszę, że asm nie jest językiem programowania, który do mnie przemawia. Każda pomoc będzie dla mnie bardzo cenna, a wydaje mi się, że samo zadanie dla osoby obeznanej w temacie asm'a nie będzie stanowić większego problemu.
W załączniku znajdują się trzy pytania, mi zależy tylko na pytaniu 3.
Napisałem coś takiego:

IN AX,56h
MOV BX,AX
MOV DS,[A0h]
MOV AX, DS:[24h]
CMP AX,BX
JG wieksza
wieksza: MOV AX,BX

Z góry będę wdzięczny za wszelką pomoc :]

3

Prawie.

  1. MOV DS,[A0h] to nie jest poprawne bo [A0h] to odczytanie wartości z pamięci o takim adresie a ty chcesz ustawić wartość ds na taki adres.
JG wieksza
wieksza: MOV AX,BX

To jest bez sensu. Jak warunek jest spełniony to skaczesz do etykiety a jak nie jest to... przechodzisz do etykiety bo przeciez idziesz instrukcja po instrukcji... Musisz zrobić etykietę ZA przypisaniem i jeśli przypisania ma nie być to do niej skaczesz.

2

.. pobierana jest dana z rejestru sterownika urządzenia

in ax, 56h

.. i porównywana z zawartoscią komówki pamięci znajdującej sie w segmencie danych (offset 24h)
segment danych na 8086 jest przy operacjach na pamięci wybierany domyślnie, więc nie musimy go pisać ( "głupi" assembler może wygenerować nawet większy o jeden bajt kod, bo doda prefix 0x3e, z tego co pamiętam ze specyfikacji 8086 będzie to nadal poprawne kodowanie)

 cmp ax, word [0x24h]

adres początku segmentu to 0xa0
ty wstawiasz do segmentu wartość z [ds:0xa0], trzeba to zrobić tak

 mov ds, 0xa0 

więc finalnie kod będzie wyglądał tak

in ax, 0x56
mov ds, 0xa0
cmp ax, [0x24h] ; w ax mamy wartość z urządzenia, porównujemy z czymś z pamięci
jb mniejsza ; jeśli jest większa, to pierwsza ma zostać w ax (ale pierwsza czyli ta z urządzenia już w ax jest, wiec koniec)
jmp koniec
mniejsza: ; mniejsza
mov ax, [0x24h] ; zapisz drugą liczbe

0

Dziękuję Panowie za szybkie odpowiedzi :]
Ze skokiem do tej etykiety to rzeczywiście gafa z mojej strony, że tego nie zauważyłem. Mam jednak jeszcze dwa pytania.

  1. Mam rozumieć, że jeżeli ustawiam adres segmentu danych przez mov ds, 0xA0H, to wówczas wszelkie odwołania przez nawiasy np. [0x12] czy też [0x24h] będzie mówić asemblerowi skocz na offset w to miejsce pamięci i pobierz jej wartość, coś na rodzaj wyłuskania wskaźnika, z tym, że w tym przypadku wartość w ds determinuje wyliczenie miejsca w pamięci.
  2. Z tego co kojarzę, a sam za późno zauważyłem, to

Nie można do rejestru segmentowego bezpośrednio wpisać jakieś wartości

; czyli nie można 
mov ds, 0 
; ale można
mov bx, 0
mov ds, bx

Rozumiem, że w tym wypadku również nie ma od tego odstępstwa i też należy najpierw ten adres zapisać w osobnym rejestrze, by później móc go przypisać do ds?

in ax, 56h
mov bx, 0xa0h
mov ds, bx
cmp ax, [24h]
; itd.
1

Ah. Faktycznie, zapomniałem, tak. Musisz zrobić tak jak napisałeś wyżej.
Poza tym, jest oke. Dobrze że w ogóle wrzuciłeś jakiś swój kod, a nie jak niektórzy, co frajerów tu szukają :P
jakbyś nie pamiętał jak sie liczy offset to
fizyczna_komorka_pamieci = (segment * 16) + offset;
BTW. Czy w pierwszym zadaniu gosciu wam podał zawartość rejestru?
Bo jeśli nie, to skąd macie wiedzieć jaki będzie wynik? :D
Nie chce mi sie teraz grzebać w manualach, ale być może gosciu zakładał że 8086 zeruje rejestry przy starcie (nie wiem czy tak jest) jeśli nie, to zadanie pierwsze nie ma rozwiazania.

0
Proxima napisał(a):

Ah. Faktycznie, zapomniałem, tak. Musisz zrobić tak jak napisałeś wyżej.
Poza tym, jest oke. Dobrze że w ogóle wrzuciłeś jakiś swój kod, a nie jak niektórzy, co frajerów tu szukają :P
jakbyś nie pamiętał jak sie liczy offset to
fizyczna_komorka_pamieci = (segment * 16) + offset;
BTW. Czy w pierwszym zadaniu gosciu wam podał zawartość rejestru?
Bo jeśli nie, to skąd macie wiedzieć jaki będzie wynik? :D
Nie chce mi sie teraz grzebać w manualach, ale być może gosciu zakładał że 8086 zeruje rejestry przy starcie (nie wiem czy tak jest) jeśli nie, to zadanie pierwsze nie ma rozwiazania.

No to super. Jakoś mniej więcej już zaczynam coś rozumieć z tego asm'a, chociaż to i tak "nie moja bajka" :(
Jeżeli chodzi o to pierwsze zadanie, to tam jest XOR, więc w konsekwencji wartość w AX wyjdzie na 0
Tak poza tym, to wiem jak to jest być po tej drugiej stronie pomagającego z dziedziny programowania, więc nie byłbym na tyle bezczelny, żeby samemu szukać frajera ;]
Jeszcze raz bardzo dziękuję za pomoc. Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1