mam takie czysto teoretyczne pytanie dotyczące asemblera i kompilatora NASM. Mianowicie chciałbym się zapytać czym różni się jeden kod od drugiego. Tylko proszę nie pisać, że niczym jako, że tak pozornie jest ;p Z tego co rozumiem to do rejestru ax wpisujemy kod zwracający poprawną wartość do systemu DOS, aby program mógł zostać poprawnie zakończony. I co do drugiego to nie jestem pewien. Do ax wpisujemy 0h więc zgaduję, że adres 0h będzie równoznaczny z adresem ah? Tylko też czemu wpisujemy do rejestru ah wartość 4ch zamiast 4c00h?
Bo ah by całości nie pomieścił. AX składa się z dwóch rejestrów - al i ah. Chociaż w pierwszym przypadku wrzucasz całe polecenie do ax, w środku rozkłada się równomiernie po obu podrejestrach (czy jak to się tam zwało) - al i ah.
Już niezbyt dobrze pamiętam zabawy z asemblerem, ale prawdopodobnie wrzucenie 0h do ax jest niejawnym przeniesieniem go do al, więc oba zapisy naprawdę są równoważne.
Chodzi o załadowanie oddzielnie starszego i młodszego bajtu do ax
4c jest najbardziej znaczącym bajtem,bo to on decyduje głównie o wartości liczby,00 jest najmniej znaczącym,
chodzi o wysoki bajt rejestru akumulatora,ah-acumulator high i niski bajt al-acumulator low,16 bitowy rejestr ax rozbija się na ah i al - też “bawiłem się” assemblerem
Możliwe,że kiedyś oddzielnie rozkazy zabierały mniej cykli w pierwszych procesorach - szybsze wykonanie i zgodność z pierwszymi Intelami 8 bit.
Podobnie jest z rozkazem xor na zerowanie rejestru
xor ax,ax to to samo co mov ax,0.
xor wykonywało się szybciej,w obecnych procesorach już nie koniecznie tak musi być,ale przyzwyczajenie kodujących w języku maszynowym zostało.
jednak zeruje cały rejestr AX, a nie tylko jego dolną połówkę. Prawdopodobnie mogło chodzić o zapis
mov al,0h
albo o inną kolejność rozkazów
mov ax,0h
mov ah,4ch
Wtedy pierwszy rozkaz zeruje cały AX (AH i AL), a drugi wypełnia AH liczbą 4ch - wtedy taki kod jest równoważny pierwszemu przykładowi (z mov ax,4c00h).
xor ax,ax do zerowania rejestru był i myślę że nadal jest szybszą wersją, poza tym nie zabiera miejsca na zakodowanie liczby 0 (dwubajtowej).
Podsumowując: mov ax,1234h wpisuje 12h do ah oraz 34h do al.
Tak właściwie to nie jest żadna dyrektywa tylko normalne instrukcje.
int 21h to instrukcja wywołania przerwania programowego nr 21h, pod które podpięta jest procedura DOSu, odpowiadająca za obsługę funkcji systemowych.
DOS wymaga aby, przy wywoływaniu jego funkcji, w odpowiednich rejestrach znajdowały się odpowiednie informacje, jednak nie obchodzi go jak się one tam znalazły.
Polecam
oraz [http://www.youtube.com/playlist?list=PL7CA8FE35B665D4DD.](http://www.youtube.com/playlist?list=PL7CA8FE35B665D4DD.) Uważam, że łatwiej programować na względnie nowoczesny system z płaską pamięcią zamiast bawić się pod DOSem pamięcią segmentowaną :wink: