Wpisywanie bezpośrednio do tablicy w asm.

Wpisywanie bezpośrednio do tablicy w asm.
grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
0

Cześć,

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

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

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

Kopiuj
 
    push tab+esi
    push fmt
    call _scanf

ale już tak mogę:

Kopiuj
 
    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

Shalom
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Space: the final frontier
  • Postów: 26433
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.

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.