Wpisywanie bezpośrednio do tablicy w asm.

0

Cześć,

czy może mi ktoś wyjaśnić dlaczego funkcja 'wstaw' tak działa prawidłowo:

 
wstaw:
    push prosba
    call _printf
    
    push temp
    push fmt
    call _scanf
    
    mov ebx, dword[temp]
    mov [tab+esi], ebx 
    
    add esp, 12
    
    add esi, 4
    dec edi
    cmp edi, -1
    jne wstaw    
    ret

... a tak już nie:

wstaw:
    push prosba
    call _printf
    
    push dword[tab+esi] ; Prawidłowo powinien tutaj być wskaźnik. Napisałem o tym niżej. Niestety tylko tak się kompiluje.
    push fmt
    call _scanf
    
    add esp, 12
    
    add esi, 4
    dec edi
    cmp edi, -1
    jne wstaw    
    ret

Pytanie zasadniczo dotyczy tego czemu nie mogę wrzucić sobie bezpośrednio na stos elementu tablicy i tam wpisywać do niego wartość jak do zwykłej zmiennej tylko muszę robić to przez temp?

Niestety nie mogę zrobić tak:

 
    push tab+esi
    push fmt
    call _scanf

ale już tak mogę:

 
    push tab+4
    push fmt
    call _scanf

Chodzi też o pytanie dlaczego nie mogę przekazać na stos wskaźnika przesuniętego o rejestr, w którym jest przesunięcie, a mogę przekazać wskaźnik przesunięty o stałą.

Tutaj jest cały kod: http://4programmers.net/Pastebin/4167

0

Kwestia składni, rejestrów i zaszłości historycznych. Rejestry nie są identyczne, albo przynajmniej kiedyś nie były. Jednego można użyć do pewnych celów innego nie. Wynikało to z realizacji sprzętowych które sprawiały że dany rejestr wykonywał niektóre operacje szybciej albo wolniej.
Na przykład robiąc przesunięcia bitowe możesz w niektórych asemblerach zrobić o 1 albo o cx. Żaden inny rejestr nie zadziała. Analogicznie możesz często robić operacje na pamięci na zasadzie tablica+bx ale już z innymi rejestrami to nie zadziała.

0

Muszę się temu przyjrzeć. Niestety ecx jest modyfikowany przy przekazywaniu argumentów do funkcji i trzeba go pchać jako temp do ogólnie nieużywanych rejestrów takich jak np edi czy esi żeby później po callu zrobić mov ecx, reg. Nie wiem czy nie szkoda zachodu.

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