Portablity is not usually considering only raw iron but also operating system. The content of those registers can be filled somehow and the results must go somewhere.
There is standard C programs of very simple nature, but still they must be compiled according to operating system. Interpreters are themselves big programs that need to be installed in the operating system to offer programming language and access to underlying operating system.
If you have calculation routine in 80x86 of course it is possible to utilize that routine from different operating systems and programming languages, but that is library routine and not connected closely for portability issue.
C (and maybe C++) are considered very portable. For example, one of secrets of success, and wide availability to different computers, of Linux is relying much only C coding with minimal assembly language.
C and C++ are considered to be very portable but compiler differences can be significant. A language like perl or J is probably much more portable in practice for a wide range of programs across different OSs.
There are different degrees of portability. Probably the best you can hope for in terms of portability is a language that either runs on a virtual machine (then your code is as portable as there are virtual machines for different computers) or in an interpreter (ditto, for interpreters) and even then if you try to do hardware or OS specific things, it won't work. Examples:
portable: a Java program that has two integer variables declared statically at compile time, with values A and B, and the program computers the average and puts the answer in a third variable declared at compile time initialized to 0.
not portable: a program written in assembly language that controls a robotic arm and hand and saves the data in a parallel file system across a distributed network of heterogeneous hosts. Oh and it does some vector processing on the side.