Wstawka asm do czystego asm

0

mam se kodzik wstawki asm ale jak go przerobić aby był w czystym asm i wywoływany w kodzie czystego C?

void print(char far* s){
asm{
push es
push di
mov di,word ptr [s]
mov ax,word ptr [s+2]
mov es,ax
mov bx,0007h
mov ah,0eh
}
loop:
asm{
mov al,byte ptr es:[di]
test al,al
jz end
int 10h
inc di
jmp loop
}
end:
asm{
pop di
pop es
}
}

// Sorki, że poprawiam, ale to dopisane far* uniezależnia cie od modelu pamieci. [mf]

0

Takich kombinacji jeszcze nie widzialem :)

print:

      push bp
      mov bp, sp

      push es 
      push di
      push bx
      mov bx, [bp+4]  ;jezeli to wywolanie typu near, dla far trzeba +6
      mov   di,word ptr [bx]
      mov   ax,word ptr [bx+2]
      pop bx

      mov   es,ax
      mov   bx,0007h
      mov   ah,0eh
loop:
      mov   al,byte ptr es:[di]
      test al,al
      jz    end
      int   10h
      inc   di
      jmp   loop
end:
      pop   di
      pop   es
      pop  bp
      ret  ;to dla wywolania cdecl stosowanego w C, dla pascal, nalezaloby napisac ret 2, aby usunieto od razu parametry ze stosu
0

tylko jest 1 problem bo to ma być funkcja _printf jako całość i jak przejdzie z części print do loop? może przejdzie ale nie czaje :(

0

albo:

_print  PROC FAR    ; lub NEAR
      push bp
      mov bp, sp

      push es 
      push di
      push bx
      mov bx, [bp+4]  ;jezeli to wywolanie typu near, dla far trzeba +6
      mov   di,word ptr [bx]    
      mov   ax,word ptr [bx+2] 
      pop bx

      mov   es,ax
      mov   bx,0007h
      mov   ah,0eh
loop:
      mov   al,byte ptr es:[di]
      test al,al
      jz    end
      int   10h
      inc   di
      jmp   loop
end:
      pop   di
      pop   es
      pop  bp
      ret
_print ENDP

Podkreslenia, gdy masz ustawione w opcjach 'generate undelines' (standardowo). Trzeba tylko ustawić, zeby assemblacja byla case sentensive (chyba).

Potem tasm plik.asm

w pliku cpp deklaracja funckji wygląda nast.:

extern cdecl far print(char far* s); // lub extern cdecl near , jesli _print proc bylo near

ze wzgledu na 'mov ax,word ptr [bx+2]' i dalej 'mov es,ax' musi byc far*.

Do projektu dodajesz jeszcze plik.obj i to juz koniec.

print/loop/end, to nie są części tylko etykiety. Nie zajmują miejsca w programie wynikowym, tylko są wskazowka dla assemblera, coby wiedzial jak ustawic skoki (akurat w kodzie call, jmp, j... warunkowe, loop itepe). Takie znaczniki adresow potrzebne tylko do procesu kompilacji... Działanie:

      mov   ah,0eh
loop:
      mov   al,byte ptr es:[di]

... po wykonaniu mov ah,0eh wykona sie nastepnie mov al, byte... tak jakby tej etykiety nie bylo. Bo w zasadzie ich nie ma w wynikowym programie :]

// Dryo to mało widziałes, bo cały clib tak jest zrobiony.
// btw. czy to przez przypadek nie ja pisalem ta prockę w c ? :d

// Ale w sumie ... jesli mozesz pisac wszystko jako funkcje c z
// wstawkami asma, to rob tak, bedzie latwiej... Inaczej niczego poza
// dodatkowymi plikami nie zyskasz, efekt będzie ten sam

0

Fakt. Zapomnialem, ze dla C trzeba porzedzac "_". Jedyna konieczna modyfikacja.

// Dryo to mało widziałes, bo cały clib tak jest zrobiony.
// btw. czy to przez przypadek nie ja pisalem ta prockę w c ? :d

Staram sie omijac takie brzydkie kody :P

// Ale w sumie ... jesli mozesz pisac wszystko jako funkcje c z
// wstawkami asma, to rob tak, bedzie latwiej... Inaczej niczego poza
// dodatkowymi plikami nie zyskasz, efekt będzie ten sam

Nie tak calkiem. Kompilator przed wejsciem i po wyjsciu z bloku asm{} przygotowuje (a przynajmniej powinien) kod, dodajac zapamietywanie odpowiednich zmiennych itp. Gdyby cala funkcja byla w asm (poza naglowkiem) to nie byloby problemow, ale te numery z deklarowaniem etykiet poza blokami to troszke dziwnie. Byc moze, poniewaz tylko etykiety sa poza asm, to nic dodatkowo kompilator nie dorzuci, ale takie deklaracje poza dla mnie sa okropnie brzydkie.

0

Tak ale to niestety standard... asm (przynajmniej w c dosowym borlanda) nie przyjmuje standardowych etykiet np.

asm{
label1:
mov ax,01h
@label2:
int ...
}

za nic nie pójdzie. (W pascalu owszem, z @ bez daklaracji labela nawet, ale nie w c)

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