Contributor: MAYNARD PHILBROOK { Updated MISC.SWG on May 26, 1995 } { To let every one know that mite have had some bad experience with Assembler using the Basm I have found a Major bug in TP 6.0 and still exist in TP 7.0 ! with the BASM you are allowed to use @Data, @Code ect.. Well i found out this ! if you do this asm mov Ax, Word ptr @Data; end; which isn't really the correct way to use it but was the only way i could think at the time i was pounding in the code because my fall fledged assemblers let me do this since it knows how to handle it properly an produce the correct code.. Well in the BASM it also lets you do this with no complaint from the compiler !, Well guess what? after examining the code with Debug i found two things. one is that line of code that did that never got generate in the finale EXE, the compiler just though it was ok to leave out the whole line? Secondly i did this in a UNIT and when any call in side this unit made any call to another function or procedure in the same unit it would generate a Near call which is fine because that is what tp does for optimizing but guess what?, the address reference it makes is so far out of range it produces a QEMM error over here but if a call is made to this same function or procedure from the Main modual the correct address is generated because it uses the Far call to do so.. Example } Unit Test; Interface procedure one; procedure two; implementation procedure one; begin asm mov ax, Word Ptr @Data; End; End; procedure two; begin one; { call number one } Writeln(' hello, Testing '); End; End. { When examining this with Debug i found that pro Two did this Push CS; Call Near One; But mind you the address here Was not pointing to "ONE", but pointing to some far out of site locations to garbage code.. < ------ Main Modual ----> } Uses Test; Begin One; Two; End; { Now in this one when view with Debug the One & Two Calls are correct in its addresses, but the calls with in the UNIT to another neighboring block of code is optimized to a Near and the wrong address is generated to does not point to anything that comforms.. Now after aprox. four hours testing and Debug i found this.. Change the Line where i had the Mov AX, Word Ptr @Data to Mov Ax, Seg @Data and all is ok, this line does finally end up in the EXE and the Near call Addressing with in the same UNit also now works. Now keep in mind TP does not generate an Compiler error to halt the compiling process of any type.!!!!!!!!!! no matter what the switches are set but rather it des to corrupt the enviroment of TO while it is compiling.. I relized that using the @data as i did is not the intended way to use the this compiler directive for the BASM but since i am use to do ing this in a Fall blown assembler and it knows what i want and generates same results i am looking i just expect that TP would give me a Syntax error of some kind, so lets say it don't, then way is it messing up the compiler for Near calls then ?, shouldn't be doing that! I also know about anther Bug in Basm i found way back.. You can not perform a direct Absolute COnstant Far call Address. Call $FFFF:0000; for example will not generate what you want but will point you to some area of the Data segment!. Even if use a const it will also generate the same results... P.S. These serious errors in the compiler still exist in the TP 7.0 and the BP 7.0 protect mode... -------------------------------- From: Dj Murdoch > asm > mov Ax, Word ptr @Data; > end; This might be related to another bug in TP/BP 7: 56. In BASM, "dw @variable" will not assemble properly. BP and BPC abort, while TURBO and TPC give a wrong answer. -------------------------------- From: John Stephenson > mov Ax, Word ptr @Data; > which isn't really the correct way to use it Thats right! Use it with SEG, look up @data in the online help and see that it says thats the only way to use it.. > generates same results i am looking i just expect that TP would give > me a Syntax error of some kind Well, I bet C would hang on something like that after compiling it, due to the lose type checking.. > You can not perform a direct Absolute COnstant Far call Address. > Call $FFFF:0000; for example will not generate what you want but > will point you to some area of the Data segment!. (ouch) That is a "small" bug, but, maybe you can't call up a absolute memory call in assembler. On another note, I don't know if this is a bug or not, but it doesn't work: } Procedure T(var thing: word); assembler; var value: word; asm mov value, 1h mov word ptr thing, value end; { So you need to use this: } Procedure T(var thing: word); assembler; var value: word; asm mov value, 1h; les di, thing; mov ax, value; stosw; end; { So that prompts me to ask "What is word ptr for then?" }