Assembler, funkcja call

0

Miałem takie zadanie na kolokwium:

Jaka (heksadecymalnie) wartość znajdzie się w rejestrze AX w wyniku wykonania poniższych instrukcji?

 mov ax, 5
 call e1
 sub ax,7
 jmp e2
 e1: call e3
 e3: add ax,1
 ret
 add ax,3
 e2: printReg ax
 return0

Rozumiem mniej więcej co robi funkcja call, ale nie rozumiem co się dzieje w lini
e1: call e3
Poprawnym wynikiem, przynajmniej taki jaki nam podano jest 0 (decymalnie), mi wychodziło ciągle -1 (decymalnie)
Jest mi ktoś w stanie wytłumaczyć na szybko co się w takim przypadku dzieje? kiedy po funkcji call nie ma żadnych instrukcji ?
Dzięki z góry za pomoc.

1

zapisz sobie jak będzie wyglądał stos i rejestr AX po każdym kroku to się nie pomylisz

0

Ale ja właśnie nie wiem co się dzieje po tej instrukcji, wsensie co wleci na stos po tej lini
e1: call e3
że po prostu nic ?

1

Call wrzuca na stos adres kolejnej instrukcji wiec e3 wykona sie 2 razy a wiec wynik bedzie 0. Bo masz eax 5 potem add 1 add 1 i wracamy retem do sub 7 potem skaczesz do printowania

1
krypi23 napisał(a):

Ale ja właśnie nie wiem co się dzieje po tej instrukcji, wsensie co wleci na stos po tej lini
e1: call e3
że po prostu nic ?

call to jak wywołanie procedury, po tej instrukcji procesor "zapamiętuje" sobie na stosie, w które miejsce ma wrócić po napotkaniu instrukcji ret - tym call różni się od instrukcji jmp, która po prostu powoduje skok.
Będzie to wyglądać tak:

kod | stos | AX
---------------- | -------------------
mov ax,5 | | 5
call e1 | e1 | 5
call e3 | e1,e3 | 5
add ax,1 | e1,e3 | 6
ret | e1 | 6
add ax,1 | e1 | 7
ret | | 7
sub ax,7| | 0
jmp e2 | | 0

1

Stos "rośnie" w kierunku mniejszych adresów tj [adr5][adr4][adr3]... itd więc

 mov ax, 5 ;adr1
 call e1 ;adr2
 sub ax,7 ;adr3
 jmp e2 ;adr4
 e1: call e3 ;adr5
 e3: add ax,1 ;adr6
 ret ;adr7
 add ax,3 ;adr8
 e2: printReg ax ;adr9
 return0 ;adr10

I teraz tak działanie programu:

mov ax, 5 ; ax = 5
call e1 ; esp -> [adr3]
call e3  ; esp -> [adr6] [adr3]
e3: add ax,1 ; esp -> [adr6] [adr3] ;ax =6
ret ; esp -> [adr3] 
e3: add ax,1 ; esp ->[adr3];ax=7
ret ; esp -> [] - stos "pusty"
sub ax,7 ; ax=0
..
 

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