Okay... but if the "Original Nobody" explicitly wanted to use Borland tools... I believe they use OMF rather than msCOFF, so you'd want "nasm -f obj ...". Nasm's "-f obj" defaults to 16 bit code, so we'd need to ask for 32 bit code (assuming this is 32-bit bcc???)...
section .text use32
"-f obj" doesn't know the special name ".text". There *may* be advantages to using the same name the Borland tools use, which I think is "CODE" or "_CODE"... or "_TEXT"(???). Probably use "tdump" or some such to see what names Borland's using(?). It may also help to add "class=CODE" to the section declaration. I'm not sure matching names (and/or case) is necessary... can't hurt. Whatever works.
Another possible "gotcha" is that C++ will "decorate" (mutilate) function names in external modules. If you've got, in your C(++) file, "myasmfunc(foo, bar);", prototype it as:
extern "C" myasmfunc (int foo, int bar);
(or the correct syntax) to keep it from happening. You'll still need the underscore. Won't be an issue with this example...
We don't touch ebx, esi, edi, ebp in this example, but if we'd altered their values, we'd need to restore the original values before returning. C functions will preserve those registers for us - but *will* trash ecx and edx, return value is in eax - and it expects the same...
Assuming you've got Borland C++ installed, you should be able to just:
nasm -f obj helloworld.asm
bcc helloworld.obj
(with "use32" added!), "or whatever you usually type". If you *haven't* got Borland tools installed - and know how to use 'em - Polink or Golink or gcc/ld from Mingw, or whatever M$ is giving away would be a better bet. That Borland stuff is getting pretty "obsolete" by now... not that there's anything wrong with "obsolete"...
Best,
Frank