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