X86 Feature detection in preparation for Long Mode
Documentation for this flag reads:


  If a software procedure can set and clear this flag, the processor executing the procedure supports the CPUID instruction


This clearly means that the flag does not have a defined value. It could be OFF or ON at any time!


Where your comment says that you "Toggle bit 21 (ID)", the instruction actually sets the bit. I don't think that would be too useful since you don't use the pre-existing value of this bit.
When you exclusive or XOR the registers AL and DL, you should prudently mask away the 7 remaining bits.


All the forementioned boils down to the fact that the final test (notice the typo in the comment; should be bit 5)

xor     al, dl          ; Bit 4 of AL &amp; DL is (ID)
jz      TstExt


will always check out fine.



Although your method to get a DS:BX pointer is quite ingenious, I prefer using [bp-2] as you can see in below code.

    mov     bp, sp
    pushfd
    mov     al, [bp-2]        ;Pre-existing value
    xor     byte [bp-2], ID   ;Toggle bit 21
    popfd
    pushfd
    mov     ah, [bp-2]        ;Hopefully changed value
    popfd
    and     ax, (ID&lt;&lt;8)+ID    ;Mask off unimportant bits
    cmp     al, ah
    jne     TstExt

FncErr:


I omitted preserving the ID bit as per definition this should not be necessary.




FncErr: mov di, (22*80+39)*2 ; Point to center position of 21th row in video



The address points to the 23rd row.




cmp     eax, edx   &lt;&lt;&lt; EDX=0x80000000
jb      FncErr



Are you sure the service can't report EAX=0x80000000 ?
Perhaps it could be better to bail out with:

jbe     FncErr


Now you're certain that leaf 0x80000001 exists.



Reaching leaf 0x80000001 through mov al, 1 will continue to work for as long as the manufacturer doesn't create some high numbered leafs (0x80000100 and up). You have to ask yourself how future-proof that you want your program to be!