Pomoc [asemlber]

0

Potrzebna pilna pomoc.

  • Czy ktoś może wyjaśnić w sposób wybitnie prosty, wręcz dziecinny do czego służy polecenie AAA w asemblerq? Prośba o dokładne napisanie, co i jak, z czym się je... I kiedy to się stosuje.
    -Mamy fragment programu:
    XOR AX, AX
    MOV AL, '6'
    ADD AL, '7'
    AAA;AX:=0103H
    OR AX, 3030H
    Pytania:
    a) Wyjaśnić działanioe owego programu;

XOR AX, AX (linia 1 zeruje AX)
MOV AL, '6' (przenosi do rejestru AL liczbę 36H)
ADD AL, '7' (dodaje do rejestru AL liczbę 37H)
AAA;AX:=0103H (???)
OR AX, 3030H (??)

b) Podaj zawartość AX po zakończeniu:
A=33H?
AX=3133H?
c) Zinterpretuj tę wartość:
??????????
d) Opisz działanie polecenia AAA.
AAA - poprawka ASCII po dodawaniu binarnym (ale co mi to ma mówić?)

  • Podaj polecenie lub polecenia które spowodują przeniesienie danej z rejestru BX do 25 komórki pamięci segmentu danych. Załóżyc, e procesor pracuje w trybie rzeczywistym i że adres bazowy segmentu w rejestrze DS jest dany.

Z góry serdeczni dziękuję!

0

Z manuala intela:

IF ((AL AND 0FH) > 9) or (AF = 1)
THEN
    AL ← AL + 6;
    AH ← AH + 1;
    AF ← 1;
    CF ← 1;
    AL ← AL AND 0FH;
ELSE
    AF ← 0;
    CF ← 0;
    AL ← AL AND 0FH;

teraz chyba jasne... co do programu zaś:

XOR AX, AX      ; ax = 0
MOV AL, '6'     ; al = 0x36; ax = 0x36
ADD AL, '7'     ; al = 0x6D; ax = 0x6D /* 0x36+0x37*/
AAA             ; al = 3; ah = 1; ax = 0x0103
OR AX, 3030H    ; al = 0x33; ah = 0x31; ax = 0x3133 

co do zawartości ax - w ah masz cyfrę w ASCII '1', w al zaś '3' czyli przy odpowiedniej interpretacji '13'... skąd się to wzięło? 6+7 to 13 :> Co do działania 'aaa' - dostosowuje sumę dwóch wartości BCD /które nie są spakowane/ aby stworzyć wynik w BCD czyli po ludzku - dziesiątki w ah, jedności w al; po dodaniu liczb al wynosiło 0x6d, następnie niejawny 'al and 0x0f' dało nam wynik 0x0d większy od 9; skoro większy niż 9 zwiększamy cyfrę dziesiątek /przechowywaną w ah; tutaj ah było 0, teraz jest 1/ i wyliczamy cyfrę jedności - dodajemy 6 i robimy and 0x0f/. Operacja sumy logicznej /or/ to konwersja z kodu BCD do ASCII /'0' to 0x30 więc jakaś cyfra or 0x30 daje cyfrę w ASCII/. Oczywiście przy operacjach na BCD nie trzeba stosować kodu ASCII, można załadować do rejestru 'zwykłą' liczbę binarną, 'aaa' da ten sam wynik co przy wspomnianym kodzie.

  • Podaj polecenie lub polecenia które spowodują przeniesienie danej z rejestru BX do 25 komórki pamięci segmentu danych. Załóżyc, e procesor pracuje w trybie rzeczywistym i że adres bazowy segmentu w rejestrze DS jest dany.

Cóż, BX na rozmiar 2 bajtów, a zwykle przyjmuje się, ze komórka pamięci ma rozmiar jednego bajtu... jeżeli całe bx to:

mov [ds:25], bx

jeżeli zaś 1 bajt /niższy/ to

mov [ds:25], bl

w sumie rejestru segmentowego podawać nie trzeba - ds jest segmentem domyślnym przy tego typu operacjach więc:

mov [25], bx

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