и LABEL ссылается на адрес в пределах от -128 до +127 байт, BASM 
использует более эффективную 2-байтовую инструкцию перехода. Если же адресная 
метка не вписывается в это ограничение, тогда BASM воспользуется менее 
эффективной 3-байтовой инструкцией jmp. 
    Вы можете отменить оптимизацию, предварив метку ключевыми словами NEAR PTR 
или FAR PTR. Например, для задания дальнего перехода к ближней метке вы можете 
написать следующее: 

    asm jmp FAR PTR LABEL 


    Доступ к переменным 

    В операторах asm можно ссылаться по имени на локальные, глобальные и 
регистровые переменные. Можно также непосредственно ссылаться на параметры 
функций. Конечно, может потребоваться использование спецификаторов WORD PTR и 
BYTE PTR для загрузки 16- и 8-битовых значений в регистры. Для целочисленной 
переменной или параметра count инструкция 

    asm mov ax, count 

эквивалентна следующей: 

    asm mov ax, WORD PTR count 

    Для пересылки первого байта count в байтовый регистр следует использовать 
такой спецификатор: 

    asm mov al, BYTE PTR count 

    Можно использовать аналогичный спецификатор DWORD PTR вместе с инструкцией 
LES и косвенными дальними вызовами для загрузки 32-битовых указателей, т.е. 
значений типа "double word" (двойное слово). 
    Можно также пользоваться в операторах asm регистрами si и di без 
конфликтов с регистровыми переменными. Если в операторе asm используются 
регистры si или di, компилятор не запоминает переменные в этих регистрах. 

    Доступ к членам структуры 

    Встраиваемые операторы asm могут ссылаться на члены структур по имени. 
Однако следует быть осторожным и различать, когда инструкциям необходимо 
значение, а когда адрес (относительное смещение члена структуры). 
    Предположим, вы объявили структуру TPoint с двумя целочисленными членами х 
и у. С помощью typedef (необязательно в C++, но полезно в ANSI С) вы можете 
объявить структуру следующим образом: 

    typedef struct point { 
    int x; 
    int у; } TPoint; 

    Затем можно объявить глобальную или локальную переменную с именем cursor 
типа TPoint: 

    TPoint cursor; 

    В операторах С и C++ выражения cursor.x и cursor.y ссылаются на члены 
переменной cursor. В операторах asm можно пользоваться аналогичными 
выражениями. Например, можно запомнить в регистре ах значение члена у 
переменной cursor следующим образом: 

    asm mov ax,  WORD PTR cursor.y // Запомнить значение у в ах 

    Для ссылки на адресное смещение относительно первого байта структуры 
следует воспользоваться клпчевым словом OFFSET: 

    asm mov bx, OFFSET cursor.y  // Запомнить смещение у в Ьх 

    Можно также адресовать структуру регистрами. Например, можно запомнить в 
паре регистров ds:di адрес структуры cursor и запомнить значение у в регистре ах 
следующим образом: 

    asm {
      mov di, OFFSET cursor	// Запомнить местоположение cursor в di 
      mov ax, [di].y                           // Запомнить значение члена у в ах 
    }

    Регистр ds уже ссылается на глобальный сегмент данных программы. В 
инициализации нуждается только di. Компилятор  распознает у как член структуры 
cursor типа TPoint. Конечно, могут возникнуть конфликты, если в еще одвой 
структуре будет объявлен член с именем у. Вы можете решить эту проблему, 
указав явным образом перед членом имя структуры в круглых скобках: 

asm {
    mov di, OFFSET cursor    // Запомнить местоположение cursor в di 
    mov ax, [di].(TPoint)y        // Указать,   какая структура имеется в виду 
}    

    Глава 17. Оптимизация с помощью ассемблера	447 
