Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

ASM x86 Gdzie się kopiuje wartość komendą MOV [SI], AX

pan_kotek 24 Sty 2018 15:33 417 7
  • #1 24 Sty 2018 15:33
    pan_kotek
    Poziom 20  

    Witam

    zaczynam "przygodę" z programem emu8086, mam taki prosty kawałek kodu w asm x86,
    Program startuje od adresu 1000h, nie wiem czemu, ale tak jest

    mov ax, 0ABCDh; wpisz do Ax liczbę ABCD
    mov [si], ax ; załadu aku do komórki wskazywanej przez SI (SI mam cały czas 0000h)
    mov dx, [si] ; załaduj do rej dx, wartość wskazywaną przesz SI (działa, bo mam ABCD w rej DX

    No dobra działa, ale nie wiem gdzie ( w której komórce) jest zapisywana liczba AX
    jak dam DS =0h to ABCD mam w komórkach 0000h
    jak dam DS=1h to ABCD mam w komórkach 0010h (+16)
    ...a jak dam DS 1000h...to dane gdzieś znikają, tylko gdzie.

    0 7
  • #2 24 Sty 2018 15:48
    Dżyszla
    Poziom 42  

    Zapis w nawiasach kwadratowych oznacza adres podany w rejestrze, nie rejestr. A ściślej - przesunięcie wg segmentu danych (DS).
    Oczywiście segmenty są ograniczone wielkością i przekroczenie spowoduje po prostu pisanie po pamięci w najlepszym przypadku.

    To, skąd startuje program, bezpośrednio zależy od tego, jakie segmenty potworzył i ewentualnie jak zostały mu przydzielone adresy przez system.

    0
  • #3 24 Sty 2018 15:55
    JacekCz
    Poziom 36  

    Kilka wyjaśnień

    pewien jesteś, że program staruje od 1000h, a może od 100h?
    Program wykonywlany wtedy mógł mieć dwie formy, plik COM (generalnie prosty format pliku) zawsze startujący od offsetu 100h (sto hex), i plik EXE , tzw "relokowalny", adres startowy wskazany gdzieś w programie.

    Procesor tej epoki (w tym trybie) pracował w trybie tzw segmentów, DS jest segmentem dla olbrzymiej większości operacji z danymi, do tego offset. Wikipedia dobrze wyjaśnia.
    czyli
    mox [si],ax się czyta tak jakby
    mov ds:[si].0 , ax

    Zabawa z DS nie jest tym, z czym na tym etapie powinieneś się bawić. Dla małych programów DS przyjmujesz że jest jakiś (określiło go ładowanie programu), ale (w jakimś sensie) nie powinno to obchodzić w początkowych programach.

    jest kilka niejednoznaczności w Twoim pytaniu, jakiego producenta assembler używasz (sens będzie ten sam, ale zapisu nieco inne), z czego uzyskujesz wnioski o pamięci (z jakiego debuggera)

    0
  • #4 24 Sty 2018 20:32
    pan_kotek
    Poziom 20  

    emu8086 to taki emulator z asemblerem, debugerem, wyświetlaniem stanu wyjść i wejść itp.
    Prawdopodobnie jest to Flat Assembler v 1.64 by Tomasz Grysztar
    ASM x86 Gdzie się kopiuje wartość komendą MOV [SI], AXASM x86 Gdzie się kopiuje wartość komendą MOV [SI], AX


    Jeśli załaduje do DS 0h to ABCD mam wrzucone pod 0000h
    jeśli do DS 101h to ABCD mam w 1010h

    może to kwestia samego programu

    0
  • #5 24 Sty 2018 20:37
    JacekCz
    Poziom 36  

    pan_kotek napisał:


    Jeśli załaduje do DS 0h to ABCD mam wrzucone pod 0000h
    jeśli do DS 101h to ABCD mam w 1010h

    może to kwestia samego programu


    Czytałeś o rejestrach 8086?
    https://pl.wikipedia.org/wiki/Intel_8086
    Dokładnie rejestr segmentowy jest mnożony przez 16.

    0
  • #6 24 Sty 2018 20:47
    pan_kotek
    Poziom 20  

    no już chyba kumam, ale na razie wolno mi to idzie 101h razy 10h czyli 16 dec daje mi ten adres 1010h

    0
  • #7 25 Sty 2018 09:30
    JacekCz
    Poziom 36  

    pan_kotek napisał:
    no już chyba kumam, ale na razie wolno mi to idzie 101h razy 10h czyli 16 dec daje mi ten adres 1010h


    Tak.
    Uważam bardziej powinieneś protestować nie segment a offset, różne tryby, zmianę SI, dodanie stałej itd...
    Ten fragment zabawy DS jest zupełnie nieżyciowy, nie przesuwa się DS a zwłaszcza o tak mało. Owszem (rzadko) ustawia się "jakiś" pozyskany z "wyższej instancji" np alokatora systemowego - po czym przywraca. Zbyt wiele ważnych struktur danych zależy od DS. Po twoim przesunięciu DS każdy realny większy program jest martwy.

    Dodam, zapasowym segmentem danych jest ES, właśnie po to jest, aby DS żył sobie w spokoju.

    0
  • #8 25 Sty 2018 12:45
    kinggustav
    Poziom 20  

    Najkrócej: adres fizyczny=segment*16 (przesunięcie w lewo o 4 bity albo 1 cyfrę hex)+offset. Tam się zapisało i twoje obserwacje się z tym zgadzają.
    Rejestru segmentowego DS można używać (czasami wręcz trzeba), ale zwykle ważna jest jego wartość, więc trzeba ją zapamiętać i potem odtworzyć. Do takiej zabawy nie ma to większego znaczenia.[/s]

    0