[ASM] Dyrektywa kończąca program


(Stgajewski) #1

Witam,

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?

Byłbym wdzięczny za wyjaśnienie.

mov ax,4c00h

int 21h

mov ah,4ch

mov ax,0h

int 21h

(Frankfurterium) #2

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.


(Johny) #3

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 :slight_smile:

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.


(Pablo_Wawa) #4

Z tego, co się orientuję, to zapis

mov ax,0h

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.


(Rolek0) #5

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: