Skocz do zawartości
Chell

[ASM] argumenty rutyn

Rekomendowane odpowiedzi

mam sobie kodzik:

ideal
p286n
model small
stack 256h

codeseg
    org 1h
    jmp start
    tekst db "1234567$"

proc pisz
     mov si, 6        ;counter do odejmowania indeksu litery zeby ladnie od przodu lecialy
     mov cx, 7        ;ile razy wykona sie petla, wielkosc stringa
         petla:
         mov al, [tekst+si]
         int 10h
         sub si, 1
         loop petla
     ret
endp

start:
     mov al, 02h;80x25 text
     int 10h

     mov bl, 40h;col
     mov ah, 09h;bede pisac
     call pisz
         
     mov ax, 4c00h
     int 21h
end start

 

dziala on pieknie, jednak chcialbym zeby rutyna pisz przyjmowala argumenty string i length, jednak nie mam pojecia jak temat tych argumentow ugryzc. moze sie skupmy na tym lengthu, bo latwiej - probowalem

proc pisz len:byte
    sub ch, ch
    mov cl, len
    mov si, cx
    sub si, 1

call pisz, offset 25

bezskutecznie, tasm nie chciał. probowałem przed callem pushować offset 25, bezskutecznie. próbowałem później popować ten offset wszędzie gdzie się da, bezskutecznie.

co z tymi argumentami?

 

edit: na chwile obecna zastapilem to macrem, jednak wciaz jestem ciekaw

edit2: jednak nie, bo mam tam petle

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Dawno nie używalem asm ale zobacz czy zadziała

proc pisz len:byte
    sub ch, ch
    mov cl, [len]
    mov si, cx
    sub si, 1

call pisz, 25

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

a pętli to się nie robiło w stylu (wybaczcie, 7 lat bez assemblera)

 

MOV AX,25
proc pisz
    sub ax, 1
   JNZ pisz
;dalsza czesc kodu

 

JNZ wykona się, gdy wynikiem ostatniej operacji nie było 0 (Jump No Zero).

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

tak, argumenty przekazuje sie do procedury przez stos. tylko pamietaj, ze wazna jest konwencja. najpopularniejsze: CDECL i STDCALL. roznia sie one tym, kto zajmuje sie sprzataniem stosu, ale obie wrzucaja na stos w kolejnosci od ostatneigo do pierwszego argumentu.

 

obczaj sobie te konwencje tu: https://en.wikipedia.org/wiki/X86_calling_conventions

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

robie co moge z tymi stosami, ale nie dziala nawet taki banal jak

format binary

        org 0x100
        jmp start
        utility db "jakis napis"

print:  pop cx

        mov ah, 0x02
        mov dx, 0x0000
        int 0x10

        mov ah, 0x09
        mov si, cx
        sub si, 1
                petla:
                mov al, [utility+si]
                int 0x10
                sub si, 1
                loop petla
        ret

start:  mov al, 0x02;80x25 text 16col
        int 0x10

        mov bl, 0x07
        push 11
        call print
        
        mov ax, 0x4c00
        int 0x21

zawsze wyswietla sobie to co ma, a pozniej losowe znaczki na 4 linijki, bez wzgledu na to co pushuje. chyba, ze tu gdzies powinny wkroczyc te calling conventiony? also, teraz kod z fasma

 

gnysek, to petla i to petla, jak teraz assemblery pozwalaja na takie myki to z nich korzystam

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A jak zamiast push i pop cx dasz

mov cx,11 ?

Ew zamiast loop daj

DEC CX, 1;

CMP CX, 0;

JG petla

 

Przyczyna: przy wywołaniu call na stos wrzucany jest adres powrotu

 

Rozwianie: zamiast pop użyj mov cx, [esp+2]

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×