Address of labels (MSVC)
The only way of doing this in MSVC is by using inline assembly (which basically buggers you for x64):
int _tmain(int argc, _TCHAR* argv[])
{
case_1:
void* p;
__asm{ mov [p],offset case_1 }
printf("0x%p\n",p);
return 0;
}
If you plan on doing something like this, then the best way would be to write the whole interpreter in assembly then link that in to the main binary via the linker (this is what LuaJIT did, and it is the main reason the VM is so blindingly fast, when its not running JIT'ed code that is).
LuaJIT is open-source, so you might pick up some tips from it if you go that route. Alternatively you might want to look into the source of forth (whose creator developed the principle you're trying to use), if there is an MSVC build you can see how they accomplished it, else you're stuck with GCC (which isn't a bad thing, it works on all major platforms).
labels as values in clang
The examples you build should work, I've just verified it using Apple LLVM version 7.0.2 (clang-700.1.81)
.
The mentioned bug reports seem to report this very same issue, until it's fixed, you can't do anything aside from trying to not use the extension.
While GNU C
has some great extensions, if you want to write portable c code, try to avoid using any GNU C
extension.
Borland x86 inlined assembler; get a label's address?
Last time I tried to make some assembly code Borland-compatible I came across the limitation that you can't forward-reference labels. Not sure if that's what you're running into here.
MSVC Warning Number for -Wunused-label
-Wunused-label
is C4102 in visual studio
how to set labels in inline assembly?
Use offset variableName
to access variables from inline assembly. See reference here.
Example:
char format[] = "%s %s\n";
char hello[] = "Hello";
char world[] = "world";
int main( void )
{
__asm
{
mov eax, offset world
push eax
mov eax, offset hello
push eax
mov eax, offset format
push eax
call printf
//clean up the stack so that main can exit cleanly
//use the unused register ebx to do the cleanup
pop ebx
pop ebx
pop ebx
}
}
Get linear address of FS:[0] in 32-bit protected mode / MSVC inline asm
Assuming FS points to the Windows Thread Information Block (TIB), also known as the Thread Environment Block (TEB), you get the linear address of the TIB by reading the 32-bit value at fs:[0x18]
. The best way to do this in Visual C++ is to use the __readfsdword
intrinsic:
TEB *teb = (TEB *) __readfsdword(0x18);
How can I find all of the labels for a particular TFS project sub-folder?
In Visual Studio, in the Source Control Explorer window, right-click the sub-folder for which you want to list the relevant labels and pick View History from the context menu. In the History window that should appear, there should be a sub-tab Labels (as highlighted below) that lists labels applied to that sub-folder (but not specific items in that sub-folder).
Related Topics
Macro/Keyword Which Can Be Used to Print Out Method Name
Is Is a Good Practice to Put the Definition of C++ Classes into the Header File
Checking If Two Cubic BéZier Curves Intersect
Converting Between C++ Std::Vector and C Array Without Copying
Safely Override C++ Virtual Functions
C++ How to Allocate Memory Dynamically on Stack
Why Is Std::Vector::Operator[] 5 to 10 Times Faster Than Std::Vector::At()
Why "Universal References" Have the Same Syntax as Rvalue References
How Does =Delete on Destructor Prevent Stack Allocation
What Use Are Const Pointers (As Opposed to Pointers to Const Objects)
Exception Running Boost Asio Ssl Example
What's the Difference Between Span and Array_View in the Gsl Library
Glpixelstorei(Gl_Unpack_Alignment, 1) Disadvantages
C++11 Type Trait to Differentiate Between Enum Class and Regular Enum
Serialize and Send a Data Structure Using Boost
Deterministic Builds Under Windows
How to Force Inclusion of an Object File in a Static Library When Linking into Executable