В сборке Turbo C имена переменных представляют свои адреса. Так что если вы делаете
mov ax, R
вы загружаете адрес R (то есть &R
) в топор. Но если вы попробуете:
mov al, R
вы получаете ошибку, потому что адреса имеют ширину 16 бит, а регистр al
- только 8 бит.
Если вы напишите:
mov al, [R]
, что эквивалентно:
mov al, byte ptr [R]
затем вы загружаете байт, на который указывает R
, в регистр al
.
(Значение byte ptr
автоматически выводится из размера известного операнда, в данном случае al
).
Но обратите внимание, что ассемблер ничего не знает о типах ваших переменных, так что вы один на этом. Например, в вашем коде R
- это целое число (16 бит), но последняя строка загружает только один байт. Поскольку вы используете машину с прямым порядком байтов, вы получаете наименее значимый байт, который эквивалентен приведению к типу char, вероятно, к тому, что вы хотите.
Конечно, если вам нужно полное значение R, просто напишите:
mov ax, [R]
, что эквивалентно:
mov ax, word ptr [R]