Dlaczego w kodzie jest "MOV AH, 9"

0

mam pytanie - TYLKO JEDNO - ale mam nadzieję, że odpowiedź dostanę z sensem i zrozumiale

nie to, że się uczę asemblera - ale nigdzie nie widzę DLACZEGO za pomocą mov przenoszona jest jakaś liczba -

pytanie jest takie dlaczego TA liczba, A NIE inna ?

podam zrzut z książki

image
w pierwszej linii przenoszone jest 9 - dlaczego 9, a nie np 10 lub 25 ?

4

int 21h robi różne rzeczy w zależności od tego, co jest w rejestrze AH, patrz tabela w http://spike.scu.edu.au/~barry/interrupts.html.

0

czyli trzeba mieć tabelę przerwań ?

0

Tak, ustawianie parametrów w rejestrze odpowiada tu przesyłaniu argumentów funkcji w językach wyższego poziomu

0

więc to chyba będzie dobre ? -> https://www.ctyme.com/rbrown.htm

4

Zależy jakiego używasz asma, systemu i architektury. Po to powstały języki takie jak C by się nie przejmować takimi szczegółami.

2

W dzisiejszych czasach, gdy kompilatory dokonują cudów, by zoptymalizować kod pod daną architekturę pisanie w czystym asmie poza wartością edukacyjną przeważnie mija się z celem.

0

to wiem ale nie wiedziałem, że są różne tabele przerwań dla innych asm :/

3

Czemu czytasz książkę z przerwaniami o DOS'ie?

Adekwatny przykład współczesny będzie wyglądał tak na x64 linuxa:

[bits 64]
section .text

mov rdx, len ; length
mov rsi, text ; char*
mov rdi, 1 ; stdout
mov rax, 1 ; write
syscall

mov rdi, 0
mov rax, 60 ; exit
syscall

section .data
text db 'Dupa', 0xa, 0
len equ $-text

Tłumaczenie na język C:

#include <unistd.h>
#define STRLEN(str) sizeof(str)

const char text[] = "Dupa\n";
write(1, text, STRLEN(text))
exit(0);

1:1 Assembler na C.

4
zkubinski napisał(a):

to wiem ale nie wiedziałem, że są różne tabele przerwań dla innych asm :/

Bo zależy o jakim systemie i architekturze traktuje tekst jaki czytasz. Jak chcesz zanurzać się w te słynne assembly to warto przynajmniej podjąć próbę zrozumienia jak działa w podstawowych założeniach procesor, w szczególności ten na którym zamierzasz programować. Te wszystkie mnemoniki - czyli MOV, INT, JMP i inne takie to (mniej więcej) podstawowe operacje jakie procesor wykonuje i pod nie buduje się właśnie procesor. Każda architektura procesora ma własne zbiory podstawowych poleceń jakie może wykonać. Część z nich jest obecna w wielu architekturach. Część jest wyjątkowa tylko dla niektórych i nieobecna w innych.

Co do przerwań to tutaj tema zahacza o to jak CPU korzysta z pamięci. Wektor przerwań to najczęściej ciąg sąsiadujących ze sobą komórek pamieci o wielkości słowa maszynowego w którym zapisane są adresy funkcji, do których procesor "skoczy" w razie wywołania przerwania przez program (przerwania softwarowe) lub sprzęt (przerwania hardwerowe). By adresy te w pamięci się pojawiły musi je tam coś zapisać. Część z tych adresów ustawiane jest przez BIOS, inne ustawia jądro systemu operacyjnego.

Jak BIOS "to robi", że zapisuje coś w pamieci? BIOS rezyduje typowo w kości pamięci flash która jest tak wmontowana w płytę główną, że jest częścią pamięci i zajmuje pewną przestrzeń z puli całej pamięci komputera z jaką może prowadzić interakcję procesor. Procesor zaraz po włączeniu zasilania by wiedzieć co ma robić musi pobrać z pamięci z odórnie zdefiniowanej przez producenta pozycji w pamięci zależnie od architektury albo jakiś rozkaz albo adres pamięci pod który ma skoczyć aby natrafić na kod (rozkazy) do wykonania. Ta odgórnie zdefiniowana pozycja pod którą CPU zagląda jako pierwszą może być całkiem "od czapy" jak np. 0x8000 albo 0x0000 - co może oznaczać pozycję na początku, końcu czy gdzieś w środku obszaru pamięci. Przy czym początek i koniec to sprawy umowne, bo na jednych platformach początek może być rozumiany jako adres 0x0000 (wtedy następny adres w pamięci to 0x0001) na innych jako adres 0xFFFF (wtedy następny adres w pamięci to 0xFFFE). Mogą też być inne przypadki organizacji pamięci. Wiele zależy od nastroju tego kto daną architekturę projektował i ile zioła wypalił w czasie pracy czy ile znaczków LSD włożył pod język.

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